Solución de problemas

Descubre soluciones que pueden resultarte útiles si tienes algún problema mientras usas Speech-to-Text.

No se puede autenticar en Speech-to-Text

Es posible que recibas un mensaje de error que indique que tus credenciales predeterminadas de la aplicación no están disponibles. También puede que te preguntes cómo obtener una clave de API para usarla al llamar a Speech-to-Text.

Speech-to-Text usa credenciales de aplicación predeterminadas (ADC) para la autenticación.

Las credenciales de ADC deben estar disponibles en el contexto en el que llames a la API Speech-to-Text. Por ejemplo, si configuras ADC en tu terminal, pero ejecutas el código en el depurador de tu IDE, es posible que el contexto de ejecución del código no tenga acceso a las credenciales. En ese caso, es posible que tu solicitud a Speech-to-Text falle.

Para saber cómo proporcionar credenciales a las ADC, consulta Configurar credenciales predeterminadas de la aplicación.

Speech-to-Text devuelve una respuesta vacía

Hay varios motivos por los que Speech-to-Text puede devolver una respuesta vacía. El problema puede deberse a la RecognitionConfig o al audio en sí.

Solucionar problemas de RecognitionConfig

El objeto RecognitionConfig (o StreamingRecognitionConfig) forma parte de una solicitud de reconocimiento de voz a texto. Para hacer una transcripción correctamente, debe definir los campos que se incluyen en las siguientes categorías principales:

  • Configuración de audio
  • Modelo e idioma

Una causa habitual de las respuestas vacías (como una respuesta JSON {} vacía) es proporcionar información incorrecta sobre los metadatos de audio. Si los campos de configuración de audio no están definidos correctamente, lo más probable es que la transcripción falle y el modelo de reconocimiento devuelva resultados vacíos.

La configuración de audio contiene los metadatos del audio proporcionado. Puedes obtener los metadatos de tu archivo de audio con el comando ffprobe, que forma parte de FFMPEG.

En el siguiente ejemplo se muestra cómo usar el comando para obtener los metadatos de este ejemplo de voz.

$ ffprobe commercial_mono.wav
[...]
Input #0, wav, from 'commercial_mono.wav':
  Duration: 00:00:35.75, bitrate: 128 kb/s
  Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 8000 Hz, 1 channels, s16, 128 kb/s

El archivo tiene claramente 8000 Hz, un canal y la codificación LINEAR16 (s16), y puedes usar esta información en tu RecognitionConfig.

