Resultados provisionales y baja latencia

Con la interfaz WebSocket, el servicio IBM Watson® Speech to Text da soporte a los resultados provisionales, que son hipótesis de transcripción intermedia que llegan antes de los resultados finales. Para las interfaces WebSocket y HTTP, la mayoría de los modelos de próxima generación también ofrecen baja latencia para devolver los resultados aún más rápidamente de lo que ya lo hacen, aunque la precisión de la transcripción podría reducirse. Ya están disponibles los resultados provisionales de todos los modelos de voz de gran tamaño. La precisión puede ser ligeramente inferior y estos modelos aún no admiten latencia baja.

Resultados provisionales

La característica de resultados provisionales solo está disponible con la interfaz WebSocket.

Los resultados provisionales son hipótesis de transcripción intermedia que pueden cambiar antes de que el servicio devuelva sus resultados finales. El servicio devuelve resultados provisionales en cuanto los genera. Los resultados provisionales son útiles para aplicaciones interactivas y la transcripción en tiempo real y para secuencias de audio largas, que pueden tardar un tiempo en transcribirse.

Los resultados provisionales evolucionan a medida que avanza el proceso del servicio de una expresión. Llegan con más frecuencia y más rápidamente que los resultados finales. Puede utilizarlos para permitir que la aplicación responda más rápidamente o para medir el progreso de la transcripción. Una vez finalizado el procesamiento de una expresión oral, el servicio envía los resultados finales, que representan su mejor transcripción del audio correspondiente a dicha expresión.

Los resultados provisionales permiten la paridad de características entre los modelos antiguos y los nuevos. También reduce la latencia por parte de los usuarios, ya que los resultados intermedios empiezan a llegar antes que antes.

  • Los resultados provisionales se identifican en una transcripción con el campo "final": false. El servicio puede actualizar los resultados provisionales con transcripciones más precisas a medida que procesa más audio. El servicio entrega uno o más resultados provisionales para cada resultado final.
  • Los resultados finales se identifican con el campo "final": true. El servicio no realiza actualizaciones adicionales a los resultados finales.

La forma de solicitar resultados provisionales depende del tipo de modelo que estés utilizando:

  • Para obtener resultados provisionales, ajuste el parámetro end_of_phrase_silence_time a un valor distinto de None.
  • Para un modelo de la generación anterior, establezca el parámetro interim_results en true en el mensaje JSON start. Los resultados provisionales están disponibles para todos los modelos de la generación anterior.
  • Para un modelo de nueva generación, establezca el parámetro interim_results en true en el mensaje de inicio JSON. También puede configurar low_latency en true para habilitar tanto los resultados provisionales como la baja latencia juntos para los modelos.
  • Para un modelo de voz de gran tamaño, configura el valor de « interim_results » en « true » en el mensaje JSON start. Actualmente, « low_latency » solo es compatible con el modelo de voz de gran tamaño en-US.

Para inhabilitar los resultados provisionales para cualquier modelo, omita el parámetro interim_results o establézcalo en false. Inhabilite los resultados provisionales si está realizando una transcripción fuera de línea o por lotes.

Ejemplo de resultados provisionales

El siguiente ejemplo de WebSocket abreviado solicita resultados provisionales. El servicio envía varios objetos de respuesta. Establece el atributo final en true sólo para los resultados finales. La solicitud utiliza implícitamente el en-US_BroadbandModel predeterminado de la generación anterior.

var access_token = {access_token};
var wsURI = '{ws_url}/v1/recognize'
  + '?access_token=' + access_token;
var websocket = new WebSocket(wsURI);

websocket.onopen = function(evt) { onOpen(evt) };
function onOpen(evt) {
  var message = {
    action: 'start',
    content-type: 'audio/l16;rate=22050',
    interim_results: true
    end_of_phrase_silence_time:1.3
  };
  websocket.send(JSON.stringify(message));
  websocket.send(blob);
}

websocket.onmessage = function(evt) { onMessage(evt) };
function onMessage(evt) {
  console.log(evt.data);
}

