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
- 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.
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
.
- 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
- Dirígete a GCP Console y encuentra tu proyecto nuevo.
- Crea una cuenta de servicio
- Descarga una clave de cuenta de servicio como JSON
- 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
- De regreso en la consola de GCP, ve a Credenciales.
- Crea una clave de OAuth 2.0 y descárgala como JSON
- Cambia el nombre del archivo
credentials.json
y asegúrate de que esté en el directoriosrc/main/resources/
de tu código.
Habilita las APIs
- Selecciona la pestaña Dashboard, haz clic en el botón Enable APIs and Services y habilita las siguientes 2 APIs:
- Voz a texto
- Documentos de Google
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.
- 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.
- 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 directoriosrc/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:
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
- Lee la documentación para desarrolladores de la API de Documentos de Google.
- Publica preguntas y encuentra respuestas en Stack Overflow con la etiqueta google-docs-api