Wortzeitdauer wird generiert

Sie können die WebSocket-Schnittstelle des IBM Watson® Text to Speech-Service verwenden, um Taktinformationen für vom Benutzer angegebene Positionen wie Wortgrenzen oder für alle Wörter des Eingabetexts zu erhalten:

  • Schließen Sie das SSML-Element <mark> in den Eingabetext ein, um die Zeit zu ermitteln, zu der die Markierung in den Audiodaten auftritt.
  • Geben Sie den Parameter timings einer JSON-Textnachricht an, um Taktinformationen für alle Zeichenfolgen des Eingabetextes zu erhalten.

Taktinformationen sind bei der Synchronisierung der Audioausgabe mit dem Eingabetext von Nutzen. Sie können beispielsweise die Gesten eines Avatars oder Roboters mit dem Inhalt der synthetisierten Sprache koordinieren.

Das Element <mark> und der Parameter timings sind nur in Verbindung mit der WebSocket-Schnittstelle verfügbar, nicht mit der HTTP-Schnittstelle. Außerdem wird der Parameter timings für Eingabetext in Japanisch nicht unterstützt.

Rückgabe des Worttakts durch den Service

Zur Rückgabe von Markierungs- oder Worttaktinformationen führt der Service ein Multiplexing von unabhängigen binären Datenströmen und Textdatenströmen durch, um seine Antwort zu erstellen:

  • Für jedes Element <mark> wird vom Service eine JSON-Textnachricht zurückgegeben. In jeder Nachricht ist der genaue Zeitpunkt seit dem Beginn der synthetisch erstellten Audioausgabe angegeben, an dem die Markierung vorkommt.
  • Beim Worttakt für alle Zeichenfolgen gibt der Service eine oder mehrere JSON-Textnachrichten zurück. Jede Nachricht enthält ein Array von Wörtern und dessen Start- sowie Endzeitpunkt seit dem Beginn der synthetisch erstellten Audioausgabe.

Die vom Service gesendeten Binärdatenströme und Textdatenströme sind unabhängig. Der Service kann somit die Anzahl der von ihm gelieferten Audioblöcke und den Zeitpunkt für den Empfang der Text- und Audionachrichten durch den Benutzer nur wenig steuern. Falls beispielsweise die Audioausgabe schneller synthetisch erstellt wird, als sie komprimiert werden kann, treffen möglicherweise alle Textnachrichten ein, bevor eine der Audionachrichten empfangen wird.

In der Praxis bedeutet dies, dass der Service eine beliebige Anzahl von Audioblöcken senden kann, also auch mehrere Blöcke von Audiodaten vor und nach jeder Textnachricht. Außerdem kann es vorkommen, dass ein einzelner Binärblock Audiodaten enthält, die den Taktinformationen für eine Markierung oder ein Wort sowohl vorausgehen als auch folgen.

Die Textnachricht, in der die Taktinformationen enthalten sind, trifft jedoch stets vor dem Binärblock ein, der die entsprechende Audioausgabe enthält. Außerdem kommen die Audionachrichten immer der Reihe nach an, sodass Sie vollständige und richtige Audiodaten des synthetisierten Texts aus den binären Ergebnissen erstellen können.

SSML-Markierung angeben

Das optionale SSML-Element <mark> ist ein leerer Tag, der eine Markierung in den zu synthetisierenden Text einfügt. Der Client wird benachrichtigt, sobald der gesamte Text vor dem Element <mark> synthetisiert wurde.

Das Element akzeptiert ein einziges Attribut name, in dem eine Zeichenfolge angegeben ist, die die Markierung eindeutig kennzeichnet. Der Name muss mit einem alphanumerischen Zeichen beginnen. Der Service gibt den Namen zusammen mit dem Zeitpunkt seit Beginn der synthetisch erstellten Audioausgabe zurück, an dem die Markierung vorkommt. Sie können eine beliebige Anzahl von Markierungen in den Eingabetext aufnehmen.

Das folgende JavaScript-Codefragment enthält eine Instanz des Elements <mark> mit dem Namen here:

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

Sobald der Service die synthetische Erstellung von Sprache aus dem Text, der der Markierung vorausgeht, abgeschlossen hat, sendet er eine Textnachricht, in der der Name der Markierung sowie in Sekunden der Zeitpunkt angegeben ist, zu dem die Markierung in der Audioausgabe auftritt:

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

Die Textnachricht, in der die Taktinformationen enthalten sind, trifft stets vor dem Audioblock ein, der die Position der Markierung enthält.

Worttakt für alle Wörter anfordern

