IBM Cloud Docs
Análisis de audio de voz

Análisis de audio de voz

El servicio IBM Watson® Speech to Text proporciona varias características que determinan cómo el servicio debe analizar el audio para producir resultados finales de la transcripción.

  • El tiempo de silencio al final de la frase especifica la duración del intervalo de la pausa en la que el servicio divide una transcripción en varios resultados finales.
  • La transcripción dividida al final de la frase indica a los servicios que dividan una transcripción en varios resultados finales para características semánticas como frases.
  • El sesgo de inserción de caracteres indica al servicio que favorezca las secuencias de caracteres de menor o mayor longitud al desarrollar hipótesis de transcripción con modelos de próxima generación.

Tiempo de silencio de fin de frase

El parámetro end_of_phrase_silence_time especifica la duración del intervalo de pausa en el que el servicio divide una transcripción en varios resultados finales. Si el servicio detecta pausas o un silencio largo antes de que llegue al final de la secuencia de audio, su respuesta puede incluir varios resultados finales. El silencio indica un punto en el que el orador realiza una pausa entre palabras o frases habladas. En el caso de la mayoría de los idiomas, el intervalo de pausa predeterminado es de 0,8 segundos; en el caso del chino, el intervalo es de 0,6 segundos. Para obtener más información, consulte Pausas y silencio.

Mediante el parámetro end_of_phrase_silence_time, puede especificar un valor doble comprendido entre 0,0 y 120,0 segundos que indica un intervalo de pausa distinto:

  • Un valor mayor que 0 especifica el intervalo que se va a utilizar el servicio para el reconocimiento de voz.
  • El valor 0 indica que el servicio va a utilizar el intervalo predeterminado. Equivale a omitir el parámetro.

Puede utilizar el parámetro para establecer un equilibrio entre la frecuencia con la que se genera un resultado final y la precisión de la transcripción:

  • Un intervalo de pausa más largo genera menos resultados finales, y cada resultado cubre un segmento de audio más largo. Los segmentos más largos tienden a ser más precisos porque el servicio tiene más contexto con el que transcribir el audio.

    Sin embargo, los intervalos de pausa largos afectan directamente a la latencia de los resultados finales. Después de la última palabra del audio de entrada, el servicio debe esperar a que transcurra el intervalo indicado antes devolver su respuesta. El servicio espera para asegurarse de que el audio de entrada no continúa más allá del intervalo más largo. (Con la interfaz WebSocket, el establecimiento del parámetro puede afectar a la latencia y a la precisión de los resultados finales, independientemente de si solicita resultados provisionales.)

  • Un intervalo de pausa más corto genera más resultados finales, pero, debido a que cada segmento de audio es menor, es posible que la precisión de la transcripción no sea tan buena. Los segmentos más cortos resultan aceptables cuando la latencia resulta crucial y no se espera que la exactitud de la transcripción se degrade o se acepta cualquier degradación.

    Además, una gramática de varias frases solo reconoce, o compara, respuestas dentro de un solo resultado final. Si utiliza una gramática para reconocer varias series, puede aumentar el intervalo de pausa para no recibir varios resultados finales.

Aumente el intervalo cuando la precisión sea más importante que la latencia. Reduzca el intervalo cuando se espere que el orador pronuncie frases cortas o respuestas de una sola palabra.

Para los modelos de la generación anterior, el servicio genera un resultado final para el audio cuando la pronunciación de una expresión alcanza un máximo de dos minutos. El servicio divide una transcripción en varios resultados finales después de dos minutos de procesamiento continuo.

Ejemplo de tiempo de silencio de fin de frase

En las siguientes solicitudes de ejemplo se muestra el efecto de utilizar el parámetro end_of_phrase_silence_time. En el audio se pronuncia la frase "one two three four five six," con una pausa de un segundo entre las palabras "three" y "four." Es posible que el orador esté leyendo un número de seis dígitos de una tarjeta de identificación, por ejemplo, y en haga una pausa para confirmar el número.

El primer ejemplo utiliza el intervalo de pausa predeterminado de 0,8 segundos:

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize"

IBM Cloud Pak for Data IBM Software Hub

curl -X POST \
--header "Authorization: Bearer {token}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize"

Debido a que la pausa es más larga que el intervalo predeterminado, el servicio divide la transcripción en la pausa. El nivel de confidence de ambos resultados es 0.99, por lo que la precisión de la transcripción es muy buena a pesar de la pausa.

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.99,
          "transcript": "one two three "
        }
      ],
      "final": true
    },
    {
      "alternatives": [
        {
          "confidence": 0.99,
          "transcript": "four five six "
        }
      ],
      "final": true
    }
  ]
}

