Crea una transcripción de tus reuniones de negocios con Documentos de Google & Aprendizaje automático

1. Descripción general

En este codelab, aprenderás a enviar un archivo de audio con la API de Google Cloud Speech to Text y, luego, enviar la transcripción a un documento de Google. La API de Speech-to-Text es fácil de usar y aplica potentes redes neuronales para permitir que los desarrolladores conviertan el audio en texto. Además, cuenta con la tecnología del aprendizaje automático.

Usarás la API de Documentos de Google para crear un documento nuevo y escribir en él. Crearás una aplicación de línea de comandos de Java y ejecutarás tu código con el sistema de compilación Gradle. Luego, usarás la API de Documentos para ver los resultados.

Qué aprenderás

  • Cómo usar la API de Google Cloud Speech to Text
  • Cómo usar la API de Documentos de Google para crear un documento nuevo
  • Cómo usar la API de Documentos para escribir en un documento

Requisitos

  • Java instalado (versión 7 o superior)
  • Gradle instalado (versión 5 o posterior)
  • Acceso a Internet y un navegador web
  • Una Cuenta de Google
  • Un proyecto de Google Cloud

2. Configura tu proyecto

Crea tu proyecto en la nube

  1. Accede a la consola de Cloud y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o Workspace, debes crear una.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID.

  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar los recursos de Google Cloud recursos.

Ejecutar este codelab no debería costar mucho, tal vez nada. Asegúrate de seguir las instrucciones de la sección “Realiza una limpieza” en la que se aconseja cómo cerrar recursos para no incurrir en facturación más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Obtén una clave de cuenta de servicio para la API de Cloud Speech-to-Text

60f112dedc208681.png

  1. Dirígete a GCP Console y encuentra tu proyecto nuevo.
  2. Crea una cuenta de servicio
  3. Descarga una clave de cuenta de servicio como JSON
  4. Configura la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la ruta de acceso al archivo JSON que contiene la clave de tu cuenta de servicio. Si reinicias la sesión de shell, deberás configurar la variable nuevamente.
$ export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

Por ejemplo:

$ export GOOGLE_APPLICATION_CREDENTIALS="/home/usr/downloads/ServiceAccount.json"

Obtén credenciales para la API de Documentos

  1. De regreso en la consola de GCP, ve a Credenciales.
  2. Crea una clave de OAuth 2.0 y descárgala como JSON
  3. Cambia el nombre del archivo credentials.json y asegúrate de que esté en el directorio src/main/resources/ de tu código.

Habilita las APIs

3066cf79c136a078.png

  1. Selecciona la pestaña Dashboard, haz clic en el botón Enable APIs and Services y habilita las siguientes 2 APIs:
  2. Voz a texto
  3. Documentos de Google

846ba54aa7e1e584.png

Ya está todo listo para continuar y comenzar a trabajar con tu código.

3. Configura tu código

Obtén el código de muestra

Para obtener el código de muestra, descarga el archivo ZIP en tu computadora...

...o clonar el repositorio de GitHub desde la línea de comandos.

$ git clone git@github.com:googleworkspace/docs-transcript-codelab.git

Trabajarás en el archivo CreateTranscript.java dentro del directorio start. No se deben modificar los archivos de Gradle.

En tu directorio, navega a la carpeta start y abre el archivo CreateTranscribe.java. Desplázate hacia abajo hasta donde veas la declaración de la clase CreateTranscript.

public class CreateTranscript {
  private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
  
  // Specify audio file name below.
  private static final String AUDIO_FILENAME = "audioFile.wav";
  private static final String TOKENS_DIRECTORY_PATH = "tokens";
  private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
  private static final String APPLICATION_NAME = "CreateTranscript";
  private static final List<String> SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS);

Para la variable SCOPES, especificaste que tu código podrá ver y administrar los documentos de Documentos de Google de tus usuarios. Si tu código requiere autorización mayor o diferente a este acceso, asegúrate de ajustar esta variable según corresponda según los alcances de la API de Google en OAuth 2.0.