La respuesta incluye una sola expresión sin pausas.

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "transcript": "several to "
        }
      ],
      "final": false
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "transcript": "several tornadoes "
        }
      ],
      "final": false
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "transcript": "several tornadoes swept through "
        }
      ],
      "final": false
    }
  ]
}{
  . . .
}{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.96,
          "transcript": "several tornadoes swept through Colorado on Sunday "
        }
      ],
      "final": true
    }
  ]
}

Baja latencia

El parámetro « low_latency » está disponible para la mayoría de los modelos de última generación y para el modelo de voz de gran tamaño « en-US ». El parámetro no está disponible con los modelos de generación anterior.

Los modelos multimedia y de telefonía de próxima generación tienen tiempos de respuesta generalmente más rápidos que los modelos de la generación anterior. Pero en algunas situaciones, es posible que desee recibir los resultados más rápidamente. Con los modelos de próxima generación que dan soporte a la baja latencia, puede establecer el parámetro low_latency en true para recibir los resultados más rápidamente. Para obtener más información sobre los modelos de próxima generación que dan soporte a la baja latencia, consulte Modelos de idioma de próxima generación soportados.

Con baja latencia, el servicio logra resultados más rápidos a expensas de la precisión de la transcripción. Cuando la latencia baja está habilitada, el servicio segmenta el audio en trozos más pequeños para optimizar la velocidad sobre la precisión. Esta disyuntiva podría ser aceptable si tu aplicación necesita un tiempo de respuesta menor que la máxima precisión posible. Por ejemplo, la baja latencia es ideal para casos de uso tales como subtítulos cerrados, aplicaciones conversacionales y servicio al cliente en directo en el canal de voz del servicio IBM® watsonx™ Assistant.

La omisión del parámetro low_latency puede producir resultados más precisos y es el enfoque recomendado para la mayoría de casos de uso. El parámetro low_latency es false de forma predeterminada.

La naturaleza de la respuesta a una solicitud que incluye baja latencia depende de la interfaz que se utilice:

  • Con las interfaces HTTP, el servicio espera hasta recibir toda la entrada de audio y luego envía una respuesta. A continuación, envía una única secuencia de bytes en respuesta. La respuesta puede incluir múltiples elementos de transcripción con múltiples resultados finales y se puede enviar de forma incremental. Pero es una sola secuencia de datos.
  • Con la interfaz WebSocket, el servicio envía los resultados finales a medida que están disponibles. Puede enviar varias respuestas independientes en forma de diferentes secuencias de bytes. La conexión es bidireccional y de dúplex completo, por lo que las solicitudes y las respuestas pueden seguir fluyendo en ambos sentidos a través de una única conexión mientras esta permanezca activa.

Restricciones de baja latencia

La característica de baja latencia tiene las siguientes restricciones de uso:

  • La baja latencia sólo está disponible para algunos modelos de próxima generación. Para los modelos de próxima generación que no dan soporte a la baja latencia, si incluye el parámetro low_latency con una solicitud, el servicio falla con el código de estado 400:

    {
      "code": 400,
      "code_description": "Bad Request",
      "error": "low_latency is not a supported feature for model {model_id}"
    }
    
  • La latencia baja no está disponible para modelos de generación anterior. Para modelos de la generación anterior, si incluye el parámetro low_latency con una solicitud, el servicio genera un aviso:

    "warnings": [
      "Unknown arguments: low_latency."
    ]
    

Ejemplo de baja latencia

El siguiente ejemplo HTTP síncrono solicita la baja latencia con el modelo en-US_Telephony. El ejemplo establece el parámetro de consulta low_latency en true.

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&low_latency=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?model=en-US_Telephony&low_latency=true"

Ejemplos de resultados provisionales y de baja latencia

El siguiente código de WebSocket abreviado muestra cómo solicitar resultados provisionales, resultados de baja latencia o ambos con la interfaz WebSocket. Especifica los parámetros siguientes:

  • El parámetro de consulta model de la solicitud /v1/recognize pasa el modelo en-US_Telephony de próxima generación, que da soporte a una latencia baja.
  • El parámetro inactivity_timeout del mensaje JSON start establece el tiempo de espera de inactividad en -1 (infinito), lo que impide que la solicitud se exceda el tiempo de espera.
  • Los parámetros interim_results y low_latency se especifican con el mensaje JSON start de la solicitud.

