Résultats temporaires et faible temps d'attente
Avec l'interface WebSocket, le service IBM Watson® Speech to Text prend en charge les résultats provisoires, qui sont des hypothèses de transcription provisoires qui arrivent avant les résultats finaux. Pour les interfaces WebSocket et HTTP, la plupart des modèles nouvelle génération offrent également un faible temps d'attente pour renvoyer les résultats encore plus rapidement que ce n'est déjà le cas, bien que cela puisse réduire précision de la transcription. Des résultats provisoires sont disponibles pour tous les grands modèles de synthèse vocale. La précision peut être légèrement inférieure et la faible latence n'est pas encore prise en charge pour ces modèles.
Résultats intermédiaires (Interim results)
La fonction de résultats intermédiaires (Interim results) est disponible uniquement avec l'interface WebSocket.
Les résultats provisoires sont des hypothèses de transcription intermédiaires qui sont susceptibles de changer avant que le service ne retourne ses résultats finaux. Le service renvoie des résultats intermédiaires dès qu'il les génère. Les résultats provisoires sont utiles pour les applications interactives et la transcription en temps réel, et pour les longs flux audio, dont la transcription peut prendre un certain temps.
Les résultats provisoires évoluent au fur et à mesure que le traitement des énoncés progresse. Ils arrivent plus souvent et plus rapidement que les résultats finaux. Vous pouvez les utiliser pour permettre à votre application de répondre plus rapidement ou de mesurer l'évolution de la transcription. Une fois le traitement d'un enregistrement terminé, le service envoie les résultats finaux, qui correspondent à sa meilleure transcription de l'enregistrement audio correspondant à cet enregistrement.
Les résultats intermédiaires permettent d'assurer la parité des caractéristiques entre les anciens et les nouveaux modèles. Il réduit également le temps de latence pour les utilisateurs, car les résultats intermédiaires arrivent plus tôt qu'auparavant.
- Les résultats provisoires sont identifiés dans une transcription avec la zone
"final": false. Le service peut mettre à jour les résultats provisoires avec des transcriptions plus précises lorsqu'il traite d'autres sons. Le service fournit un ou plusieurs résultats provisoires pour chaque résultat final. - Les résultats finaux sont identifiés par la zone
"final": true. Le service n'effectue plus de mise à jour dans les résultats finaux.
La manière dont vous demandez les résultats intermédiaires dépend du type de modèle que vous utilisez :
- Pour obtenir des résultats intermédiaires, réglez le paramètre
end_of_phrase_silence_timesur une valeur autre queNone. - Pour un modèle de génération précédente, définissez le paramètre
interim_resultssurtruedans le message JSONstart. Des résultats provisoires sont disponibles pour tous les modèles de génération précédente. - Pour un modèle de nouvelle génération, définissez le paramètre
interim_resultssurtruedans le message de démarrage JSON. Vous pouvez également définirlow_latencysurtruepour activer à la fois les résultats intermédiaires et la faible latence pour les modèles. - Pour un modèle vocal de grande taille, définissez la valeur de «
interim_results» sur «true» dans le message JSONstart. La valeur «low_latency» n’est actuellement prise en charge que par le modèle vocal de grande tailleen-US.
Pour désactiver les résultats provisoires pour n'importe quel modèle, omettez le paramètre interim_results ou définissez-le sur false. Désactivez les résultats provisoires si vous faites une transcription hors ligne
ou par lots.
Exemple de résultats intermédiaires
L'exemple WebSocket abrégé demande des résultats provisoires. Le service envoie plusieurs objets de réponse. Il définit l'attribut final sur true uniquement pour les résultats finaux. La requête utilise implicitement
la génération précédente en-US_BroadbandModel par défaut.
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);
}
La réponse comprend une déclaration unique sans pauses.
{
"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
}
]
}
Faible temps d'attente
Le paramètre « low_latency » est disponible pour la plupart des modèles de nouvelle génération et pour le modèle vocal de grande taille « en-US ». Le paramètre n'est pas disponible avec les modèles de génération précédente.
Les modèles multimédias et de téléphonie de nouvelle génération ont généralement des temps de réponse plus rapides que les modèles de génération précédente. Mais dans certaines situations, vous pouvez souhaiter recevoir des résultats plus rapidement.
Avec les modèles de nouvelle génération qui prennent en charge un faible temps d'attente, vous pouvez définir le paramètre low_latency sur true pour recevoir des résultats plus rapidement. Pour plus d'informations
sur les modèles de nouvelle génération qui prennent en charge un faible temps d'attente, voir Modèles de langue de nouvelle génération pris en charge.
Avec un faible temps d'attente, le service obtient des résultats plus rapides aux dépens de l'exactitude de la transcription. Lorsque le faible temps d'attente est activé, le service segmente l'audio en blocs plus petits afin d'optimiser la vitesse au détriment de la précision. Ce compromis pourrait être acceptable si votre application privilégie un temps de réponse plus court plutôt qu'une précision maximale. Par exemple, un faible temps d'attente est idéal pour les cas d'utilisation tels que le sous-titrage codé, les applications conversationnelles et le service à la clientèle en direct dans le canal vocal du service IBM® watsonx™ Assistant.
L'omission du paramètre low_latency peut produire des résultats plus précis et constitue l'approche recommandée pour la plupart des cas d'utilisation. Le paramètre low_latency est false par défaut.
La nature de la réponse à une demande qui inclut un faible temps d'attente dépend de l'interface utilisée :
- Avec les interfaces HTTP, le service attend de recevoir l'intégralité de l'entrée audio avant d'envoyer une réponse. Il envoie ensuite un seul flux d'octets en réponse. La réponse peut inclure plusieurs éléments de transcription avec des résultats finaux multiples, et elle peut être envoyée de façon incrémentielle. Cependant, il s'agit d'un flux de données unique.
- Avec l'interface WebSocket, le service envoie les résultats finaux dès qu'ils sont disponibles. Il peut envoyer plusieurs réponses indépendantes sous la forme de différents flux d'octets. La connexion est bidirectionnelle et en duplex intégral; les requêtes et les réponses peuvent continuer à circuler dans les deux sens sur une seule connexion tant que celle-ci reste active.
Restrictions relatives au faible temps d'attente
La fonction de faible temps d'attente comporte les restrictions sur l'utilisation suivantes :
-
Un faible temps d'attente n'est disponible que pour certains modèles de nouvelle génération. Pour les modèles de nouvelle génération qui ne prennent pas en charge le faible temps d'attente, si vous incluez le paramètre
low_latencyavec une demande, le service échoue avec le code d'état 400 :{ "code": 400, "code_description": "Bad Request", "error": "low_latency is not a supported feature for model {model_id}" } -
Le faible temps d'attente n'est pas disponibles pour les modèles de génération précédente. En ce qui concerne les modèles de génération antérieure, si vous incluez le paramètre
low_latencyavec une demande, le service génère un avertissement :"warnings": [ "Unknown arguments: low_latency." ]
Exemple de faible temps d'attente
L'exemple HTTP synchrone suivant demande un faible temps d'attente avec le modèle en-US_Telephony. L'exemple définit le paramètre de requête low_latency sur true.
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"
Exemples de résultats provisoires et de faible temps d'attente
Le code WebSocket abrégé suivant montre comment demander des résultats provisoires, des résultats à faible temps d'attente ou les deux avec l'interface WebSocket. Il spécifie les paramètres suivants :
- Le paramètre de requête
modelde la requête/v1/recognizetransmet le modèleen-US_Telephonyde nouvelle génération, qui prend en charge le faible temps d'attente. - Le paramètre
inactivity_timeoutdu message JSONstartdéfinit le délai d'inactivité sur-1(infini), ce qui empêche le dépassement du délai d'attente de la requête. - Les paramètres
interim_resultsetlow_latencysont spécifiés avec le message JSONstartde la requête.
Pour afficher des exemples de résultats avec toutes les combinaisons de paramètres possibles, les arguments de interim_results et low_latency sont définis sur true ou false dans les exemples
des sections suivantes.
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);
}
Le fichier WAV transmis au service comprend une seule phrase avec deux pauses multiples imbriquées : « Des orages peuvent se produire... Pause... de la grêle ...Pause... et de fortes pluies ». Les pauses sont suffisamment longues pour représenter des énoncés séparés et générer ainsi de multiples résultats finaux. Parce que chaque réponse inclut plusieurs résultats finaux, un par énoncé, vous devez assembler les résultats finaux en une seule chaîne pour voir la transcription complète.
Exemple 1 : les résultats provisoires et le faible temps d'attente sont tous deux faux
Cet exemple définit interim_results et low_latency sur false. Le service renvoie uniquement les résultats finaux en tant qu'objet JSON unique.
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
}
]
}
]
}
Exemple 2 : les résultats provisoires sont faux et le faible temps d'attente est vrai
Cet exemple définit interim_results sur false et low_latency sur true. Le service renvoie uniquement les résultats finaux en tant qu'objet JSON unique.
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
}
]
}
]
}
Exemple 3 : les résultats provisoires sont vrais et le faible temps d'attente est faux
Cet exemple définit interim_results comme étant true et low_latency comme étant faux. Cette méthode renvoie les résultats intermédiaires en utilisant un mode de fonctionnement sans faible latence.
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
}
]
}
]
}
Exemple 4 : les résultats provisoires et le faible temps d'attente sont tous deux vrai
Cet exemple définit interim_results et low_latency sur true. Le service renvoie à la fois des résultats intermédiaires et des résultats finaux, et chaque résultat est renvoyé sous la forme d'un objet
JSON distinct.
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
}
]
}
]
}