Construcción de solicitud de Speech-to-Text

Este documento es una guía de los conceptos básicos del uso de Speech-to-Text. En esta guía conceptual, se abordan los tipos de solicitudes que puedes hacer a Speech-to-Text, cómo construir esas solicitudes y cómo manejar sus respuestas. Recomendamos que todos los usuarios de Speech-to-Text lean esta guía y uno de los instructivos asociados antes de empezar a usar la API.

Pruébalo tú mismo

Si es la primera vez que usas Google Cloud, crea una cuenta para evaluar el rendimiento de Speech-to-Text en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.

Probar Speech-to-Text gratis

Solicitudes de voz

En Speech-to-Text, se dispone de tres métodos principales para hacer el reconocimiento de voz. Estos se mencionan a continuación:

  • Reconocimiento síncrono (REST y gRPC) envía datos de audio a la API de Speech-to-Text, mediante el cual se hace el reconocimiento de esos datos y muestra los resultados luego de procesar todo el audio. Las solicitudes de reconocimiento síncronas están limitadas a los datos de audio de 1 minuto o menos de duración.

  • El Reconocimiento asíncrono (REST y gRPC) envía los datos de audio a la API de Speech-to-Text y también inicia una operación de larga duración. Esta operación te permite sondear de forma periódica los resultados del reconocimiento. Usa las solicitudes asíncronas para los datos de audio de cualquier duración hasta 480 minutos.

  • El Reconocimiento de transmisión (gRPC únicamente) es por donde se hace el reconocimiento de los datos de audio proporcionados dentro de una transmisión bidireccional de gRPC. Las solicitudes de transmisión continua están diseñadas para fines de reconocimiento en tiempo real, como la captura de audio en vivo de un micrófono. El reconocimiento de transmisión continua proporciona resultados provisorios mientras se captura el audio, lo que permite que el resultado aparezca, por ejemplo, mientras un usuario aún está hablando.

Las solicitudes contienen parámetros de configuración, así como datos de audio. En las siguientes secciones, se describe este tipo de solicitudes de reconocimiento, las respuestas que generan y cómo manejar esas respuestas con más detalle.

Reconocimiento de la API de Speech-to-Text

Una solicitud de reconocimiento síncrona de la API de Speech-to-Text es el método más simple para hacer el reconocimiento en datos de audio de voz. Con Speech-to-Text, se puede procesar hasta 1 minuto de datos de audio de voz enviados en una solicitud síncrona. En Speech-to-Text, una vez que se procesa y reconoce todo el audio, se muestra una respuesta.

La solicitud síncrona implica un bloqueo, lo que significa que se debe mostrar una respuesta antes de procesar la siguiente solicitud en Speech-to-Text. En Speech-to-Text, normalmente se procesa el audio más rápido que en tiempo real; en promedio, se procesan 30 segundos de audio en 15 segundos. En casos de audio de mala calidad, tu solicitud de reconocimiento puede tardar mucho más tiempo.

En Speech-to-Text, se dispone de los métodos REST y gRPC para llamar a las solicitudes síncronas y asíncronas de la API de Speech-to-Text. En este artículo, se muestra la API de REST, porque es más sencillo mostrar y explicar el uso básico de la API. Sin embargo, la composición básica de las solicitudes REST o gRPC es bastante similar. Las solicitudes de reconocimiento de transmisión continua solo son compatibles con gRPC.

Solicitudes de reconocimiento de voz síncronas

