Creación de solicitudes de Speech-to-Text

Este documento es una guía sobre los aspectos básicos del uso de Speech-to-Text. En esta guía conceptual se describen los tipos de solicitudes que puedes enviar a Speech-to-Text, cómo crearlas y cómo gestionar sus respuestas. Recomendamos que todos los usuarios de Speech-to-Text lean esta guía y uno de los tutoriales asociados antes de empezar a usar la API.

Pruébalo

Si es la primera vez que utilizas Google Cloud, crea una cuenta para evaluar el rendimiento de Speech-to-Text en situaciones reales. Los nuevos clientes también reciben 300 USD en crédito gratuito para ejecutar, probar y desplegar cargas de trabajo.

Probar Speech-to-Text gratis

Solicitudes de voz

Speech-to-Text cuenta con tres métodos principales para realizar el reconocimiento de voz. Son los siguientes:

  • Reconocimiento síncrono: (REST y gRPC) envía datos de audio a la API Speech-to-Text, reconoce esos datos y devuelve los resultados una vez que se ha procesado todo el audio. Las solicitudes de reconocimiento síncronas se limitan a datos de audio de 1 minuto o menos.

  • El reconocimiento asíncrono (REST y gRPC) envía datos de audio a la API Speech-to-Text e inicia una operación de larga duración. Con esta operación, puedes sondear periódicamente los resultados del reconocimiento. Usa solicitudes asíncronas para datos de audio de cualquier duración de hasta 480 minutos.

  • Streaming Recognition (solo gRPC) realiza el reconocimiento de los datos de audio proporcionados en un flujo bidireccional de gRPC. Las solicitudes de streaming están diseñadas para el reconocimiento en tiempo real, como la captura de audio en directo desde un micrófono. El reconocimiento de streaming proporciona resultados provisionales mientras se captura el audio, lo que permite que aparezcan resultados, por ejemplo, mientras el usuario sigue hablando.

Las solicitudes contienen parámetros de configuración y datos de audio. En las siguientes secciones se explican con más detalle estos tipos de solicitudes de reconocimiento, las respuestas que generan y cómo se gestionan.

Reconocimiento de la API Speech-to-Text

Una solicitud de reconocimiento síncrono de la API Speech-to-Text es el método más sencillo para realizar el reconocimiento de datos de audio de voz. Speech-to-Text puede procesar hasta 1 minuto de datos de audio de voz enviados en una solicitud síncrona. Una vez que la función de voz a texto procesa y reconoce todo el audio, devuelve una respuesta.

Una solicitud síncrona es de bloqueo, lo que significa que Speech-to-Text debe devolver una respuesta antes de procesar la siguiente solicitud. Speech-to-Text suele procesar el audio más rápido que en tiempo real. De media, procesa 30 segundos de audio en 15 segundos. En los casos en los que la calidad del audio sea deficiente, la solicitud de reconocimiento puede tardar mucho más.

Speech-to-Text tiene métodos REST y gRPC para llamar a las solicitudes síncronas y asíncronas de la API Speech-to-Text. En este artículo se muestra la API REST porque es más sencillo mostrar y explicar el uso básico de la API. Sin embargo, la estructura básica de una solicitud REST o gRPC es bastante similar. Las solicitudes de reconocimiento en streaming solo se pueden procesar con gRPC.

Solicitudes de reconocimiento de voz síncronas

Una solicitud síncrona de la API Speech-to-Text consta de una configuración de reconocimiento de voz y datos de audio. Esta es una solicitud de ejemplo:

{
    "config": {
        "encoding": "LINEAR16",
        "sampleRateHertz": 16000,
        "languageCode": "en-US",
    },
    "audio": {
        "uri": "gs://bucket-name/path_to_audio_file"
    }
}