Der optionale Parameter timings des JSON-Objekts, das Sie an den Service für eine Anforderung übergeben, gibt Taktinformationen für alle Zeichenfolgen des Eingabetextes zurück. Dadurch entfällt die Angabe des SSML-Elements <mark> für jedes Wort der Eingabe. Übergeben Sie ein Array, das die Zeichenfolge words enthält, um den Worttakt anzufordern. Geben Sie ein leeres Array an oder lassen Sie den Parameter weg, damit keine Taktinformationen empfangen werden.

Der Service gibt den Worttakt über die WebSocket-Verbindung auf dieselbe Weise wie die Taktinformationen für einzelne <mark>-Elemente zurück. Er gibt eine oder mehrere JSON-Textnachrichten zurück. Jede Nachricht enthält ein Array von Wörtern sowie in Sekunden dessen Start- und Endzeitpunkt seit dem Beginn der synthetisch erstellten Audioausgabe. Der folgende Code fordert beispielsweise Worttaktinformationen an:

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

Als Antwort kann der Service die folgenden Textnachrichten zurückgeben:

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

Die Antwort ist nur ein Beispiel. Der Service kann eine oder mehrere Textnachrichten mit Taktinformationen für die Eingabe zurückgeben. Es kann auch für jedes Wort der Eingabe eine separate Textnachricht zurückgegeben werden. Zwischen den einzelnen Nachrichten können außerdem Antworten eintreffen, die Binärblöcke mit Audioausgabe enthalten. Die Textnachricht, in der die Taktinformationen für ein Wort enthalten sind, trifft jedoch immer vor dem Audioblock ein, der das Wort enthält.

Takt für einfachen Text

Der Syntheseprozess des Service beinhaltet einen Schritt für die Textnormalisierung, bei dem Zahlen, Datumsangaben, Uhrzeiten, Geldbeträge, Akronyme und Abkürzungen ausformuliert werden. Die Ergebnisse entsprechen der zu verwendenden Aussprache für solche Zeichenfolgen. Die Zeichenfolge $200 wird beispielsweise in drei Wörtern gesprochen: two, hundred und dollars. Da Worttaktinformationen verwendet werden, um die Audiodaten mit dem Eingabetext zu synchronisieren, gibt der Service Taktinformationen zurück, die der nicht normalisierten Schreibweise der Eingabe entsprechen.

Beispieleingabetext:

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

Der Service gibt den Audiotakt für die folgenden Zeichenfolgen zurück:

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

Obwohl für "-89.2" in der Audioausgabe fünf separate Wörter gesprochen werden (minus, eighty, nine, point, two), stellt die Textnachricht Taktinformationen für die Zeichenfolge als gesamte Einheit mit dem Startzeitpunkt von minus und dem Endzeitpunkt von two bereit.

Wie im vorherigen Beispiel dargestellt können nicht normalisierte Zeichenfolgen auch Satzzeichen enthalten. Der Service bezieht die Interpunktion vor oder nach einem Wort in der Textnachricht ein, die er mit dem Takt zurückgibt. Die Zeichenfolgen "21," und "1983!" enthalten beispielsweise Satzzeichen, die vom Service in der Textnachricht zurückgegeben werden. Die Interpunktion führt zwar zu einer Sprechpause, aber der Audiotakt für das Wort enthält diese Sprechpause nicht.

Dies wird nachfolgend am Beispiel eines Eingabetextes erläutert, der die folgende bedingte Aussage enthält:

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

Der Service gibt Taktinformationen für alle Zeichenfolgen der Eingabe zurück, die Zeichenfolgen "sunny," und "beach." eingeschlossen, die beide mit einem Satzzeichen enden, durch das eine Sprechpause eintritt. Die Taktinformationen für "sunny," enthalten jedoch nicht die Sprechpause, die durch das Komma erzeugt wird, und die Taktinformationen für "beach." enthalten nicht die Sprechpause für den Punkt. Die Informationen bilden nur den Takt der gesprochenen Zeichenfolgen ab.

Takt für SSML-Text

