中間結果および低遅延

WebSocket インターフェースでは、IBM Watson® Speech to Text サービスは中間結果をサポートします。それは、最終結果の前に到着する中間書き起こし仮説です。 WebSocket インターフェースと HTTP インターフェースの場合、ほとんどの次世代モデルでは、書き起こしの正確度は低下する可能性がありますが、結果を返すための待ち時間が従来よりもさらに短縮されます。 すべての大規模な音声モデルについて、中間結果が公開されています。 精度は若干落ちる可能性があり、低遅延はこれらのモデルではまだサポートされていない。

中間結果

中間結果機能は、WebSocket インターフェースでのみ使用できます。

中間結果は、サービスが最終結果を返す前に変更される可能性が高い中間書き起こし仮説です。 サービスは中間結果を生成すると、すぐに返します。 中間結果は、対話式アプリケーションやリアルタイムの書き起こし、および書き起こしには時間がかかる可能性のある長い音声ストリームに役立ちます。

中間結果は、サービスによる発話の処理が進行するにつれて変化します。 それらは、最終結果よりも頻繁に、より迅速に到着します。 これらを使用して、アプリケーションがより迅速に応答できるようにしたり、書き起こしの進行状況を測定したりすることができます。 発話の処理が完了すると、本サービスは、その発話に対する音声の最良の文字起こし結果を表す最終結果を送信します。

中間結果は、新旧モデルの機能パリティを可能にする。 また、中間結果が以前よりも早く届き始めるため、ユーザーによる待ち時間も短縮される。

  • 中間結果は、フィールド "final": false を使用してトランスクリプト内で識別されます。 このサービスは、さらに音声を処理する際に、より正確な書き起こしを使用して中間結果を更新できます。 サービスは、最終結果ごとに 1 つ以上の中間結果を提供します。
  • 最終結果は、フィールド "final": true を使用して識別されます。 サービスは最終結果を更新しません。

中間結果の取得方法は、使用しているモデルの種類によって異なります:

  • 中間結果を得るには、 end_of_phrase_silence_time パラメータを None 以外の値に設定する。
  • *前世代モデルの場合、*JSON start メッセージで interim_results パラメーターを true に設定します。 中間結果はすべての前世代モデルで使用可能です。
  • 次世代モデルの場合、 JSON開始メッセージの interim_results パラメータを true に設定する。 また、 low_latencytrue に設定すると、中間結果と低遅延の両方をモデルで同時に有効にすることができる。
  • 大規模な音声モデルの場合、 JSONの start メッセージ内で interim_resultstrue に設定してください。 low_latency は現在、 en-US の大規模音声モデルのみでサポートされています。

任意のモデルの中間結果を無効にするには、interim_results パラメーターを省略するか、false に設定します。 オフラインまたはバッチの書き起こしを行う場合は、中間結果を無効にします。

中間結果の例

以下の省略された WebSocket の例は、中間結果を要求します。 サービスは複数の応答オブジェクトを送信します。 最終結果の場合のみ、final 属性を true に設定します。 要求は、デフォルトの前世代 en-US_BroadbandModel を暗黙的に使用します。

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

応答には、休止のない単一の発話が含まれます。

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

低遅延

low_latency パラメータは、ほとんどの次世代モデルおよび en-US の大型音声モデルで利用可能です。 このパラメーターは、前世代モデルでは使用できません。

次世代のマルチメディア・モデルとテレフォニー・モデルは、通常、前世代モデルよりも応答時間が速くなります。 しかし、状況によってはもっと早く結果を出したい場合もあるだろう。 低遅延をサポートする次世代モデルでは、low_latency パラメーターを true に設定して、より迅速に結果を受け取ることができます。 低遅延をサポートする次世代モデルについて詳しくは、サポートされる次世代言語モデルを参照してください。

低遅延では、サービスは結果をより迅速に実現しますが、書き起こしの正確度が低下する可能性があります。 低遅延が有効になっている場合、サービスは音声をより小さいチャンクにセグメント化して、正確度を超える速度に最適化します。 アプリケーションにおいて、最高の精度よりも応答時間の短縮が優先されるのであれば、このトレードオフは許容できるかもしれません。 例えば、IBM® watsonx™ Assistant サービスの音声チャネルでのクローズド・キャプション、会話型アプリケーション、およびライブ・カスタマー・サービスなどのユース・ケースには、低遅延が理想的です。