Todas las solicitudes de reconocimiento síncronas de la API Speech-to-Text deben incluir un campo de reconocimiento de voz config (de tipo RecognitionConfig). Un RecognitionConfig contiene los siguientes subcampos:

  • encoding: (obligatorio) especifica el esquema de codificación del audio proporcionado (de tipo AudioEncoding). Si puedes elegir el códec, te recomendamos que uses una codificación sin pérdida, como FLAC o LINEAR16, para obtener el mejor rendimiento. Para obtener más información, consulta Codificaciones de audio. El campo encoding es opcional para los archivos FLAC y WAV en los que la codificación se incluye en el encabezado del archivo.
  • sampleRateHertz (obligatorio): especifica la frecuencia de muestreo (en hercios) del audio proporcionado. Para obtener más información sobre las frecuencias de muestreo, consulta la sección Frecuencias de muestreo que se incluye más abajo. El campo sampleRateHertz es opcional en los archivos FLAC y WAV en los que la frecuencia de muestreo se incluye en el encabezado del archivo.
  • languageCode: (obligatorio) contiene el idioma y la región o la configuración regional que se van a usar para el reconocimiento de voz del audio proporcionado. El código de idioma debe ser un identificador BCP-47. Ten en cuenta que los códigos de idioma suelen constar de etiquetas de idioma principales y subetiquetas de región secundarias para indicar dialectos (por ejemplo, "en" para inglés y "US" para Estados Unidos en el ejemplo anterior). Para ver una lista de los idiomas admitidos, consulta Idiomas admitidos.
  • maxAlternatives - (opcional, el valor predeterminado es 1) indica el número de transcripciones alternativas que se deben proporcionar en la respuesta. De forma predeterminada, la API Speech-to-Text proporciona una transcripción principal. Si quieres evaluar diferentes alternativas, asigna un valor más alto a maxAlternatives. Ten en cuenta que Speech-to-Text solo devolverá alternativas si el reconocedor determina que las alternativas son de calidad suficiente. En general, las alternativas son más adecuadas para las solicitudes en tiempo real que requieren comentarios de los usuarios (por ejemplo, los comandos de voz) y, por lo tanto, son más adecuadas para las solicitudes de reconocimiento de streaming.
  • profanityFilter: (opcional) indica si se deben excluir las palabras o frases malsonantes. Las palabras filtradas incluirán la primera letra y asteriscos para el resto de los caracteres (por ejemplo, p***). El filtro de palabras malsonantes funciona con palabras sueltas, no detecta el lenguaje ofensivo o inapropiado que sea una frase o una combinación de palabras.
  • speechContext: (opcional) contiene información contextual adicional para procesar el audio. Un contexto contiene los siguientes subcampos:
    • boost: contiene un valor que asigna una ponderación al reconocimiento de una palabra o frase determinada.
    • phrases: contiene una lista de palabras y frases que proporcionan sugerencias para la tarea de reconocimiento de voz. Para obtener más información, consulta la sección sobre adaptación del habla.