Wenn der Service aus einfachem Text synthetisch Sprache erstellt, gibt er mit Ausnahme von Leerzeichen alle Eingabezeichen der Eingabezeichenfolge in seiner Worttaktantwort zurück. Bei SSML gilt dies nicht, weil manche SSLM-Elemente keine Audioausgabe generieren. Die folgende Liste vermittelt Ihnen einen Überblick über SSML-Elemente, die sich auf Worttaktinformationen auswirken können:

  • <say-as> gibt an, wie der zwischen dem Start- und dem Endtag <say-as> eingeschlossene Text im Normalisierungsschritt gehandhabt werden soll. Mit Attributen wird angegeben, wie der eingebettete Text zu sprechen ist. Das folgende Beispiel zeigt, wie das Datum gesprochen werden soll:

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

    Der Service gibt Taktinformationen für die folgenden Zeichenfolgen zurück: "The", "baby", "was", "born", "on", "3/4/2016." Er normalisiert die Zeichenfolge "3/4/2016" als "march fourth two thousand sixteen". Die Worttaktinformationen für die Zeichenfolge bilden den Startzeitpunkt von "march" und den Endzeitpunkt von "sixteen" ab.

    Im folgenden Beispiel ist angegeben, dass das Wort Hello buchstabiert werden soll:

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

    Der Service gibt Taktinformationen für die Zeichenfolge "Hello." zurück. Das Wort wird vom Service während des Normalisierungsschritts Buchstabe für Buchstabe gesprochen. Die Worttaktinformationen in der Antwort bilden den Startzeitpunkt des Buchstabens "h" und den Endzeitpunkt des Buchstabens "o" ab.

  • <phoneme> stellt eine Aussprache für den zwischen dem Start- und dem Endtag <phoneme> eingeschlossenen Text bereit. Sowohl der Text als auch der Endtag sind optional. Das folgende Beispiel enthält eingebetteten Text und einen Endtag:

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

    Der Service gibt Taktinformationen für die folgenden Zeichenfolgen zurück: "The", "tomato", "was", "ripe."

    Umgekehrt stellt das folgende Beispiel ein monadisches Element <phoneme> ohne eingebetteten Text und ohne Endtag bereit:

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

    In diesem Fall gibt der Service Taktinformationen für die folgenden Zeichenfolgen zurück: "The", "<phoneme>", "was", "ripe."

  • <sub> ersetzt den Text, der im Attribut alias des Elements enthalten ist, durch den zwischen dem Start- und dem Endtag <sub> eingeschlossenen gesprochenen Text in den Audiodaten. Die folgende Eingabe enthält beispielsweise einen einzelnen Tag <sub>:

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

    Der Service erzeugt Taktinformationen für die folgenden Zeichenfolgen: "I", "work", "at", "IBM.".. Er normalisiert die Zeichenfolge "IBM" als "International Business Machines". Die Taktinformationen für die Zeichenfolge bilden den Startzeitpunkt von "International" und den Endzeitpunkt von "Machines" ab.

  • <break> fügt eine Pause in den gesprochenen Text ein. Der Service bildet die resultierende Sprechpause im Worttakt als Lücke zwischen der Endzeit des Worts, das dem Element <break> vorangeht, und der Startzeit des Worts ab, das auf das Element folgt.

  • <paragraph> (oder <p>) können Sprechpausen zu den Audiodaten hinzufügen. Für die Sprechpause werden vom Service keine Taktinformationen zurückgegeben.

  • <sentence> (oder <s>) können Sprechpausen zu den Audiodaten hinzufügen. Für die Sprechpause werden vom Service keine Taktinformationen zurückgegeben.

SSML-Elemente, die in der Liste nicht aufgeführt sind, haben keine Auswirkungen auf die Worttaktinformationen. Weitere Informationen zur Unterstützung des Service für SSML finden Sie in den Erläuterungen zu SSML.

Beispiele mit Markierungselementen

Die folgenden Beispiele zeigen eine einfache WebSocket-Sitzung zwischen einem Client und dem Service. In den Beispielen ist der Datenaustausch dargestellt, nicht der Verbindungsaufbau. Der Client sendet eine Textnachricht, die zwei <mark>-Elemente mit den Namen SIMPLE und EXAMPLE enthält, und fordert die Rückgabe der Audiodaten im WAV-Format an:

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

Der Service sendet zunächst eine Nachricht, um das Audioformat zu bestätigen. Anschließend sendet er mehrere Nachrichten mit den Ergebnissen. Weder die Anzahl der vom Service an den Client gesendeten Audioblöcke noch die Reihenfolge bei der Übermittlung der Text- und Audionachrichten können vom Service garantiert werden.

Beide der folgenden Antworten sind möglich. In beiden Fällen sendet der Service zwei Textnachrichten, die die Positionen der Markierungen im Binärdatenstrom angeben. Er sendet jedoch eine beliebige Anzahl von Binärnachrichten, die die Audioausgabe enthalten. Die Taktinformationen für eine Markierung treffen stets vor dem Audioblock ein, der die Position der Markierung enthält.

  • In der ersten Beispielantwort werden die Textnachrichten mit mehreren Audionachrichten durchsetzt:

    {
      "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....
    
  • In der zweiten Beispielantwort gehen die Textnachrichten vor den Audionachrichten ein:

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