Pero supongamos que el reconocimiento de voz se lleva a cabo con una gramática que espera que el usuario pronuncie seis dígitos en una respuesta de una sola frase. Como el servicio divide la transcripción en la pausa de un segundo, los resultados están vacíos. La gramática se aplica a cada resultado final, pero ninguno de los dos resultados, ni "one two three" ni "four five six", contiene seis dígitos.

El segundo ejemplo utiliza el mismo audio pero establece el end_of_phrase_silence_time en 1,5 segundos:

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?end_of_phrase_silence_time=1.5"

IBM Cloud Pak for Data IBM Software Hub

curl -X POST \
--header "Authorization: Bearer {token}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?end_of_phrase_silence_time=1.5"

Como este valor es mayor que la duración de la pausa del orador, el servicio devuelve un solo resultado final que contiene toda la frase pronunciada. Una gramática que espera encontrar seis dígitos reconoce esta transcripción.

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 1.0,
          "transcript": "one two three four five six "
        }
      ],
      "final": true
    }
  ]
}

División de la transcripción al final de la frase

El parámetro split_transcript_at_phrase_end indica al servicio que divida la transcripción en varios resultados finales en función de las características semánticas de la entrada. Si se establece el parámetro en true, el servicio divide la transcripción al final de frases con significado, como por ejemplo frases. El servicio basa su comprensión de las características semánticas en el modelo de lenguaje base que utilice con la solicitud junto con el modelo de lenguaje personalizado o la gramática que utilice. Los modelos de lenguaje personalizado y las gramáticas pueden afectar a la forma en que el servicio divide una transcripción.

Si aplica un modelo de lenguaje personalizado al reconocimiento de voz, es probable que el servicio divida la transcripción basándose en el contenido y en la naturaleza del corpus del modelo. Por ejemplo, un modelo cuyos corpus incluyan muchas frases cortas hace que el servicio tienda a imitar los corpus y dividir la entrada en varios resultados finales más cortos. De forma similar, una gramática que espera una serie de seis dígitos puede influir en el servicio para que inserte divisiones para dar cabida a dicha serie de dígitos.

Sin embargo, el grado en el que las gramáticas y los modelos de lenguaje personalizado influyen en la división de una transcripción del servicio depende de muchos factores. Estos factores incluyen la cantidad de datos de entrenamiento con los que se ha creado el modelo personalizado y la calidad del propio audio. Los pequeños cambios en el audio pueden afectar a los resultados.

Independientemente, el servicio puede seguir produciendo varios resultados finales como respuesta a las pausas y al silencio. Si se omite el parámetro split_transcript_at_phrase_end o lo establece en false, el servicio divide las transcripciones basándose únicamente en el intervalo de pausa. El intervalo de pausa tiene preferencia sobre la división debido a las características semánticas. Si se utiliza conjuntamente en una sola solicitud, el parámetro end_of_phrase_silence_time tiene prioridad sobre el parámetro split_transcript_at_phrase_end. Para obtener más información, consulte Tiempo de silencio de fin de frase.

La transcripción dividida al final de la frase no está disponible con modelos de voz grandes.

Resultados de dividir la transcripción al final de la frase

Cuando la característica de división de la transcripción al final de la frase está habilitada, cada resultado final de la transcripción incluye un campo end_of_utterance adicional que identifica el motivo por el que el servicio ha dividido la transcripción en ese punto:

  • full_stop: una detención semántica completa, como por ejemplo la correspondiente a la conclusión de una frase gramatical. La inserción de divisiones se ve afectada por el modelo de lenguaje base y sesgada por modelos de lenguaje personalizado y gramáticas, tal como se ha descrito anteriormente.
  • silence: una pausa o silencio que es al menos tan largo como el intervalo de pausa. Puede utilizar el parámetro end_of_phrase_silence_time para controlar la duración del intervalo de pausa.
  • end_of_data: el final de la secuencia de audio de entrada.
  • reset: la cantidad de audio que se está procesando actualmente supera el máximo de dos minutos. El servicio divide la transcripción para evitar el uso excesivo de memoria.

Ejemplo de división de la transcripción al final de la frase