El audio se proporciona a Speech-to-Text a través del parámetro audio de tipo RecognitionAudio. El campo audio contiene uno de los siguientes subcampos:

  • content contiene el audio que se va a evaluar, insertado en la solicitud. Consulta la sección Insertar contenido de audio más abajo para obtener más información. El audio transmitido directamente en este campo está restringido a un minuto de duración.
  • uri contiene un URI que apunta al contenido de audio. El archivo no debe estar comprimido (por ejemplo, con gzip). Actualmente, este campo debe contener un URI de Google Cloud Storage (con el formato gs://bucket-name/path_to_audio_file). Consulta la sección Enviar una referencia de audio mediante un URI más abajo.

En las siguientes secciones se explican con más detalle estos parámetros de solicitud y respuesta.

Frecuencias de muestreo

La frecuencia de muestreo del audio se especifica en el campo sampleRateHertz de la configuración de la solicitud y debe coincidir con la frecuencia de muestreo del contenido o la emisión de audio asociados. Speech-to-Text admite frecuencias de muestreo entre 8000 y 48.000 Hz. Puede especificar la frecuencia de muestreo de un archivo FLAC o WAV en el encabezado del archivo en lugar de usar el campo sampleRateHertz. Un archivo FLAC debe contener la frecuencia de muestreo en el encabezado FLAC para poder enviarse a la API Speech-to-Text.

Si puedes elegir cuando codifiques el material de origen, captura el audio con una frecuencia de muestreo de 16.000 Hz. Los valores inferiores a este pueden alterar la precisión del reconocimiento de voz y con los valores superiores no se aprecia una mejora en la calidad del reconocimiento de voz.

Sin embargo, si ya se han grabado los datos de audio con una frecuencia distinta, no vuelvas a realizar el muestreo del audio a 16.000 Hz. La mayoría de los audios telefónicos antiguos, por ejemplo, utilizan frecuencias de muestreo de 8000 Hz, de modo que los resultados pueden ser menos precisos. Si te ves obligado a utilizar dicho audio, proporciónalo a la API Speech con su frecuencia de muestreo nativa.

Idiomas

El motor de reconocimiento de Speech-to-Text admite varios idiomas y dialectos. Puedes especificar el idioma (y el dialecto nacional o regional) del audio en el campo languageCode de la configuración de la solicitud mediante un identificador BCP-47.

Puedes consultar la lista completa de idiomas disponibles para cada función en la página Idiomas disponibles.

Compensaciones horarias (marcas de tiempo)

Speech-to-Text puede incluir valores de desfase temporal (marcas de tiempo) para el inicio y el final de cada palabra hablada que se reconoce en el audio proporcionado. Un valor de compensación horaria representa la cantidad de tiempo que ha transcurrido desde el comienzo del audio, en incrementos de 100 ms.

Las compensaciones horarias son especialmente útiles para analizar archivos de audio más largos, donde es posible que deba buscar una palabra determinada en el texto reconocido y ubicarla (buscar) en el audio original. Se admiten desfases de tiempo en todos nuestros métodos de reconocimiento: recognize, streamingrecognize y longrunningrecognize.

Los valores de compensación horaria solo se incluyen para la primera alternativa provista en la respuesta de reconocimiento.

Para incluir desfases horarios en los resultados de tu solicitud, define el parámetro enableWordTimeOffsets como true en la configuración de la solicitud. Para ver ejemplos de uso de la API REST o las bibliotecas de cliente, consulta Usar desfases horarios (marcas de tiempo). Por ejemplo, puede incluir el parámetro enableWordTimeOffsets en la configuración de la solicitud, como se muestra a continuación:

{
"config": {
  "languageCode": "en-US",
  "enableWordTimeOffsets": true
  },
"audio":{
  "uri":"gs://gcs-test-data/gettysburg.flac"
  }
}

El resultado devuelto por la API Speech-to-Text contendrá valores de desfase de tiempo para cada palabra reconocida, como se muestra a continuación:

{
  "name": "6212202767953098955",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "progressPercent": 100,
    "startTime": "2017-07-24T10:21:22.013650Z",
    "lastUpdateTime": "2017-07-24T10:21:45.278630Z"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "results": [
      {
        "alternatives": [
          {
            "transcript": "Four score and twenty...(etc)...",
            "confidence": 0.97186122,
            "words": [
              {
                "startTime": "1.300s",
                "endTime": "1.400s",
                "word": "Four"
              },
              {
                "startTime": "1.400s",
                "endTime": "1.600s",
                "word": "score"
              },
              {
                "startTime": "1.600s",
                "endTime": "1.600s",
                "word": "and"
              },
              {
                "startTime": "1.600s",
                "endTime": "1.900s",
                "word": "twenty"
              },
              ...
            ]
          }
        ]
      },
      {
        "alternatives": [
          {
            "transcript": "for score and plenty...(etc)...",
            "confidence": 0.9041967,
          }
        ]
      }
    ]
  }
}

Selección de modelos

La API Speech-to-Text puede usar uno de los varios modelos de aprendizaje automático para transcribir tu archivo de audio. Google ha entrenado estos modelos de reconocimiento de voz para tipos y fuentes de audio específicos.

