Generazione di timings word

Puoi utilizzare l'interfaccia WebSocket del servizio IBM Watson® Text to Speech per ottenere le informazioni di temporizzazione per le posizioni specificate dall'utente quali i limiti di parola o per tutte le parole del testo di input:

  • Includere l'elemento SSML <mark> in testo di input per identificare l'orario in cui il marcatore si verifica nell'audio.
  • Specifica il parametro timings di un messaggio di testo JSON per ottenere le informazioni di temporizzazione per tutte le stringhe del testo di input.

Le informazioni di temporizzazione sono utili per sincronizzare l'audio e il testo di input. Ad esempio, è possibile coordinare i gesti di un avatar o di un robot con il contenuto del discorso sintetizzato.

L'elemento <mark> e il parametro timings sono disponibili solo con l'interfaccia WebSocket, non con l'interfaccia HTTP. Inoltre, il parametro timings non è supportato per il testo di input in giapponese.

In che modo il servizio restituisce le temporizzazioni delle parole

Per restituire le informazioni di temporizzazione delle parole o di un contrassegno, il servizio multiplexa flussi di testo e binari indipendenti per costruire la tua risposta:

  • Per ogni elemento <mark> il servizio restituisce un messaggio di testo JSON. Ogni messaggio indica il tempo esatto, dall'inizio dell'audio sintetizzato, in cui viene utilizzato il contrassegno.
  • Per le temporizzazioni delle parole per tutte le stringhe, il servizio restituisce uno o più messaggi di testo JSON. Ogni messaggio contiene un array di parole e i tempi di inizio e di fine dall'inizio dell'audio sintetizzato.

I flussi di testo e binari che il servizio invia sono indipendenti. Quindi il servizio ha poco controllo sul numero di blocchi audio che consegna e su quando l'utente riceve i messaggi audio e di testo. Ad esempio, se l'audio viene sintetizzato più velocemente di quando viene compresso, tutti i messaggi di testo potrebbero arrivare prima di quelli audio.

In termini pratici, il servizio può inviare un numero arbitrario di blocchi audio, inclusi più blocchi audio prima e dopo ciascun messaggio di testo. È anche possibile che un singolo blocco binario contenga i dati audio che precedono e seguono le informazioni di temporizzazione per un contrassegno o una parola.

Tuttavia, il messaggio di testo che contiene le informazioni di temporizzazione arriva sempre prima del blocco binario che contiene l'audio corrispondente. Inoltre, i messaggi audio arrivano sempre in ordine in modo da poter costruire un audio completo e accurato del testo sintetizzato dai risultati binari.

Specifica di un contrassegno SSML

L'elemento SSML <mark> opzionale è un tag vuoto che pone un marker nel testo da sintetizzare. Il client viene notificato quando tutto il testo che precede l'elemento <mark> è stato sintetizzato.

L'elemento accetta un singolo attributo name che specifica una stringa che identifica in modo univoco il contrassegno. Il nome deve iniziare con un carattere alfanumerico. Il servizio restituisce il nome insieme al tempo in cui si presenta il contrassegno dall'inizio dell'audio sintetizzato. Puoi includere qualsiasi numero di contrassegni nel testo di input.

Il seguente snippet di codice JavaScript include un'istanza dell'elemento <mark> con il nome here:

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

Quando finisce di sintetizzare il testo che precede il contrassegno, il servizio invia un messaggio di testo che identifica il nome del contrassegno e il tempo, in secondi, in cui si presenta il contrassegno nell'audio:

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

Il messaggio di testo che contiene le informazioni di temporizzazione arriva sempre prima del blocco audio che contiene la posizione del contrassegno.

Richiesta delle temporizzazioni delle parole per tutte le parole

