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": trueidentifiziert. 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_timeauf einen anderen Wert alsNone. - Modell der vorherigen Generation: Setzen Sie den Parameter
interim_resultsin der JSON-Nachrichtstartauftrue. Zwischenergebnisse sind für alle Modelle der vorherigen Generation verfügbar. - Für ein Modell der nächsten Generation setzen Sie den Parameter
interim_resultsin der JSON-Startnachricht auftrue. Sie können auchlow_latencyauftruesetzen, 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_latencyin 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_latencyin 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
modelder Anforderung/v1/recognizeübergibt dasen-US_Telephonymodell der nächsten Generation, das eine geringe Latenzzeit unterstützt. - Der Parameter
inactivity_timeoutder JSON-Nachrichtstartsetzt das Inaktivitätszeitlimit auf-1(unbegrenzt), um eine Zeitlimitüberschreitung für die Anforderung zu vermeiden. - Die beiden Parameter
interim_resultsundlow_latencywerden mit der JSON-Nachrichtstartder 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
}
]
}
]
}