Cuando envías una solicitud de transcripción de audio a Speech-to-Text, puedes mejorar los resultados que recibes especificando la fuente del audio original. De esta forma, la API Speech-to-Text puede procesar tus archivos de audio con un modelo de aprendizaje automático entrenado para reconocer el audio de voz de ese tipo de fuente concreto.

Para especificar un modelo de reconocimiento de voz, incluya el campo model en el objeto RecognitionConfig de su solicitud y especifique el modelo que quiera usar.

Consulta la lista de modelos de transcripción de Speech-to-Text para ver los modelos de aprendizaje automático disponibles.

Contenido de audio insertado

El audio insertado se incluye en la solicitud de reconocimiento de voz cuando se pasa un parámetro content en el campo audio de la solicitud. En el caso del audio insertado que se proporciona como contenido en una solicitud gRPC, ese audio debe ser compatible con la serialización Proto3 y proporcionarse como datos binarios. En cambio, para audio insertado proporcionado como contenido en una solicitud REST, el audio debe ser compatible con la serialización JSON y debe codificarse primero en Base64. Consulte Codificación Base64 de audio para obtener más información.

Cuando crees una solicitud con una biblioteca de cliente de Google Cloud, normalmente escribirás estos datos binarios (o codificados en base64) directamente en el campo content.

Transferir audio referenciado por un URI

Lo más habitual es que envíe un parámetro uri en el campo audio de la solicitud de Speech, que apunta a un archivo de audio (en formato binario, no en base64) ubicado en Google Cloud Storage con el siguiente formato:

gs://bucket-name/path_to_audio_file

Por ejemplo, la siguiente parte de una solicitud de Speech hace referencia al archivo de audio de muestra utilizado dentro del inicio rápido:

...
    "audio": {
        "uri":"gs://cloud-samples-tests/speech/brooklyn.flac"
    }
...

Debes tener los permisos de acceso adecuados para leer archivos de Google Cloud Storage, como uno de los siguientes:

  • Lectura pública (como nuestros archivos de audio de muestra)
  • Lectura con tu cuenta de servicio, si se usa una autorización de cuenta de servicio.
  • Puede leerla una cuenta de usuario si se usa el protocolo OAuth de tres vías para autorizar la cuenta de usuario.

Encontrarás más información sobre la administración del acceso a Google Cloud Storage en la sección sobre cómo crear y administrar listas de control de acceso en la documentación de Google Cloud Storage.

Respuestas de la API Speech-to-Text

Como se ha indicado anteriormente, una respuesta síncrona de la API Speech-to-Text puede tardar un tiempo en devolver los resultados, proporcional a la duración del audio proporcionado. Una vez procesado, la API devolverá una respuesta como la siguiente:

{
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.98267895,
          "transcript": "how old is the Brooklyn Bridge"
        }
      ]
    }
  ]
}

A continuación se explican estos campos:

  • results contiene la lista de resultados (de tipo SpeechRecognitionResult), donde cada resultado corresponde a un segmento de audio (los segmentos de audio se separan por pausas). Cada resultado constará de uno o varios de los siguientes campos:
    • alternatives contiene una lista de posibles transcripciones de tipo SpeechRecognitionAlternatives. Que aparezca más de una alternativa depende de si has solicitado más de una (asignando a maxAlternatives un valor superior a 1) y de si Speech-to-Text ha generado alternativas de una calidad lo suficientemente alta. Cada alternativa constará de los siguientes campos:

Si no se puede reconocer ninguna parte del audio proporcionado, la lista results devuelta no contendrá ningún elemento. Normalmente, el sistema falla en el reconocimiento cuando la calidad del audio es muy deficiente o cuando el código de idioma, la codificación o los valores de frecuencia de muestreo no coinciden con los del audio proporcionado.

Los componentes de esta respuesta se explican en las secciones siguientes.

Cada respuesta síncrona de la API Speech-to-Text devuelve una lista de resultados, en lugar de un único resultado que contenga todo el audio reconocido. La lista de audio reconocido (dentro de los elementos transcript) aparecerá en orden contiguo.