Sigue estos pasos para resolver otros posibles motivos por los que se devuelve una respuesta vacía:

  1. Reproduce el archivo y escúchalo. ¿El audio es claro y el habla se entiende bien?

    Para reproducir archivos, puedes usar el comando SoX (Sound eXchange) play. A continuación, se muestran algunos ejemplos basados en diferentes codificaciones de audio.

    Los archivos FLAC incluyen un encabezado donde consta la frecuencia de muestreo, el tipo de codificación y el número de canales. Se pueden reproducir del modo siguiente:

    play audio.flac

    Los archivos LINEAR16 no incluyen un encabezado. Para reproducirlos, especifica la frecuencia de muestreo, el tipo de codificación y el número de canales. La codificación LINEAR16 debe ser de 16 bits, un número entero con signo y little-endian.

    play --channels=1 --bits=16 --rate=16000 --encoding=signed-integer \
    --endian=little audio.raw

    Los archivos MULAW tampoco incluyen un encabezado y suelen usar una frecuencia de muestreo inferior.

    play --channels=1 --rate=8000 --encoding=u-law audio.raw
  2. Comprueba que la codificación de audio de tus datos coincida con los parámetros que has enviado en RecognitionConfig. Por ejemplo, si en tu solicitud se especifican "encoding":"FLAC" y "sampleRateHertz":16000, los parámetros de datos de audio que se indican en el comando SoX play deben coincidir con estos parámetros, tal como se muestra a continuación:

    play audio.flac

    Debe incluir lo siguiente:

    Encoding: FLAC
    Channels: 1 @ 16-bit
    Sampleratehertz: 16000 Hz

    Si la lista de SoX muestra un Sampleratehertz distinto de 16000Hz, cambia el "sampleRateHertz" de InitialRecognizeRequest para que coincida. Si Encoding no es FLAC o Channels no es 1 @ 16-bit, no puedes usar este archivo directamente y tendrás que convertirlo a una codificación compatible (consulta el paso siguiente).

  3. Si tu archivo de audio no está codificado en FLAC, prueba a convertirlo a FLAC con SoX. Repite los pasos para reproducir el archivo y verifica la codificación, sampleRateHertz y los canales. Ejemplos que convierten varios formatos de archivo de audio a codificación FLAC:

    sox audio.wav --channels=1 --bits=16 audio.flac
    sox audio.ogg --channels=1 --bits=16 audio.flac
    sox audio.au --channels=1 --bits=16 audio.flac
    sox audio.aiff --channels=1 --bits=16 audio.flac

    Para convertir un archivo sin procesar a FLAC, hay que conocer la codificación de audio del archivo. Por ejemplo, para convertir un archivo de audio estéreo de 16 bits, con signo y little-endian a 16.000 Hz en FLAC, sigue este ejemplo:

    sox --channels=2 --bits=16 --rate=16000 --encoding=signed-integer \
    --endian=little audio.raw --channels=1 --bits=16 audio.flac
  4. Ejecuta el ejemplo de inicio rápido o una de las aplicaciones de ejemplo con el archivo de audio de ejemplo proporcionado. Cuando el ejemplo se ejecute correctamente, sustituye el archivo de audio de muestra por tu archivo de audio.

Configuración del modelo y del idioma

La selección del modelo es muy importante para obtener resultados de transcripción de alta calidad. Speech-to-Text proporciona varios modelos que se han ajustado para diferentes casos prácticos y se deben elegir para que se adapten lo máximo posible a tu audio. Por ejemplo, algunos modelos (como latest_short y command_and_search) son modelos de formato corto, lo que significa que son más adecuados para audios y peticiones breves. Es probable que estos modelos devuelvan resultados en cuanto detecten un periodo de silencio. Por otro lado, los modelos de formato largo (como latest_short, phone_call, video and default) son más adecuados para audios más largos y no son tan sensibles a la hora de interpretar el silencio como el final del audio.

Si el reconocimiento termina de forma demasiado brusca o no vuelve rápidamente, prueba a usar otros modelos con la interfaz de usuario de voz para ver si consigues una mejor calidad de transcripción.

Errores de tiempo de espera

En la mayoría de los casos, estos problemas se deben a una configuración incorrecta o a un uso inadecuado de Speech-to-Text.

LongRunningRecognize o BatchRecognize

  • Problema: recibes TimeoutError: Operation did not complete within the designated timeout.

  • Solución: Puedes enviar una transcripción al segmento de Cloud Storage o ampliar el tiempo de espera en la solicitud.

Este problema se produce cuando la solicitud LongRunningRecognize o BatchRecognize no se completa en el tiempo de espera especificado y no es un error que indique un fallo en la transcripción de voz. Esto significa que los resultados de la transcripción aún no se pueden extraer.

StreamingRecognize

  • Problema: recibes Timeout Error: Long duration elapsed without audio. Audio should be sent close to real time.

  • Solución: El tiempo entre los fragmentos de audio enviados debe reducirse. Si Voz a texto no recibe un nuevo fragmento cada pocos segundos, cerrará la conexión y activará este error.

StreamingRecognize 409 aborted

  • Problema: recibes el error 409 Max duration of 5 minutes reached for stream.

  • Solución: estás alcanzando el límite de reconocimiento de streaming, que es de cinco minutos de audio. Cuando te acerques a este límite, cierra la emisión y abre una nueva.

