Zwischenergebnisse und geringe Latenzzeit

Mithilfe der WebSocket-Schnittstelle unterstützt der IBM Watson® Speech to Text-Service Zwischenergebnisse, d. h. temporäre Transkriptionshypothesen, die vor den Endergebnissen übermittelt werden. Für die WebSocket- und HTTP-Schnittstellen bieten die meisten Modelle der nächsten Generation auch eine geringe Latenzzeit, um Ergebnisse noch schneller als bisher zurückzugeben, obwohl die Transkriptionsgenauigkeit möglicherweise reduziert wird. Für alle großen Sprachmodelle liegen Zwischenergebnisse vor. Die Genauigkeit kann etwas geringer sein, und niedrige Latenzzeiten werden bei diesen Modellen noch nicht unterstützt.

Zwischenergebnisse

Die Funktion für Zwischenergebnisse ist nur für die WebSocket-Schnittstelle verfügbar.

Zwischenergebnisse sind temporäre Transkriptionshypothesen, die wahrscheinlich noch geändert werden, bevor der Service die Endergebnisse zurückgibt. Zwischenergebnisse werden vom Service zurückgegeben, sobald sie erstellt wurden. Zwischenergebnisse sind hilfreich für interaktive Anwendungen und Transkription in Echtzeit sowie für umfangreiche Audiodatenströme, deren Transkription einige Zeit dauern kann.

Zwischenergebnisse entstehen, während der Service die Verarbeitung einer Äußerung nach und nach fortsetzt. Zwischenergebnisse werden häufiger und schneller erzeugt als Endergebnisse. Sie ermöglichen, dass Ihre Anwendung schneller Antworten zurückgibt, sowie das Überwachen des Transkriptionsfortschritts. Sobald die Verarbeitung einer Äußerung abgeschlossen ist, sendet der Dienst die Endergebnisse, die seine bestmögliche Transkription des Audiomaterials für diese Äußerung darstellen.

Zwischenergebnisse ermöglichen die Gleichstellung von alten und neuen Modellen. Außerdem wird die Latenzzeit für die Nutzer verringert, da die Zwischenergebnisse früher als bisher eintreffen.

  • Zwischenergebnisse werden in einem Transkript durch das Feld "final": falseidentifiziert. Der Service kann Zwischenergebnisse durch genauere Transkripte ersetzen, nachdem weitere Audiodaten verarbeitet wurden. Der Service liefert für jedes Endergebnis mindestens ein Zwischenergebnis.
  • Endergebnisse werden durch das Feld "final": true identifiziert. Die Endergebnisse sind endgültig und werden vom Service nicht mehr aktualisiert.

Wie Sie Zwischenergebnisse abrufen, hängt von der Art des von Ihnen verwendeten Modells ab:

  • Für Zwischenergebnisse setzen Sie den Parameter end_of_phrase_silence_time auf einen anderen Wert als None.
  • Modell der vorherigen Generation: Setzen Sie den Parameter interim_results in der JSON-Nachricht start auf true. Zwischenergebnisse sind für alle Modelle der vorherigen Generation verfügbar.
  • Für ein Modell der nächsten Generation setzen Sie den Parameter interim_results in der JSON-Startnachricht auf true. Sie können auch low_latency auf true setzen, um sowohl Zwischenergebnisse als auch niedrige Latenzzeiten für die Modelle zu ermöglichen.
  • Bei einem großen Sprachmodell, Legen Sie in der JSON-Nachricht „ start “ den Parameter „ interim_results “ auf „ true “ fest. „ low_latency “ wird derzeit nur vom großen Sprachmodell „ en-US “ unterstützt.

Wenn Sie Zwischenergebnisse für ein Modell inaktivieren möchten, lassen Sie den Parameter interim_results weg oder setzen Sie ihn auf false. Inaktivieren Sie Zwischenergebnisse, wenn Sie eine Offline- oder Batch-Transkription durchführen.

Beispiel für Zwischenergebnisse

Im folgenden abgekürzten Beispiel für die WebSocket werden Zwischenergebnisse angefordert. Der Service sendet mehrere Antwortobjekte. Das Attribut final wird nur für die Endergebnisse auf true gesetzt. Die Anforderung verwendet implizit das standardmäßige en-US_BroadbandModelmodell der vorherigen Generation.

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);
}

Die Antwort enthält eine einzelne Äußerung ohne Pausen.

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

Geringe Latenzzeit

Der Parameter „ low_latency “ ist für die meisten Modelle der nächsten Generation sowie für das große Sprachmodell „ en-US “ verfügbar. Der Parameter ist bei Modellen der früheren Generation nicht verfügbar.

Die Multimedia- und Telefonmodelle der nächsten Generation bieten in der Regel schnellere Reaktionszeiten als die Modelle der vorherigen Generation. Aber in manchen Situationen möchten Sie vielleicht schneller Ergebnisse erhalten. Bei Modellen der nächsten Generation, die geringe Latenzzeit unterstützen, können Sie den Parameter low_latency auf true setzen, damit Ergebnisse schneller zurückgegeben werden. Weitere Informationen zu den Modellen der nächsten Generation, die geringe Latenzzeit unterstützen, finden Sie in Unterstützte Sprachmodelle der nächsten Generation.

Durch geringe Latenzzeit liefert der Service schnell Ergebnisse. Dabei kann jedoch die Transkriptionsgenauigkeit beeinträchtigt werden. Wenn geringe Latenzzeit aktiviert ist, teilt der Service die Audiodaten in kleinere Blöcke auf und priorisiert die Geschwindigkeit anstelle der Genauigkeit. Dieser Kompromiss könnte akzeptabel sein, wenn Ihre Anwendung eine kürzere Reaktionszeit benötigt als die höchstmögliche Genauigkeit. Geringe Latenzzeit ist beispielsweise ideal für Anwendungsfälle wie codierte Untertitel, dialogorientierte Anwendungen und Live-Kundenservice im Sprachkanal des IBM® watsonx™ Assistant-Service.