Seleccionar alternativas

Cada resultado de una respuesta de reconocimiento síncrono correcta puede contener uno o varios alternatives (si el valor de maxAlternatives de la solicitud es mayor que 1). Si Speech-to-Text determina que una alternativa tiene un valor de confianza suficiente, se incluye en la respuesta. La primer alternativa mostrada en la respuesta es siempre la mejor, es decir, la más probable.

Si se asigna a maxAlternatives un valor superior a 1, no se implica ni se garantiza que se devuelvan varias alternativas. Por lo general, es más adecuado ofrecer más de una alternativa para proporcionar opciones en tiempo real a los usuarios que obtienen resultados a través de una Streaming Recognition Request.

Administración de transcripciones

Cada alternativa proporcionada en la respuesta contendrá un elemento transcript que incluirá el texto reconocido. Cuando se proporcionen alternativas secuenciales, deberías concatenar estas transcripciones.

El siguiente código de Python se repite en una lista de resultados y concatena las transcripciones. Ten en cuenta que en todos los casos tomamos la primera alternativa (el cero).

response = service_request.execute()
recognized_text = 'Transcribed Text: \n'
for i in range(len(response['results'])):
    recognized_text += response['results'][i]['alternatives'][0]['transcript']

Valores de confianza

El valor de confidence es una estimación entre 0,0 y 1,0. Se calcula agregando los valores de "probabilidad" asignados a cada palabra del audio. Un número más alto indica una mayor probabilidad estimada de que las palabras individuales se hayan reconocido correctamente. Este campo normalmente solo se proporciona para la hipótesis principal y solo para los resultados en los que is_final=true. Por ejemplo, puedes usar el valor confidence para decidir si quieres mostrar resultados alternativos al usuario o pedirle que confirme.

Sin embargo, ten en cuenta que el modelo determina el resultado mejor clasificado en función de más señales que la puntuación confidence (como el contexto de la frase). Por este motivo, en ocasiones, el resultado principal no tiene la puntuación de confianza más alta. Si no has solicitado varios resultados alternativos, es posible que el resultado "óptimo" que se devuelva tenga un valor de confianza inferior al esperado. Esto puede ocurrir, por ejemplo, en los casos en los que se usan palabras poco frecuentes. A una palabra que se usa poco se le puede asignar un valor de "probabilidad" bajo, aunque se reconozca correctamente. Si el modelo determina que la palabra poco común es la opción más probable en función del contexto, ese resultado se devuelve en la parte superior, aunque el valor confidence del resultado sea inferior al de otras opciones.

Solicitudes y respuestas asíncronas

Una solicitud asíncrona de la API Speech-to-Text al método LongRunningRecognize tiene la misma forma que una solicitud síncrona de la API Speech-to-Text. Sin embargo, en lugar de devolver una respuesta, la solicitud asíncrona iniciará una operación de larga duración (de tipo Operation) y devolverá esta operación al llamador inmediatamente. Puedes usar el reconocimiento de voz asíncrono con audio de cualquier duración, hasta 480 minutos.

Esta es una respuesta de operación normal:

{
  "name": "operation_name",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata"
    "progressPercent": 34,
    "startTime": "2016-08-30T23:26:29.579144Z",
    "lastUpdateTime": "2016-08-30T23:26:29.826903Z"
  }
}

Fíjate que aún no hay resultados. Speech-to-Text seguirá procesando el audio y usará esta operación para almacenar los resultados. Los resultados aparecerán en el campo response de la operación devuelta cuando se complete la solicitud LongRunningRecognize.

A continuación, puedes ver una respuesta completa después de la finalización de la solicitud:

{
  "name": "1268386125834704889",
  "metadata": {
    "lastUpdateTime": "2016-08-31T00:16:32.169Z",
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongrunningRecognizeMetadata",
    "startTime": "2016-08-31T00:16:29.539820Z",
    "progressPercent": 100
  }
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "results": [{
      "alternatives": [{
        "confidence": 0.98267895,
        "transcript": "how old is the Brooklyn Bridge"
      }]}]
  },
  "done": True,
}