Una solicitud síncrona de la API de Speech-to-Text consiste en una configuración de reconocimiento de voz y datos de audio. A continuación, se presenta una solicitud de muestra:

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

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

  • encoding: Especifica el esquema de codificación del audio suministrado (del tipo AudioEncoding). Si puedes elegir el códec, se recomienda una codificación sin pérdidas, como FLAC o LINEAR16, para lograr el mejor rendimiento (obligatorio) (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: Especifica la tasa de muestreo (en hercios) del audio suministrado (obligatorio) (Para obtener más información sobre las tasas de muestreo, consulta Tasas de muestreo a continuación). El campo sampleRateHertz es opcional para los archivos FLAC y WAV, en los que la tasa de muestreo se incluye en el encabezado del archivo.
  • languageCode (obligatorio): Contiene el idioma + la región/configuración regional que se usará para el reconocimiento de voz del audio suministrado. El código de idioma debe ser un identificador BCP-47. Ten en cuenta que los códigos de idioma suelen consistir en etiquetas del idioma principal y subetiquetas de la región secundaria que indican los dialectos (por ejemplo, "en" para inglés y "US" para Estados Unidos en el ejemplo anterior) (Para obtener una lista de los idiomas admitidos, consulta Idiomas compatibles).
  • maxAlternatives (opcional; la configuración predeterminada es 1): Indica la cantidad de transcripciones alternativas que se deben proporcionar en la respuesta. De manera predeterminada, la API de Speech-to-Text proporciona una transcripción principal. Si deseas evaluar diferentes alternativas, configura maxAlternatives con un valor más alto. Ten en cuenta que solo se mostrarán alternativas si el identificador determina que estas son de una calidad suficiente en Speech-to-Text; en general, las alternativas son más adecuadas para las solicitudes en tiempo real que requieren comentarios de los usuarios (por ejemplo, comandos por voz) y, por lo tanto, son más adecuadas para las solicitudes de reconocimiento de transmisión.
  • profanityFilter (opcional): Indica si se deben filtrar palabras o frases obscenas. Las palabras filtradas contendrán su primera letra y asteriscos para los caracteres restantes (p. ej., p***). El filtro de lenguaje obsceno funciona para palabras sueltas; no detecta frases o combinaciones de palabras de voz ofensiva o abusiva.
  • speechContext (opcional): Contiene información contextual adicional para procesar este audio. Un contexto contiene el siguiente subcampo:
    • boost: Contiene un valor que asigna un peso para reconocer 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 información sobre adaptación de voz.

El audio se suministra a Speech-to-Text mediante el parámetro audio del tipo RecognitionAudio. El campo audio contiene cualquiera de los siguientes subcampos:

  • content contiene el audio que se evaluará, incorporado en la solicitud. Consulta Incorpora contenido de audio a continuación para obtener más información. El audio transferido directamente en este campo tiene un límite de 1 minuto de duración.
  • uri contiene un URI que dirige al contenido de audio. El archivo no debe estar comprimido (por ejemplo, gzip). Hoy este campo debe contener un URI de Google Cloud Storage (con el formato gs://bucket-name/path_to_audio_file). Consulta Pasar la referencia de audio mediante un URI a continuación.

A continuación, se proporciona más información sobre estos parámetros de solicitud y respuesta.

Tasas de muestreo

Especifica la tasa de muestreo de tu audio en el campo sampleRateHertz de la configuración de la solicitud, que debe coincidir con la tasa de muestreo de la transmisión continua o el contenido de audio asociados. Las tasas de muestreo entre 8,000 Hz y 48,000 Hz son compatibles con Speech-to-Text. Puedes especificar la tasa de muestreo para un archivo FLAC o WAV en el encabezado del archivo, en lugar de usar el campo sampleRateHertz. Un archivo FLAC debe contener la tasa de muestreo en el encabezado FLAC para poder enviarse a la API de Speech-to-Text.

Si tienes la opción durante la codificación del material de origen, captura audio con una tasa de muestreo de 16,000 Hz. Los valores más bajos pueden afectar la exactitud del reconocimiento de voz, y los niveles más altos no tienen un efecto apreciable en la calidad del reconocimiento.

Sin embargo, si tus datos de audio ya se grabaron con una tasa de muestreo existente diferente de 16,000 Hz, no vuelvas a hacer un muestreo de tu audio a 16,000 Hz. La mayoría del audio de telefonía heredado, por ejemplo, usa tasas de muestreo de 8,000 Hz, lo que puede dar resultados menos exactos. Si debes usar ese audio, proporciona el audio a la API de Speech-to-Text a su tasa de muestreo nativa.

Lenguajes

El motor de reconocimiento de Speech-to-Text admite una variedad de idiomas y dialectos. Especifica el idioma (y el dialecto nacional o regional) de tu audio dentro del campo languageCode de la configuración de la solicitud, con un identificador BCP-47.

En la página Idiomas compatibles, encontrarás una lista completa de los idiomas admitidos por cada función.

Compensaciones horarias (marcas de tiempo)

Speech-to-Text puede incluir valores de compensaciones horarias (marcas de tiempo) para el inicio y el final de cada palabra hablada que es reconocida en el audio suministrado. Un valor de compensación horaria representa la cantidad de tiempo que transcurrió desde el inicio del audio, en incrementos de 100 ms.

Las compensaciones horarias son especialmente útiles para analizar archivos de audio más largos, en los que es posible que necesites buscar una palabra en particular en el texto reconocido y ubicarla (buscarla) en el audio original. Las compensaciones horarias son compatibles con todos nuestros métodos de reconocimiento: recognize, streamingrecognize y longrunningrecognize.

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

Para incluir las compensaciones horarias en los resultados de tu solicitud, configura el parámetro enableWordTimeOffsets como verdadero en la configuración de la solicitud. Para ver ejemplos que usan la API de REST o las Bibliotecas cliente, consulta Usa compensaciones horarias (marcas de tiempo). Por ejemplo, puedes incluir el parámetro enableWordTimeOffsets en la configuración de la solicitud como se muestra aquí:

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

El resultado que muestra la API de Speech-to-Text contendrá valores de compensación horaria 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 del modelo

Speech-to-Text puede usar uno de varios modelos de aprendizaje automático para transcribir tu archivo de audio. Google entrenó 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 mediante la especificación de la fuente del audio original. Esto permite que la API de Speech-to-Text procese tus archivos de audio con un modelo de aprendizaje automático entrenado para reconocer audio de voz de ese tipo particular de fuente.

Para especificar un modelo destinado al reconocimiento de voz, incluye el campo model en el objeto RecognitionConfig de tu solicitud, con la especificación del modelo que deseas 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 incorporado

El audio incorporado se incluye en la solicitud de reconocimiento de voz cuando se transfiere un parámetro content en el campo audio de la solicitud. En el caso del audio incorporado que se proporciona como contenido dentro de una solicitud de gRPC, ese audio debe ser compatible con la serialización Proto3 y se debe proporcionar como datos binarios. Para audio incorporado que se proporciona como contenido dentro de una solicitud de REST, ese audio debe ser compatible con la serialización JSON y ante todo se debe codificar en Base64. Para obtener más información, consulta Codifica tu audio en Base64.

Cuando construyas una solicitud con una biblioteca cliente de Google Cloud, por lo general, escribirás estos datos binarios (o codificados en Base64) directamente en el campo content.

Transfiere audio cuya referencia es un URI

Con más frecuencia, pasarás un parámetro uri dentro del campo audio de la solicitud de voz y dirigirás a un archivo de audio (en formato binario, no Base64) ubicado en Google Cloud Storage de la siguiente forma:

gs://bucket-name/path_to_audio_file

Por ejemplo, la siguiente parte de una solicitud de Speech-to-Text hace referencia al archivo de audio de muestra usado en la Guía de inicio rápido:

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

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

  • Legible públicamente (como nuestros archivos de audio de muestra)
  • Legible por tu cuenta de servicio si usas la autorización de la cuenta de servicio
  • Legible por una cuenta de usuario, si usas OAuth de tres segmentos para la autorización de la cuenta de usuario

Para obtener más información sobre la administración del acceso a Google Cloud Storage, consulta Crea y administra listas de control de acceso en la documentación de Google Cloud Storage.

Respuestas de la API de Speech-to-Text

Como se indicó anteriormente, una respuesta síncrona de la API de Speech-to-Text puede tardar un tiempo en mostrar los resultados, proporcional a la duración del audio suministrado. Una vez procesada, la API presentará una respuesta como se muestra a continuación:

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

Estos campos se explican a continuación:

  • results contiene la lista de resultados (del tipo SpeechRecognitionResult) en la que cada resultado corresponde a un segmento de audio (los segmentos de audio están separados por pausas). Cada resultado constará de uno o más de los siguientes campos:
    • alternatives contiene una lista de transcripciones posibles, del tipo SpeechRecognitionAlternatives. La aparición de más de una alternativa depende de si solicitaste más de una alternativa (estableciste maxAlternatives en un valor mayor que 1) y de si se produjeron alternativas de una calidad suficiente en Speech-to-Text. Cada alternativa constará de los siguientes campos:

Si no se pudo reconocer voz en el audio suministrado, la lista de results mostrada no contendrá ningún artículo. La voz no reconocida suele ser el resultado de un audio de muy mala calidad, o de valores de código de idioma, codificación o tasa de muestreo que no coinciden con el audio suministrado.

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

Cada respuesta síncrona de la API de Speech-to-Text muestra una lista de resultados, en lugar de un solo resultado con todo el audio reconocido. La lista de audio reconocido (dentro del elemento transcript) aparecerá en orden contiguo.

Elige alternativas

Cada resultado dentro de una respuesta de reconocimiento síncrono correcto puede contener una o más alternatives (si el valor maxAlternatives de la solicitud es mayor que 1). Si se determina que una alternativa tiene un valor de confianza suficiente en Speech-to-Text, entonces esa alternativa se incluye en la respuesta. La primera alternativa en la respuesta siempre es la mejor alternativa (con más probabilidades).

La configuración de maxAlternatives como un valor mayor que 1 no implica o garantiza que se mostrarán varias alternativas. En general, más de una alternativa es lo más apropiado para proporcionar opciones en tiempo real a los usuarios que obtienen los resultados a través de una Solicitud de reconocimiento de transmisión continua.

Maneja las transcripciones

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

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

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 confidence es una estimación entre 0.0 y 1.0. Se calcula agregando los valores de "probabilidad" asignados a cada palabra en el audio. Un número más alto indica una mayor probabilidad estimada de que las palabras individuales reconocidas sean correctas. Por lo general, este campo está destinado a las principales hipótesis y solo se proporciona para los resultados en los que sucede lo siguiente: is_final=true. Por ejemplo, puedes usar el valor de confidence para decidir si deseas mostrar resultados alternativos al usuario o pedir la confirmación del usuario.

Sin embargo, ten en cuenta que el modelo determina el "mejor" resultado en función de más señales que la puntuación confidence sola (como el contexto de la oración). Debido a esto, hay casos ocasionales en los que el resultado superior no tiene la puntuación de confianza más alta. Si no solicitaste múltiples resultados alternativos, el "mejor" resultado mostrado puede tener un valor de confianza menor al previsto. Por ejemplo, esto puede ocurrir en casos en que se usan palabras raras. A una palabra que se usa con poca frecuencia se le puede asignar un valor bajo de "probabilidad", incluso si se reconoce correctamente. Si el modelo determina que la palabra infrecuente es la opción más probable según el contexto, ese resultado se muestra en la parte superior, aunque el valor confidence del resultado sea menor que las opciones alternativas.

Respuestas y solicitudes asíncronas

Una solicitud asíncrona de la API de Speech-to-Text al método LongRunningRecognize es idéntica a una solicitud síncrona a la API de Speech-to-Text. Sin embargo, en lugar de mostrar una respuesta, la solicitud asíncrona iniciará una operación de larga duración (del tipo Operación) y mostrará esta operación al destinatario de inmediato. Puedes usar el reconocimiento de voz asíncrono con audio de cualquier duración hasta 480 minutos.

A continuación, se muestra una respuesta de operación típica:

{
  "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"
  }
}

Ten en cuenta que aún no hay resultados. Speech-to-Text continuará procesando el audio y usará esta operación para almacenar los resultados. Los resultados aparecerán en el campo response de la operación que se muestra cuando se completa la solicitud LongRunningRecognize.

A continuación, se muestra una respuesta completa una vez que finaliza 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 configuró como True y que el elemento response de la operación contiene un conjunto de resultados del tipo SpeechRecognitionResult, que es el mismo tipo mostrado por una solicitud de reconocimiento síncrona de la API de Speech-to-Text.

De manera predeterminada, una respuesta asíncrona de REST configurará done como False, su valor predeterminado; sin embargo, dado que JSON no requiere que haya valores predeterminados presentes en un campo, cuando se comprueba si una operación se completó, deberías probar que el campo done esté presente y que esté configurado como True.

Solicitudes de reconocimiento de la API de Speech-to-Text de transmisión continua

Una llamada de reconocimiento a la API de Speech-to-Text de transmisión continua está diseñada para la captura y el reconocimiento de audio en tiempo real, dentro de una transmisión bidireccional. Tu aplicación puede enviar audio en la transmisión continua de la solicitud y recibir resultados de reconocimiento intermedios y finales en tiempo real en la transmisión de la respuesta. Los resultados intermedios representan el resultado del reconocimiento actual correspondiente a una sección de audio, mientras que el resultado del reconocimiento final representa la última y mejor interpretación de esa sección de audio.

Solicitudes de transmisión continua

A diferencia de las llamadas síncronas y asíncronas, en las que envías la configuración y el audio en una misma solicitud, la llamada a la API de Speech-to-Text de transmisión continua requiere el envío de varias solicitudes. El primer elemento StreamingRecognizeRequest debe contener una configuración del tipo StreamingRecognitionConfig sin audio que lo acompañe. Los elementos StreamingRecognizeRequest subsiguientes enviados en la misma transmisión continua consistirán en marcos consecutivos de bytes de audio sin procesar.

Un elemento StreamingRecognitionConfig consta de los siguientes campos:

  • config (obligatorio): Contiene información de configuración para el audio, del tipo RecognitionConfig, y es igual que lo 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 de forma automática después de que ya no se detecte la voz. Si se configura, se detectarán pausas, silencio o audio sin voz para determinar cuándo debe finalizar el reconocimiento en Speech-to-Text. Si no se configura, la transmisión continuará escuchando y procesando audio hasta que esta se cierre directamente o se exceda la longitud límite de la transmisión. Configurar single_utterance como true es útil para procesar comandos por voz.
  • interim_results (opcional, el valor predeterminado es false): Indica que esta solicitud de transmisión continua debe mostrar resultados temporales que pueden definirse mejor más adelante (después de procesar más audio). Los resultados provisionales se anotarán dentro de las respuestas a través de la configuración de is_final como false.

Respuestas de transmisión

Los resultados del reconocimiento de voz de transmisión continua se muestran en una serie de respuestas del tipo StreamingRecognitionResponse. Esta respuesta consta de los siguientes campos:

  • speechEventType contiene eventos de tipo SpeechEventType. El valor de estos eventos indicará el momento en que se haya determinado que se completó una declaración. Los eventos de voz sirven como marcadores en la respuesta de tu transmisión.
  • results contiene la lista de resultados, que pueden ser resultados intermedios o finales, del 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 lista son provisionales o finales. Google puede mostrar varios resultados de isFinal=true en una sola transmisión, pero el resultado de isFinal=true solo está garantizado después de que se cierra la transmisión de escritura (medio cierre).
    • stability indica la volatilidad de los resultados obtenidos hasta el momento. 0.0 indica inestabilidad completa, mientras que 1.0 indica estabilidad completa. Ten en cuenta que, a diferencia de la confianza, que estima si una transcripción es correcta, stability estima si el resultado parcial dado puede cambiar. Si isFinal está configurado como true, no se establecerá stability.