Wenn der Parameter low_latency nicht angegeben wird, können genauere Ergebnissen erzielt werden. Diese Vorgehensweise wird für die meisten Anwendungsfälle empfohlen. Der Parameter low_latency wird standardmäßig auf false gesetzt.

Der Antworttyp für eine Anforderung mit geringer Latenzzeit hängt von der verwendeten Schnittstelle ab:

  • Bei den Schnittstellen HTTP wartet der Dienst, bis er den gesamten Audioeingang erhält, und sendet dann eine Antwort. Anschließend wird ein einzelner Bytedatenstrom als Antwort gesendet. Die Antwort kann mehrere Transkriptionselemente mit mehreren Endergebnissen enthalten und schrittweise gesendet werden. Dennoch handelt es sich um einen einzelnen Datenstrom.
  • Bei Verwendung der WebSocket-Schnittstelle sendet der Service Endergebnisse, sobald sie verfügbar werden. Dabei können mehrere separate Antworten mit verschiedenen Byteströmen gesendet werden. Die Verbindung ist bidirektional und im Vollduplex-Modus; Anfragen und Antworten können über eine einzige Verbindung hin und her fließen, solange diese aktiv bleibt.

Einschränkungen für geringe Latenzzeit

Bei der Nutzung der Funktion für geringe Latenzzeit gelten die folgenden Einschränkungen:

  • Geringe Latenzzeit ist nur für einige Modelle der nächsten Generation verfügbar. Modelle der nächsten Generation, die keine geringe Latenzzeit unterstützen: Wenn Sie den Parameter low_latency in einer Anforderung angeben, schlägt der Service mit dem Statuscode 400 fehl:

    {
      "code": 400,
      "code_description": "Bad Request",
      "error": "low_latency is not a supported feature for model {model_id}"
    }
    
  • Geringe Latenzzeit ist für Modelle der vorherigen Generation nicht verfügbar. Modelle der vorherigen Generation: Wenn Sie den Parameter low_latency in einer Anforderung angeben, gibt der Service eine Warnung aus:

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

Beispiel für geringe Latenzzeit

Im folgenden Beispiel für die HTTP-Schnittstelle wird geringe Latenzzeit mit dem en-US_Telephonymodell angefordert. In diesem Beispiel wird der Abfrageparameter low_latency auf true gesetzt.

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"

Beispiele für Zwischenergebnisse und geringe Latenzzeit

Der folgende abgekürzte WebSocket-Code zeigt, wie Zwischenergebnisse und/oder Ergebnisse mit geringer Latenz über die WebSocket-Schnittstelle angefordert werden. In dem Code sind die folgenden Parameter angeben:

  • Der Abfrageparameter model der Anforderung /v1/recognize übergibt das en-US_Telephonymodell der nächsten Generation, das eine geringe Latenzzeit unterstützt.
  • Der Parameter inactivity_timeout der JSON-Nachricht start setzt das Inaktivitätszeitlimit auf -1 (unbegrenzt), um eine Zeitlimitüberschreitung für die Anforderung zu vermeiden.
  • Die beiden Parameter interim_results und low_latency werden mit der JSON-Nachricht start der Anforderung angegeben.

Um Beispielergebnisse für alle verfügbaren Kombinationen der Parameter bereitzustellen, werden die Argumente für interim_results und low_latency in den folgenden Abschnitten jeweils auf true oder false gesetzt.

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);
}

Die an den Service übergebene WAV-Datei enthält einen einzelnen Satz mit zwei integrierten Pausen, die jeweils mehrere Sekunden dauern: 'Thunderstroms could produce ...Pause... large hail ...Pause... and heavy rain.' Jede Pause dauert so lange, dass der Satz in mehrere Äußerungen aufgeteilt wird und dadurch mehrere Endergebnisse erzeugt werden. Da jede Antwort mehrere Endergebnisse enthält (ein Ergebnis pro Äußerung) müssen Sie die Endergebnisse zu einer einzigen Zeichenfolge zusammenfügen, um das vollständige Transkript anzuzeigen.

Beispiel 1: Zwischenergebnisse und geringe Latenzzeit sind auf 'false' gesetzt

In diesem Beispiel werden interim_results und low_latency auf false gesetzt. Der Service gibt nur Endergebnisse in einem einzelnen JSON-Objekt zurück.

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

Beispiel 2: Zwischenergebnisse sind auf 'false' gesetzt und geringe Latenzzeit ist auf 'true' gesetzt

In diesem Beispiel wird interim_results auf false gesetzt und low_latency auf true. Der Service gibt nur Endergebnisse in einem einzelnen JSON-Objekt zurück.

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

Beispiel 3: Zwischenergebnisse sind auf 'true' gesetzt und geringe Latenzzeit ist auf 'false' gesetzt

In diesem Beispiel wird interim_results auf true und low_latency auf false gesetzt. Dies liefert die Zwischenergebnisse im Modus ohne niedrige Latenz.

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

Beispiel 4: Zwischenergebnisse und geringe Latenzzeit sind auf 'true' gesetzt

In diesem Beispiel werden interim_results und low_latency auf true gesetzt. Der Dienst gibt sowohl Zwischenergebnisse als auch Endergebnisse zurück, wobei jedes Ergebnis als eigenständiges JSON-Objekt zurückgegeben wird.

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