Ten en cuenta que done se ha definido como True y que response contiene un conjunto de resultados de tipo SpeechRecognitionResult que es el mismo tipo que devuelve una solicitud de reconocimiento síncrona de la API Speech-to-Text.

De forma predeterminada, una respuesta REST asíncrona asignará el valor False a done, que es su valor predeterminado. Sin embargo, como JSON no requiere que los valores predeterminados estén presentes en un campo, al probar si una operación se ha completado, debes comprobar que el campo done esté presente y que tenga el valor True.

Solicitudes de reconocimiento de la API Streaming Speech-to-Text

Una llamada de reconocimiento de la API Streaming Speech-to-Text se ha diseñado para capturar y reconocer audio en tiempo real en un flujo bidireccional. Tu aplicación puede enviar audio en el flujo de la solicitud y recibir resultados provisionales y finales en el flujo de respuesta en tiempo real. Los resultados provisionales representan el resultado de reconocimiento actual de una sección de audio, mientras que el resultado de reconocimiento final corresponde a la última y mejor suposición de dicha sección de audio.

Solicitudes en streaming

A diferencia de las llamadas síncronas y asíncronas, en las que se mandan la configuración y el audio en una sola solicitud, la llamada a la API Speech en streaming requiere enviar varias solicitudes. El primer StreamingRecognizeRequest debe contener una configuración de tipo StreamingRecognitionConfig sin ningún audio. Los StreamingRecognizeRequests posteriores que se envíen a través del mismo flujo constarán de fotogramas consecutivos de bytes de audio sin procesar.

Un StreamingRecognitionConfig consta de los siguientes campos:

  • config (obligatorio): contiene información de configuración del audio, de tipo RecognitionConfig, y es la misma que se muestra en las solicitudes síncronas y asíncronas.
  • single_utterance: (opcional, el valor predeterminado es false) indica si esta solicitud debe finalizar automáticamente cuando ya no se detecte voz. Si se define, la función de voz a texto detectará pausas, silencios o audio que no sea voz para determinar cuándo finalizar el reconocimiento. Si no se define, la emisión seguirá escuchando y procesando audio hasta que se cierre directamente o se supere la longitud máxima de la emisión. Definir single_utterance como true es útil para procesar comandos de voz.
  • interim_results: indica que esta solicitud de streaming debe devolver resultados temporales que se pueden refinar más adelante (después de procesar más audio). Es opcional y el valor predeterminado es false. Los resultados provisionales se indicarán en las respuestas mediante la configuración de is_final como false.

Respuestas en streaming

Los resultados de reconocimiento de voz en streaming se devuelven en una serie de respuestas del tipo StreamingRecognitionResponse. Esta respuesta consta de los campos siguientes:

  • speechEventType contiene eventos del tipo SpeechEventType. El valor de estos eventos indicará cuándo se ha determinado que se ha completado una sola expresión. Los eventos de voz sirven como marcadores en la respuesta de tu flujo.
  • results contiene la lista de resultados, que pueden ser provisionales o finales, de tipo StreamingRecognitionResult. La lista results contiene los siguientes subcampos:
    • alternatives contiene una lista de transcripciones alternativas.
    • isFinal indica si los resultados obtenidos en esta entrada de la lista son provisionales o definitivos. Google puede devolver varios resultados isFinal=true a lo largo de una sola emisión, pero el resultado isFinal=true solo se garantiza después de que se cierre la emisión de escritura (cierre parcial).
    • stability indica la volatilidad de los resultados obtenidos hasta el momento. 0.0 indica una inestabilidad total, mientras que 1.0 indica una estabilidad total. Ten en cuenta que, a diferencia de la confianza, que estima si una transcripción es correcta, stability estima si el resultado parcial proporcionado puede cambiar. Si isFinal se define como true, stability no se definirá.