Para mostrar ejemplos de resultados con todas las combinaciones posibles de los parámetros, los argumentos para interim_results y low_latency se establecen en true o false en los ejemplos de las secciones siguientes.

var access_token = {access_token};
var wsURI = '{ws_url}/v1/recognize'
  + '?access_token=' + access_token
  + '&model=en-US_Telephony';
var websocket = new WebSocket(wsURI);

websocket.onopen = function(evt) { onOpen(evt) };
function onOpen(evt) {
  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: {true | false},
    low_latency: {true | false}
  };
  websocket.send(JSON.stringify(message));
  websocket.send(blob);
}

websocket.onmessage = function(evt) { onMessage(evt) };
function onMessage(evt) {
  console.log(evt.data);
}

El archivo WAV que se pasa al servicio incluye una sola frase con dos pausas incrustadas de varios segundos: "Las tormentas podrían producir ...pause... granizo grande ...pausa... y una fuerte lluvia". Las pausas son lo suficientemente largas como para representar expresiones separadas y así generar múltiples resultados finales. Debido a que cada respuesta incluye varios resultados finales, uno por expresión, debe ensamblar los resultados finales en una sola serie para ver la transcripción completa.

Ejemplo 1: Los resultados provisionales y la baja latencia son ambos falsos

Este ejemplo establece interim_results y también low_latency en false. El servicio devuelve sólo los resultados finales como un único objeto JSON.

  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: false,
    low_latency: false,
    end_of_phrase_silence_time: 1.4
  };
{
  "result_index": 0,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "thunderstorms could produce ",
          "confidence": 0.94
        }
      ]
    },
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "large hail ",
          "confidence": 0.91
        }
      ]
    },
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "and heavy rain ",
          "confidence": 0.86
        }
      ]
    }
  ]
}

Ejemplo 2: Los resultados provisionales son falsos y la latencia baja es verdadera

Este ejemplo establece interim_results en false y low_latency en true. El servicio devuelve sólo los resultados finales como un único objeto JSON.

  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: false,
    low_latency: true,
    end_of_phrase_silence_time: 1.4
  };
{
  "result_index": 0,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "thunderstorms could produce ",
          "confidence": 0.94
        }
      ]
    },
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "large hail ",
          "confidence": 0.91
        }
      ]
    },
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "and heavy rain ",
          "confidence": 0.86
        }
      ]
    }
  ]
}

Ejemplo 3: Los resultados provisionales son verdaderos y la latencia baja es falsa

Este ejemplo establece interim_results en true y low_latency en falso. Devuelve los resultados provisionales utilizando el modo de latencia no baja.

  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: true,
    low_latency: false,
    end_of_phrase_silence_time: 1.4
  };
{
  "result_index": 0,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "thunderstorms "
        }
      ]
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "thunderstorms could produce "
        }
      ]
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "thunderstorms could produce ",
          "confidence": 0.94
        }
      ]
    }
  ]
}{
  "result_index": 1,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "large "
        }
      ]
    }
  ]
}{
  "result_index": 1,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "large hail ",
          "confidence": 0.91
        }
      ]
    }
  ]
}{
  "result_index": 2,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "and heavy rain ",
          "confidence": 0.86
        }
      ]
    }
  ]
}

Ejemplo 4: Los resultados provisionales y la baja latencia son verdaderos

Este ejemplo establece interim_results y también low_latency en true. El servicio devuelve tanto resultados provisionales como definitivos, y cada resultado se presenta como un objeto JSON independiente.

  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: true,
    low_latency: true,
    end_of_phrase_silence_time: 1.4
  };
{
  "result_index": 0,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "th "
        }
      ]
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "thunderstorms "
        }
      ]
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "thunderstorms could produc "
        }
      ]
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "thunderstorms could produce ",
          "confidence": 0.94
        }
      ]
    }
  ]
}{
  "result_index": 1,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "large "
        }
      ]
    }
  ]
}{
  "result_index": 1,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "large hail ",
          "confidence": 0.91
        }
      ]
    }
  ]
}{
  "result_index": 2,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "and hea "
        }
      ]
    }
  ]
}{
  "result_index": 2,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "and heavy rain ",
          "confidence": 0.86
        }
      ]
    }
  ]
}