low_latency パラメーターを省略すると、より正確な結果が得られる可能性があります。これは、ほとんどのユース・ケースで推奨される方法です。 low_latency パラメーターは、デフォルトでは false です。

低遅延を含む要求に対する応答の性質は、使用されるインターフェースによって異なります。

  • HTTP インターフェースでは、サービスはオーディオ入力をすべて受信するまで待機し、それから応答を送信する。 その後、応答として単一のバイト・ストリームを送信します。 応答には、複数の最終結果を持つ複数の書き起こし要素を含めることができ、増分的に送信することができます。 しかし、これは単一のデータ・ストリームです。
  • WebSocket インターフェースでは、サービスは使用可能になったときに最終結果を送信します。 異なるバイト・ストリームの形式で複数の独立した応答を送信することができます。 この接続は双方向かつ全二重であり、接続がアクティブな間は、リクエストとレスポンスが単一の接続を介して絶えずやり取りされ続けます。

低遅延の制約事項

低遅延機能には、以下の使用上の制約事項があります。

  • 低遅延は、一部の次世代モデルでのみ使用可能です。 低遅延をサポートしない次世代モデルの場合、要求に low_latency パラメーターを含めると、サービスは状況コード 400 で失敗します。

    {
      "code": 400,
      "code_description": "Bad Request",
      "error": "low_latency is not a supported feature for model {model_id}"
    }
    
  • 低遅延は**前世代モデルで使用できません。 前世代モデルの場合、要求に low_latency パラメーターを含めると、サービスによって警告が生成されます。

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

低遅延の例

以下の同期 HTTP の例では、en-US_Telephony モデルを使用して低遅延を要求します。 この例では、low_latency 照会パラメーターを 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"

中間結果および低遅延の例

以下の省略形の WebSocket コードは、WebSocket インターフェースを使用して中間結果、低遅延結果、またはその両方を要求する方法を示しています。 以下のパラメーターを指定します。

  • /v1/recognize 要求の model 照会パラメーターは、低遅延をサポートする次世代 en-US_Telephony モデルを渡します。
  • JSON start メッセージの inactivity_timeout パラメーターは、非アクティブ・タイムアウトを -1 (無限) に設定します。これにより、要求がタイムアウトするのを防ぎます。
  • interim_results パラメーターと low_latency パラメーターの両方が、要求の JSON start メッセージで指定されます。

パラメーターの可能なすべての組み合わせを使用した結果の例を示すために、以下のセクションの例では、interim_results および low_latency の引数が true または false に設定されています。

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

サービスに渡される WAV ファイルには「Thunderstorms could produce ...休止... large hail ...休止... and large rain.」のような、2 つの数秒の休止が組み込まれた 1 つの文が含まれています。 休止は、別個の発話を表すのに十分な長さであるため、複数の最終結果が生成されます。 各応答には複数の最終結果 (発話ごとに 1 つ) が含まれるため、最終結果を単一のストリングにまとめて、書き起こし全体を表示する必要があります。

例 1: 中間結果および低遅延の両方が false である

この例では、interim_resultslow_latency の両方を false に設定します。 サービスは、単一の JSON オブジェクトとして最終結果のみを返します。

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

例 2: 中間結果が false で、低遅延が true である

この例では、interim_resultsfalse に設定し、low_latencytrue に設定します。 サービスは、単一の JSON オブジェクトとして最終結果のみを返します。

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

例 3: 中間結果が true で、低遅延が false である

この例では、 interim_resultstrue に、 low_latency を false に設定している。 これは、非低遅延モードを使用して中間結果を返す。

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

例 4: 中間結果および低遅延の両方が true である

この例では、interim_resultslow_latency の両方を true に設定します。 このサービスは、中間結果と最終結果の両方を返し、それぞれの結果を個別のJSONオブジェクトとして返します。

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