Generación de temporizaciones de palabras

Puede utilizar la interfaz WebSocket del servicio IBM Watson® Text to Speech para obtener información de temporización para ubicaciones especificadas por el usuario como, por ejemplo, límites de palabras o para todas las palabras del texto de entrada:

  • Incluya el elemento SSML <mark> en el texto de entrada para identificar la hora a la que se produce el marcador en el audio.
  • Especifique el parámetro timings de un mensaje de texto JSON para obtener información de temporización de todas las series del texto de entrada.

La información de temporización es útil para sincronizar el audio y el texto de entrada. Por ejemplo, puede coordinar los gestos de un avatar o robot con el contenido del discurso sintetizado.

El elemento <mark> y el parámetro timings sólo están disponibles con la interfaz WebSocket, no con la interfaz HTTP. Además, el parámetro timings no recibe soporte para el texto de entrada en japonés.

Cómo devuelve las temporizaciones de palabras el servicio

Para devolver información de temporización de marcas o palabras, el servicio multiplexa secuencias binarias y de texto independientes para generar la respuesta:

  • Para cada elemento <mark>, el servicio devuelve un mensaje de texto JSON. Cada mensaje indica el tiempo exacto desde el principio del audio sintetizado en que se produce la marca.
  • Para temporizaciones de palabra de todas las series, el servicio devuelve uno o más mensajes de texto JSON. Cada mensaje contiene una matriz de palabras y sus tiempos de inicio y de finalización desde el principio del audio sintetizado.

Las secuencias binarias y de texto que envía el servicio son independientes. Por lo tanto, el servicio tiene poco control sobre el número de fragmentos de audio que entrega y de cuándo el usuario recibe los mensajes de texto y de audio. Por ejemplo, si el audio se sintetiza más rápidamente de lo que se comprime, es posible que todos los mensajes de texto lleguen antes que los de audio.

En términos prácticos, el servicio puede enviar un número arbitrario de fragmentos de audio, incluyendo múltiples fragmentos de audio antes y después de cada mensaje de texto. También es posible que un solo fragmento binario contenga datos de audio antes y después de la información de temporización de una marca o una palabra.

Sin embargo, el mensaje de texto que contiene la información de temporización siempre llega antes que el fragmento binario que contiene el audio correspondiente. Además, los mensajes de audio siempre llegan en orden de forma que pueda construir audio completo y preciso del texto sintetizado a partir de los resultados binarios.

Especificar una marca SSML

El elemento SSML opcional <mark> es una etiqueta vacía que coloca un marcador en el texto a sintetizar. El cliente recibe una notificación cuando se ha sintetizado todo el texto que precede al elemento <mark>.

El elemento acepta solo un atributo name que especifica una serie que identifica de forma exclusiva la marca. El nombre debe empezar por un carácter alfanumérico. El servicio devuelve el nombre junto con el tiempo en que se produce la marca desde el principio del audio sintetizado. Puede incluir cualquier número de marcas en el texto de entrada.

El siguiente fragmento de código JavaScript incluye una instancia del elemento <mark> con el nombre here:

function onOpen(evt) {
  var message = {
    text: 'Hello <mark name="here"/> world',
    accept: '*/*'
  };
  websocket.send(JSON.stringify(message));
}

Cuando termina de sintetizar el texto que precede a la marca, el servicio envía un mensaje de texto que identifica el nombre de la marca y el tiempo en segundos en que aparece la marca en el audio:

{
  "marks": [
    ["here", 0.501]
  ]
}

El mensaje de texto que contiene la información de temporización siempre llega antes que el fragmento de audio que contiene la marca.

Solicitar temporizaciones de palabras para todas las palabras

El parámetro opcional timings del objeto JSON que pasa al servicio en una solicitud devuelve información de temporización de todas las series del texto de entrada. Esta funcionalidad elimina la necesidad de especificar el elemento SSML <mark> para cada palabra de la entrada. Pase una matriz que incluya la serie words para solicitar temporizaciones de palabras. Pase una matriz vacía u omita el parámetro si no desea recibir información de temporización.

El servicio devuelve los intervalos de palabras a través de la conexión WebSocket del mismo modo que devuelve información de temporización para elementos <mark> individuales. Devuelve uno o más mensajes de texto JSON. Cada mensaje contiene una matriz de palabras y sus tiempos de inicio y de finalización en segundos desde el principio del audio sintetizado. Por ejemplo, en el ejemplo siguiente se solicita información de temporización de las palabras:

function onOpen(evt) {
  var message = {
    text: 'I have a pet bird.',
    accept: '*/*',
    timings: ['words']
  };
  websocket.send(JSON.stringify(message));
}

Como respuesta, el servicio puede devolver los mensajes de texto siguientes:

{
  "words": [
    [
      "I", 0.0, 0.157
    ],
    [
      "have", 0.157, 0.321
    ],
    [
      "a", 0.321, 0.406
    ]
  ]
}
{
  "words": [
    [
      "pet", 0.406, 0.731
    ],
    [
      "bird.", 0.731, 1.049
    ]
  ]
}

Esta respuesta es sólo un ejemplo. El servicio puede devolver uno o más mensajes de texto con la información de temporización de la entrada. También puede devolver un mensaje de texto distinto para cada palabra de la entrada. Además, los mensajes pueden ir intercalados con respuestas que contengan fragmentos binarios de audio. Pero el mensaje de texto que contiene la información de temporización de una palabra siempre llega antes que el fragmento de audio que contiene esa palabra.

Temporizaciones para texto sin formato

El proceso de síntesis del servicio incluye un paso de normalización de texto que deletrea números, fechas, horas, importes monetarios, acrónimos y abreviaturas. Los resultados corresponden a la forma en que se dicen dichas series. Por ejemplo, la serie $200 se lee con tres palabras two, hundred y dollars. Debido a que la información de sincronización de palabras se utiliza para sincronizar el audio con el texto de entrada, el servicio devuelve información de sincronización que corresponde a la ortografía no normalizada de la entrada.

Por ejemplo, imaginemos el texto de entrada siguiente:

The coldest recorded temperature is -89.2 degrees Celsius in Antarctica on July 21, 1983!

El servicio devuelve temporizaciones de audio para las series siguientes:

"The", "coldest", "recorded", "temperature", "is", "-89.2", "degrees", "Celsius", "in", "Antarctica", "on", "July", "21,", "1983!"

Aunque "-89.2" se dice en el audio con cinco palabras distintas (minus, eighty, nine, point, two), el mensaje de texto proporciona información de temporización de la serie como si fuera una sola unidad, con el momento de inicio de minus y el momento de finalización de two.

Como en el ejemplo anterior, las series no normalizadas también pueden contener puntuación. El servicio incluye la puntuación que precede o sigue a una palabra en el mensaje de texto que devuelve con las temporizaciones. Por ejemplo, las series "21," y "1983!" incluyen puntuación que el servicio devuelve en su mensaje de texto. Aunque la puntuación se traduce en silencio, la temporización de audio de la palabra no incluye el silencio.

Por ejemplo, imaginemos un texto de entrada que contiene la siguiente oración condicional:

If it is sunny, I will go to the beach.

El servicio devuelve información de temporización para todas las series de la entrada, incluyendo "sunny," y "beach.", que las dos terminan en una puntuación que produce silencio. Pero la información de tiempo para "sunny," no incluye el silencio producido por la coma, y la información de tiempo para "beach." no incluye el silencio del punto. La información refleja únicamente la temporización de las series habladas.

Temporizaciones para texto SSML