Por ejemplo, si no estuvieras escribiendo en un documento de Google, podrías cambiar el alcance a DOCUMENTS_READONLY. La variable SCOPES es necesaria no solo para que tu app tenga los permisos de acceso adecuados, sino también para mantener la transparencia con los usuarios. El usuario verá los permisos específicos que solicitas en la página de verificación de OAuth, donde debe dar su consentimiento para usar la app.

Cambia el nombre de las variables

Asegúrate de que las variables anteriores estén declaradas correctamente para tu proyecto.

  1. Asegúrate de que AUDIO_FILENAME esté configurado con el nombre del archivo de demostración que enviarás a la API de Speech-to-Text. En el archivo CreateTranscript.java, deberías ver que ya está configurado correctamente.
  2. Cambia el nombre de CREDENTIALS_FILE_PATH por el nombre del archivo de credenciales descargado (debe ser "/credentials.json'). Asegúrate de que este archivo esté dentro del directorio src/main/resources de tu carpeta, así que asegúrate de crear este directorio si la clonación de GitHub no lo hace por ti.

Ahora puedes comenzar a ejecutar el código.

4. Inicializa un cliente de Documentos

En el archivo CreateTranscript.java, busca la declaración del método principal y observa lo que contiene:

final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY,
    getCredentials(HTTP_TRANSPORT))
          .setApplicationName(APPLICATION_NAME)
          .build();

Autorización de la función

La primera tarea que realizarás aquí es la creación de Docs service (variable). El servicio representa a un cliente autorizado de API que contiene tus credenciales y, en este caso, tu autenticación de usuario final.

En tu código, cualquier función que realice una llamada a la API de Documentos deberá usar esta variable service para realizar tareas relacionadas con Documentos.

5. Cómo crear un documento de Google

Crearás un nuevo documento de Google con un título específico. Copiemos el siguiente código en la función createDocument.

Document doc = new Document().setTitle("Transcript for " +
    AUDIO_FILENAME);
doc = service.documents().create(doc).execute();
String documentId = doc.getDocumentId();
return documentId;

Esta función muestra el ID del archivo de Drive del documento de Google. Este mismo ID se puede encontrar en la URL del documento.

A continuación, inicializarás el cliente de Speech-to-Text.

6. Llama a la API de Speech-to-Text

La siguiente tarea que quieres realizar en tu código es obtener la transcripción escrita para el archivo de audio. Dentro de CreateTranscript.java, busca la función getTranscript().

Primero, obtén la ruta de acceso y los bytes de audio del archivo de audio:

SpeechClient speech = SpeechClient.create();
Path path = Paths.get(AUDIO_FILENAME);
byte[] data = Files.readAllBytes(path);
ByteString audioBytes = ByteString.copyFrom(data);

Configurar el reconocimiento de voz

A continuación, debes inicializar de manera correcta la variable RecognitionConfig.

Aquí, config brinda información sobre la manera exacta en que el reconocedor de voz debe procesar tu solicitud. Por ejemplo, deberás editar setLanguageCode() si tu archivo de audio está en un idioma que no sea inglés y cambiar setSampleRateHertz() si tiene una tasa de muestreo diferente en hercios (1600 es óptimo).

RecognitionConfig config =
    RecognitionConfig.newBuilder()
        .setEncoding(AudioEncoding.LINEAR16)
        .setLanguageCode("en-US")
        .setSampleRateHertz(8000)
        .build();
RecognitionAudio audio =
    RecognitionAudio.newBuilder().setContent(audioBytes).build();
RecognizeResponse response = speech.recognize(config, audio);
List<SpeechRecognitionResult> results = response.getResultsList();

Cómo preparar el texto

Por último, controla la variable result de transcripción del archivo de audio y prepárala para insertarla en un documento.

Cada elemento de los resultados es una transcripción del tipo SpeechRecognitionAlternatives. Por lo tanto, cada elemento contiene dos partes: una transcripción de texto y la puntuación de confianza correspondiente de la API.