Baja calidad de la transcripción

El reconocimiento de voz automático (ASR) admite una amplia variedad de casos prácticos. La mayoría de los problemas de calidad se pueden solucionar probando diferentes opciones de la API. Para mejorar la precisión del reconocimiento, sigue las directrices que se indican en Prácticas recomendadas.

No se reconocen las frases cortas

  • Problema: La API no captura las frases cortas de los usuarios finales, como , No y Siguiente, y faltan en la transcripción.

  • Solución: sigue estos pasos.

    1. Prueba la misma solicitud con diferentes modelos.

    2. Añade la adaptación del habla y aumenta las palabras que faltan.

    3. Si usas la entrada de streaming, prueba a definir single_utterance=true.

Palabra o frase que no se reconoce de forma sistemática

  • Problema: Algunas palabras o frases se reconocen mal de forma sistemática, como cuando a se reconoce como 8.

  • Solución: sigue estos pasos.

    1. Prueba la misma solicitud con diferentes modelos.

    2. Añade la adaptación del habla y aumenta las palabras que faltan. Puedes usar tokens de clase para mejorar conjuntos de palabras completos, como secuencias de dígitos o direcciones. Consulta los tokens de clase disponibles.

    3. Prueba a aumentar max_alternatives. A continuación, marca SpeechRecognitionResult alternatives y elige el primero que coincida con el formato que quieras.

El formato puede ser complicado para el reconocimiento automático del habla. La adaptación de voz puede ayudarte a obtener el formato necesario, pero es posible que tengas que hacer un posprocesamiento para ajustarlo.

Entradas en varios idiomas

  • Problema: el audio contiene conversaciones en varios idiomas, como una conversación entre una persona que habla en inglés y otra que habla en español, lo que da lugar a una transcripción incorrecta.

  • Solución: Esta función no está disponible. Speech-to-Text solo puede transcribir un idioma por solicitud.

Permiso denegado

  • Problema: recibes el siguiente error.

    Permission denied to access GCS object BUCKET-PATH.
    Source error: PROJECT-ID@gcp-sa-speech.iam.gserviceaccount.com does not have
    storage.buckets.get access to the Google Cloud Storage bucket.
    Permission 'storage.buckets.get' denied on resource (or it may not exist).
  • Solución: Da permiso a PROJECT_ID@gcp-sa-speech.iam.gserviceaccount.com para acceder al archivo del BUCKET-PATH.

Argumento no válido

  • Problema: recibes el siguiente error.

    {
      "error": {
        "code": 400,
        "message": "Request contains an invalid argument.",
        "status": "INVALID_ARGUMENT"
      }
    }
  • Solución: compruebe los argumentos y compárelos con la documentación de la API. A continuación, valide que sean correctos. Asegúrate de que el endpoint seleccionado coincida con la ubicación de la solicitud o el recurso.

Recurso agotado

  • Problema: recibes el siguiente error.

    RESOURCE_EXHAUSTED: Resource has been exhausted (e.g. check quota)
  • Solución: consulta Solicitar un ajuste de cuota.

El fragmento de streaming es demasiado grande

  • Problema: recibes el siguiente error.

    INVALID_ARGUMENT: Request audio can be a maximum of 10485760 bytes.
    [type.googleapis.com/util.MessageSetPayload='[google.rpc.error_details_ext]
    { message: "Request audio can be a maximum of 10485760 bytes." }']
  • Solución: debes reducir el tamaño de los fragmentos de audio que envías. Te recomendamos que envíes fragmentos de 100 ms para obtener la mejor latencia y evitar alcanzar el límite de audio.

Almacenamiento de registros de datos

  • Problema: Speech-to-Text no proporciona ningún registro de Cloud Logging.

  • Solución: Como la API Speech-to-Text tiene inhabilitado el registro de datos de forma predeterminada, los clientes deben habilitarlo a nivel de proyecto.