Cuando el servicio sintetiza texto sin formato, devuelve todos los caracteres de entrada excepto los espacios en blanco como parte de las series en su respuesta de temporización de palabras. No ocurre lo mismo con SSML, puesto que algunos elementos SSML no generan audio. En la lista siguiente se resumen los elementos SSML que pueden afectar a la información de temporización de palabras:

  • <say-as> indica cómo se va a manejar el texto entre las etiquetas <say-as> de apertura y cierre en el paso de normalización. Los atributos especifican cómo se debe leer el texto que se incluye. En el ejemplo siguiente se indica cómo se va a pronunciar la fecha:

    The baby was born on <say-as interpret-as="date" format="mdy">3/4/2016</say-as>.
    

    El servicio devuelve información de temporización para las series siguientes: "The", "baby", "was", "born", "on", "3/4/2016." El servicio normaliza la serie "3/4/2016" como "march fourth two thousand sixteen". La información de temporización de palabras para la serie refleja el momento de inicio de "march" y el momento de finalización de "sixteen".

    En el ejemplo siguiente se indica que la palabra Hello se tiene que deletrear:

    <say-as interpret-as="letters">Hello</say-as>.
    

    El servicio devuelve información de temporización para la serie "Hello.". El servicio deletrea la palabra letra por letra durante el paso de normalización. La información de temporización de palabras de la respuesta indica el momento de inicio de la letra "h" y el momento de finalización de la letra "o".

  • <phoneme> proporciona una pronunciación para el texto está entre las etiquetas <phoneme> de apertura y cierre. Pero tanto el texto como la etiqueta de cierre son opcionales. En el ejemplo siguiente hay texto y etiqueta de cierre para este atributo:

    The <phoneme alphabet="ibm" ph=".0tx.1me.0fo">tomato</phoneme> was ripe.
    

    El servicio devuelve información de temporización para las series siguientes: "The", "tomato", "was", "ripe."

    En cambio, el ejemplo siguiente proporciona un elemento <phoneme> unario sin texto incorporado ni etiqueta de cierre:

    The <phoneme alphabet="ibm" ph=".0tx.1me.0fo"/> was ripe.
    

    En este caso, el servicio devuelve información de temporización para las series siguientes: "The", "<phoneme>", "was", "ripe."

  • <sub> sustituye el texto que se incluye en el atributo alias del elemento por el texto que se adjunta entre las etiquetas <sub> de apertura y cierre en el audio hablado. Por ejemplo, la siguiente entrada incluye una sola etiqueta <sub>:

    I work at <sub alias="International Business Machines">IBM</sub>.
    

    El servicio genera información de temporización para las siguientes series: "I", "work", "at", "IBM.". El servicio normaliza la serie "IBM" como "International Business Machines". La información de temporización de la serie refleja el momento de inicio de "International" y el momento de finalización de "Machines".

  • <break> inserta una pausa en el texto hablado. El servicio refleja el silencio resultante en las temporizaciones de palabras como un espacio entre la hora de finalización de la palabra que precede al elemento <break> y la hora de inicio de la palabra que sigue al elemento.

  • <paragraph> (o <p>) puede añadir silencio al audio. El servicio no devuelve información de temporización para el silencio.

  • <sentence> (o <s>) puede añadir silencio al audio. El servicio no devuelve información de temporización para el silencio.

Los elementos SSML que no se mencionan en la lista no afectan a la información de temporización de palabras. Para obtener más información sobre el soporte del servicio para SSML, consulte Información sobre SSML.

Ejemplos con elementos mark

En los ejemplos siguientes se muestra una sesión de WebSocket simple entre un cliente y el servicio. Los ejemplos se centran en el intercambio de datos, no en la apertura de la conexión. El cliente envía un mensaje de texto que incluye dos elementos <mark>, denominados SIMPLE y EXAMPLE, y solicita que se devuelva el audio en formato WAV:

{
  "text": "This is a <mark name=\"SIMPLE\"/>simple <mark name=\"EXAMPLE\"/> example.",
  "accept": "audio/wav"
}

El servicio primero envía un mensaje para confirmar el formato de audio. Después envía varios mensajes con los resultados. El servicio no puede garantizar el número de fragmentos de audio que envía al cliente ni el orden en el que se entregan los mensajes de texto y de audio.

Las dos respuestas siguientes son posibles. En cada caso, el servicio envía dos mensajes de texto que identifican las ubicaciones de las marcas en la secuencia binaria. Pero envía un número arbitrario de mensajes binarios que contienen el audio. La información de temporización de una marca siempre llega antes que el bloque de audio que contiene la ubicación de la marca.

  • En la primera respuesta de ejemplo, los mensajes de texto se intercalan con varios mensajes de audio:

    {
      "binary_streams": [
        {
          "content_type": "audio/wav"
        }
      ]
    }
    ... One or more chunks of binary audio.
        All audio precedes the SIMPLE mark....
    {
      "marks": [
        [
          "SIMPLE", 0.784
        ]
      ]
    }
    ... One or more chunks of binary audio audio can precede
        and follow the SIMPLE mark.
        All audio precedes the EXAMPLE mark....
    {
      "marks": [
        [
          "EXAMPLE", 1.003
        ]
      ]
    }
    ... One or more chunks of binary audio.
        Audio can precede and follow the EXAMPLE mark....
    
  • En la segunda respuesta de ejemplo, los mensajes de texto llegan antes de ninguno de los mensajes de audio:

    {
      "binary_streams": [
        "content_type": "audio/wav"}
      ]
    }
    {
      "marks": [
        [
          "SIMPLE", 0.784
        ]
      ]
    }
    {
      "marks": [
        [
          "EXAMPLE", 1.003
        ]
      ]
    }
    ... One or more chunks of binary audio....