List<Request> requests = new ArrayList<>();
for (SpeechRecognitionResult result : results) {
     // Using the first + most likely alternative transcript
     SpeechRecognitionAlternative alternative =
         result.getAlternativesList().get(0);
     String toInsert = alternative.getTranscript();

     // Add requests array list to return.
     requests.add(
         new Request()
             .setInsertText(
                 new InsertTextRequest()
                     .setText(toInsert)
                     .setEndOfSegmentLocation(new
     EndOfSegmentLocation().setSegmentId(""))));
}
return requests;

7. Cómo insertar texto en un documento

Ahora insertarás el texto de la transcripción en el Documento de Google. Para realizar modificaciones en un documento, deberás usar el método BatchUpdate. BatchUpdate es un contenedor para diferentes tipos de solicitudes de escritura. Aquí, usarás InsertTextRequest.

EndOfSegmentLocation es un parámetro importante que especifica en qué parte del documento deseas imprimir el texto. En el código fuente, insertas texto en el cuerpo del documento.

Insertemos el siguiente código en tu función para ver cómo los resultados de la API de Speech-to-Text, junto con las llamadas a la API de Documentos, pueden permitirnos insertar la transcripción de un archivo de audio en un documento de Google:

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest();
service.documents().batchUpdate(docId,
    body.setRequests(insertRequests)).execute();

Crea la solicitud

Cuando realizas la solicitud de BatchUpdate, estableces dos especificaciones muy importantes: lo que deseas imprimir (.setText()) y el lugar del documento en el que te gustaría hacerlo (.setIndex(1)).

Ya insertaste la transcripción del archivo de audio en el documento que creaste.

8. Ejecuta el código

Ahora que tienes todo el código que necesitas para tomar un archivo de audio, obtener su transcripción e imprimir su transcripción en un documento de Google recién creado, ¡empecemos este programa!

Dado que ejecutarás tu código Java con el sistema de compilación de Gradle, deberás indicarle a tu archivo build.gradle exactamente qué compilar y ejecutar. En este y en otros proyectos, asegúrate de mantener la coherencia de mainClassName con la clase de Java que deseas ejecutar.

¡Genial! Ya tienes todo listo para ejecutar el código. Para ello, escribe lo siguiente en la línea de comandos:

$ gradle run

Autenticación del usuario final

La primera vez que ejecutes este código, verás una URL impresa en la terminal que te pedirá que inicies sesión en tu cuenta de servicio y autorices el acceso a sus Documentos de Google. Después de permitir el acceso, verás un nuevo archivo almacenado en tu directorio.

Dentro del directorio de trabajo, verás una carpeta recién creada llamada tokens, que contiene un archivo StoredCredential. Este es el token de autenticación que acabas de proporcionar, que tu cliente solicitó al servidor de autenticación de Google, extrajo su respuesta y lo enviará a cualquier API a la que llames.

Solución

Si, como resultado, tu código no funciona, observa el archivo CreateTranscript.java en la carpeta CreateTranscript.java. Este archivo incluye todo el código tal como debe ser para ejecutarse correctamente.

Ahora, veamos el resultado.

9. Visualiza los resultados

Acabas de crear un nuevo documento de Google que contiene la transcripción de tu archivo de audio, así que echemos un vistazo.

Este documento se creó a través de la cuenta con la que el usuario final proporcionó la autorización. Una posible expansión es que este Documento se puede compartir automáticamente con otras personas mediante la API de Drive.

Con el código fuente y el archivo de audio proporcionado, deberías ver lo siguiente:

ee73fcdd1dbcdcff.png

10. ¡Felicitaciones!

Aprendiste a crear un documento de Google, realizar una llamada a la API de Speech-to-Text y exportar la transcripción de tu archivo de audio a tu documento creado.

Posibles mejoras

Estas son algunas ideas para lograr una integración más atractiva:

  • Configura tu código para que escuche cuando se agregue un archivo de audio a tu unidad de bucket de Google Cloud Storage y activa una Google Cloud Function para ejecutar este código
  • Juega con la inserción de texto en un Documento de Google que no esté vacío

Más información