En las siguientes solicitudes de ejemplo se muestra el uso del parámetro split_transcript_at_phrase_end. En el audio se escucha la frase "I have an identification card. The number is one two three four five six". El orador hace una pausa de un segundo entre las palabras "three" y "four".

El primer ejemplo muestra los resultados de una solicitud que omite el parámetro:

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize"

IBM Cloud Pak for Data IBM Software Hub

curl -X POST \
--header "Authorization: Bearer {token}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize"

El servicio devuelve dos resultados finales, dividiendo la transcripción sólo en la pausa ampliada del orador:

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.93,
          "transcript": "I have a valid identification card the number is one two three "
        }
      ],
      "final": true
    },
    {
      "alternatives": [
        {
          "confidence": 0.99,
          "transcript": "four five six "
        }
      ],
      "final": true
    }
  ]
}

El segundo ejemplo reconoce el mismo audio pero establece split_transcript_at_phrase_end en true:

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?split_transcript_at_phrase_end=true"

IBM Cloud Pak for Data IBM Software Hub

curl -X POST \
--header "Authorization: Bearer {token}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?split_transcript_at_phrase_end=true"

El servicio devuelve tres resultados finales, ya que añade un resultado para la detención semántica después de la primera frase. Cada resultado incluye el campo end_of_utterance para identificar el motivo de la división.

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.92,
          "transcript": "I have a valid identification card "
        }
      ],
      "final": true,
      "end_of_utterance": "full_stop"
    },
    {
      "alternatives": [
        {
          "confidence": 0.97,
          "transcript": "the number is one two three "
        }
      ],
      "final": true,
      "end_of_utterance": "silence"
    },
    {
      "alternatives": [
        {
          "confidence": 0.99,
          "transcript": "four five six "
        }
      ],
      "final": true,
      "end_of_utterance": "end_of_data"
    }
  ]
}

Sesgo de inserción de caracteres

El parámetro " character_insertion_bias " es una funcionalidad que está disponible para todos los modelos de próxima generación. El parámetro no está disponible para modelos de voz grandes y modelos de generación anterior.

El parámetro character_insertion_bias controla el sesgo del servicio para las series de diferentes longitudes que compiten durante el reconocimiento de voz. Con modelos de voz grandes y modelos de próxima generación, el servicio analiza el audio carácter por carácter. A medida que lo hace, establece hipótesis de series de caracteres anteriores para ayudar a determinar los próximos caracteres viables. Durante este proceso, recopila series candidatas de diferentes longitudes.

De forma predeterminada, cada modelo utiliza un character_insertion_bias predeterminado de 0.0. Este valor se optimiza para producir el mejor equilibrio entre hipótesis con distintos números de caracteres. El valor predeterminado suele ser adecuado para la mayoría de los reconocimientos de voz. Sin embargo, ciertos casos de uso pueden beneficiarse de hipótesis a favor con series de caracteres más cortas o más largas. En estos casos, indicar una modificación del valor predeterminado puede mejorar el reconocimiento de voz.

Puede utilizar el parámetro character_insertion_bias para indicar que el servicio favorece a las series más cortas o más largas, ya que tiene en cuenta los caracteres posteriores para sus hipótesis. El valor que proporcione depende de las características del audio. El rango de valores aceptables es de -1.0 a 1.0:

  • Valores negativos provoca que el servicio dé preferencia a las hipótesis con series de caracteres más cortas.
  • Valores positivos provoca que el servicio dé preferencia a las hipótesis con series de caracteres más largas.

Cuanto más se acerca el valor a -1.0 o 1.0, más pronunciado es el impacto del parámetro. Para determinar el valor más eficaz para su caso, empiece estableciendo el valor del parámetro en un incremento pequeño, como -0.1, -0.05, 0.05 o 0.1, y valore cómo afecta a los resultados de la transcripción. A continuación, pruebe con diferentes valores según sea necesario, y ajuste el valor en pequeños incrementos para calibrar el grado de desviación con respecto al valor predeterminado del modelo.

Ejemplo de sesgo de inserción de caracteres

La siguiente solicitud de ejemplo indica al servicio que favorezca marginalmente las series más largas de hipótesis de caracteres estableciendo el parámetro character_insertion_bias en 0.1. Se trata de un pequeño incremento inicial para determinar el efecto del cambio en los resultados de la transcripción.

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?model=en-US_Telephony&character_insertion_bias=0.1"

IBM Cloud Pak for Data IBM Software Hub

curl -X POST \
--header "Authorization: Bearer {token}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?model=en-US_Telephony&character_insertion_bias=0.1"