Il parametro timings facoltativo dell'oggetto JSON che passi al servizio per una richiesta restituisce le informazioni di temporizzazione per tutte le stringhe del testo di input. Questa convenienza elimina la necessità di specificare l'elemento SSML <mark> per ogni parola dell'input. Passa un array che include la stringa words per richiedere le temporizzazioni delle parole. Passa un array vuoto oppure ometti il parametro per non ricevere alcuna informazione di temporizzazione.

Il servizio restituisce i timings sopra la connessione WebSocket nello stesso modo in cui restituisce informazioni di timing per singoli elementi <mark> . Restituisce uno o più messaggi di testo JSON. Ogni messaggio contiene un array di parole e i tempi di inizio e di fine, in secondi, dall'inizio dell'audio sintetizzato. Ad esempio, il seguente esempio richiede le informazioni di temporizzazione delle parole:

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

In risposta, il servizio può restituire i seguenti messaggi di testo:

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

La risposta è solo un esempio. Il servizio può restituire uno o più messaggi di testo con le informazioni di temporizzazione per l'input. Può anche restituire un messaggio di testo separato per ogni parola dell'input. Inoltre, i messaggi possono essere intervallati con risposte che contengono i blocchi binari di audio. Tuttavia, il testo del messaggio che contiene le informazioni di temporizzazione per una parola arriva sempre prima del blocco audio che contiene tale parola.

Temporizzazioni per il testo semplice

Il processo di sintesi del servizio comporta una fase di normalizzazione del testo che specifica numeri, date, ore, importi monetari, acronimi e abbreviazioni. I risultati corrispondono a come vengono pronunciate tali stringhe. Ad esempio, la stringa $200 viene pronunciata come composta da tre parole: two, hundred e dollars. Poiché le informazioni relative ai tempi di parola vengono utilizzate per sincronizzare l'audio con il testo di input, il servizio restituisce informazioni di timing che corrispondono alla grafia non normalizzata dell'input.

Ad esempio, considera il seguente testo di input:

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

Il servizio restituisce le temporizzazioni audio per le seguenti stringhe:

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

Sebbene "-89.2" venga pronunciato nell'audio come cinque parole separate (minus, eighty, nine, point, two), il messaggio di testo fornisce le informazioni di temporizzazione per la stringa come una singola unità con il tempo di inizio minus e il tempo di fine two.

Come nell'esempio precedente, le stringhe non normalizzate possono contenere anche la punteggiatura. Il servizio include la punteggiatura che precede o segue una parola nel messaggio di testo restituito con le temporizzazioni. Ad esempio, le stringhe "21," e "1983!" includono la punteggiatura che il servizio restituisce nel suo messaggio di testo. Sebbene la punteggiatura generi un'assenza di suono, la temporizzazione dell'audio per la parola non include tale assenza.

Ad esempio, considera il testo di input che contiene la seguente frase condizionale:

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

Il servizio restituisce le informazioni di timing per tutte le stringhe dell'input, tra cui "sunny," e "spiaggia.", entrambi terminati in punteggiatura che produce il silenzio. Ma le informazioni di timing per "sunny," non includono il silenzio che viene prodotto dalla virgola, e le informazioni di timing per "spiaggia." non include il silenzio per il periodo. Le informazioni riflettono solo la temporizzazione delle stringhe pronunciate.

Temporizzazioni per il testo SSML

Quando il servizio sintetizza il testo semplice, restituisce tutti i caratteri di input ad eccezione degli spazi vuoti come parte delle stringhe nella sua risposta di temporizzazione delle parole. Ciò non si verifica con SSML, in quanto alcuni elementi SSML non generano audio. L'elenco riportato di seguito riepiloga gli elementi SSML che possono influire sulle informazioni di temporizzazione delle parole:

  • <say-as> indica come il testo racchiuso tra i tag <say-as> di apertura e chiusura deve essere gestito nel passo di normalizzazione. Gli attributi specificano in che modo deve essere pronunciato il testo integrato. Il seguente esempio indica in che modo deve essere pronunciata la data:

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

    Il servizio restituisce le informazioni di temporizzazione per le seguenti stringhe: "The", "baby", "was", "born", "on", "3/4/2016." Il servizio normalizza la stringa "3/4/2016" come "march fourth two thousand sixteen". Le informazioni di temporizzazione delle parole per la stringa riflettono il tempo di inizio "march" e il tempo di fine "sixteen".

    Il seguente esempio indica che deve essere specificata la parola Hello:

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

    Il servizio restituisce informazioni temporali per la stringa "Hello.". Il servizio specifica la parola lettera per lettera durante la fase di normalizzazione. Le informazioni di temporizzazione delle parole nella risposta riflettono il tempo di inizio della lettera "h" e il tempo di fine della lettera "o".

  • <phoneme> fornisce una pronuncia per il testo racchiuso nei tag <phoneme> di apertura e chiusura. Tuttavia, sia il testo che la tag di chiusura sono facoltativi. Il seguente esempio include il testo integrato e una tag di chiusura:

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

    Il servizio restituisce le informazioni di temporizzazione per le seguenti stringhe: "The", "tomato", "was", "ripe."

    Viceversa, il seguente esempio fornisce un elemento <phoneme> unario senza testo incorporato e nessun tag di chiusura:

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

    In questo caso, il servizio restituisce le informazioni di timing per le seguenti stringhe: "Il", "\ < phoneme>", "era", "matita."

  • <sub> sostituisce il testo incluso nell'attributo alias dell'elemento per il testo racchiuso tra i tag <sub> di apertura e chiusura nell'audio parlato. Ad esempio, il seguente input include un singolo tag <sub> :

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

    Il servizio produce informazioni di timing per le seguenti stringhe: "I", "work", "at", "IBM.". Il servizio normalizza la stringa "IBM" come "International Business Machines". Le informazioni di temporizzazione per la stringa riflettono il tempo di inizio "International" e il tempo di fine "Machines".

  • <break> inserisce una pausa nel testo pronunciato. Il servizio riflette il conseguente silenzio nella parola timings come un gap tra l'ora di fine della parola che precede l'elemento <break> e l'ora di inizio della parola che segue l'elemento.

  • <paragraph> (o <p>) può aggiungere il silenzio all'audio. Il servizio non restituisce le informazioni di temporizzazione per l'assenza di suono.

  • <sentence> (o <s>) può aggiungere il silenzio all'audio. Il servizio non restituisce le informazioni di temporizzazione per l'assenza di suono.

Gli elementi SSML che non vengono menzionati nell'elenco non influiscono sulle informazioni di temporizzazione delle parole. Per ulteriori informazioni sul supporto del servizio per SSML, consultare Understanding SSML.

Esempi di elementi mark

I seguenti esempi mostrano una sessione WebSocket semplice tra un client e il servizio. Gli esempi si concentrano sullo scambio di dati, non sull'apertura della connessione. Il client invia un messaggio di testo che include due elementi <mark> , denominati SIMPLE e EXAMPLEe che richiede l'audio da restituire in formato WAV:

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

Il servizio invia innanzitutto un messaggio per confermare il formato audio. Poi invia più messaggi con i risultati. Il servizio non può garantire il numero di blocchi audio che invia al client o l'ordine in cui vengono consegnati i messaggi audio e di testo.

Sono possibili entrambe le risposte riportate di seguito. In ogni caso, il servizio invia due messaggi di testo che identificano le posizioni dei contrassegni nel flusso binario. Tuttavia, invia un numero arbitrario di messaggi binari che contengono l'audio. Le informazioni di temporizzazione per un contrassegno arrivano sempre prima del blocco audio che contiene la posizione del contrassegno.

  • Nella risposta di primo esempio, i messaggi di testo sono intervallati da più messaggi 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....
    
  • Nella risposta di secondo esempio, i messaggi di testo arrivano prima di qualsiasi messaggio audio:

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