クラウドベースのウェイクワード検証のストリーミング要件

クラウドベースのウェイクワード検証の要件

クラウドベースのウェイクワード検証を行うことで、ウェイクワードと似た発音の発話で誤って起動されることが減り、Alexa搭載デバイスのウェイクワードの精度が高まります。たとえば、以下の語句は「アレクサ」と誤って認識され、誤起動を引き起こす可能性があります。「アレックス」、「エレクション」、「アレクシス」。クラウドベースのウェイクワード検証では、メディアで再生されたウェイクワードも検出します。たとえば、AmazonのCMで「アレクサ」が使われた場合などです。

概要

音声によって起動する製品は、製品のウェイクワードエンジンによってウェイクワードが検出されると、ユーザー音声のAVSへのストリーミングを開始します。ユーザーが話すのを止めるか、ユーザーのインテントが認識されてサービスがStopCaptureディレクティブを返すと、ストリームはクローズされます。クラウドベースのウェイクワード検証が機能するには、AVSにストリーミングされるオーディオに、500ミリ秒のプリロール、ウェイクワード、StopCaptureディレクティブを受信するまでにキャプチャされたユーザーのすべての発話が正確に含まれている必要があります。これにより、AVSがストリームに含まれるウェイクワードを検証できるようになり、誤起動による誤ったレスポンスの数を減らすことができます。

  • プリロール、つまり検出されたウェイクワードの開始の前にキャプチャされたオーディオは、録音の環境ノイズレベルを調整するために使用され、音声認識の精度が高まります。
  • ストリームにウェイクワードが含まれることで、AVSはクラウドベースのウェイクワード検証を実行できるようになり、誤起動(ウェイクワードエンジンがウェイクワードを誤って認識する回数)を減らすことができます。
  • クラウドベースのウェイクワード検証が実行されている間にウェイクワードが検出されなかった場合、そのオーディオサンプルは破棄されます。

このドキュメントでは、オーディオサンプルの読み取りと書き込みのための共有メモリリングバッファを実装する際の推奨事項と、ウェイクワードの開始と終了のインデックス、およびAVSにAlexaとの対話がどのように開始されたかを伝える新規のinitiatorパラメーターを含めるよう更新されたSpeechRecognizer.Recognizeメッセージ構造について説明します。これはあくまで推奨事項であり、500ミリ秒のプリロール、ウェイクワードの開始と終了のインデックスを識別し、ユーザーリクエスト全体をストリーミングするという必要機能が提供される限り、別の実装方法も可能であることにご留意ください。

ウェイクワードのインデックス

Recognizeイベントは、ユーザー音声をAVSにストリーミングし、その音声を1つ以上のディレクティブに翻訳するために使用します。JSON形式のオブジェクトとバイナリオーディオ添付ファイルを含むマルチパートのメッセージです。上述のように、ストリームにはプリロール、ウェイクワード、ユーザーの発話が含まれる必要があります。レイテンシーを低減するにはチャンクに分割することをお勧めします。この場合、ストリームにはチャンクあたり10ミリ秒のキャプチャオーディオ(320バイト)を含める必要があります。

ユーザーリクエストが音声によって起動された場合、Recognizeイベンドはウェイクワードの開始と終了のインデックスを含む必要があります。タイムスタンプはオーディオストリームの開始からの相対値で、単位はサンプル数です。

たとえば、ウェイクワードが500ミリ秒マークに開始して、500ミリ秒かかる場合、16 kHzのサンプルレートの以下のインデックスが含まれます。

  • startIndexInSamples - 8000
  • endIndexInSamples - 16000

サンプルメッセージ

{
  "context": [
    // This is an array of context objects that are used to communicate the
    // state of all client components to Alexa. See Context for details.
  ],
  "event": {
    "header": {
      "namespace": "SpeechRecognizer",
      "name": "Recognize",
      "messageId": "{{STRING}}",
      "dialogRequestId": "{{STRING}}"
    },
    "payload": {
      "profile": "{{STRING}}",
      "format": "{{STRING}}",
      "initiator": {
        "type": "{{STRING}}",
        "payload": {
          "wakeWordIndices": {
            "startIndexInSamples": {{LONG}},
            "endIndexInSamples": {{LONG}}
          },
          "token": "{{STRING}}"
        }
      }
    }
  }
}

コンテキスト

このイベントでは、製品がAlexaに対して、すべてのクライアントコンポーネントのステータスをコンテキストオブジェクトに格納して報告しなければならない。その他の情報については、コンテキストを参照してください。

ペイロードのパラメーター

パラメーター 説明
profile 製品に関連付けられた自動音声認識(ASR)プロファイルを識別します。AVSは、それぞれ異なる距離からのユーザー音声に最適化された3つのASRプロファイルをサポートしています。
有効な値: CLOSE_TALKNEAR_FIELDFAR_FIELD
string
format キャプチャされたオーディオのフォーマットを識別します。
有効な値: AUDIO_L16_RATE_16000_CHANNELS_1
string
initiator Alexaに対話がどのように開始されたかを伝えます。 object
initiator.type Alexaとの対話を開始するためにユーザーが行ったアクションを表します。
有効な値: PRESS_AND_HOLDTAPWAKEWORD。また、initiator.typeExpectSpeechディレクティブで提供され、その文字列が後続のRecognizeイベントでinitiator.typeとして返される必要があります。
string
initiator.payload 音声によって起動する製品の開始と終了のインデックスなど、initiatorに関する情報を含みます。 object
initiator.payload.wakeWordIndices このオブジェクトは、音声によって起動する製品では必須です。
wakeWordIndicesには、startIndexInSamplesendIndexInSamplesを含みます。
object
initiator.payload.wakeWordIndices.startIndexInSamples オーディオストリーム内のウェイクワードが開始するインデックスを表します(サンプル数)。開始インデックスのウェイクワード検出との誤差は、50ミリ秒以内である必要があります。 long
initiator.payload.wakeWordIndices.endIndexInSamples オーディオストリーム内のウェイクワードが終了するインデックスを表します(サンプル数)。終了インデックスと検出されたウェイクワード終了との誤差は、150ミリ秒以内である必要があります。 long
initiator.payload.token この値は、先行するExpectSpeechディレクティブのペイロードに存在する場合にのみ必須です。 string

その他の情報については、SpeechRecognizer.Recognizeを参照してください。

共有メモリリングバッファ

共有メモリリングバッファは、500ミリ秒のプリロール、ウェイクワード、ユーザーリクエストを含む連続する発話を、AVSに対してクラウドベースのウェイクワード検証用にストリーミングする要件を満たす1つの実装方法です。これによりレイテンシーとオーディオサンプルを何度もコピーする必要性を低減します。

下の図は、1つのアプローチです。必要な機能が維持される限り、別の実装方法も可能です。

リングバッファ
  1. オーディオサブシステム - 通常、録音デバイスからのストリームをオープンし、オーディオサンプルストリームを受信するAPIを提供するAdvanced Linux Sound Architecture (ALSA)などのミドルウェアです。
  2. オーディオキャプチャ - 録音デバイスをオープンし、共有メモリリングバッファにオーディオサンプルを書き込むプロセスです。
  3. 共有メモリリングバッファ - スレッドセーフで、複数のプロセスからアクセス可能な共有メモリリングバッファオブジェクトです。このメモリブロックへのアクセスは、少なくとも1つのライターと2つのリーダーを同時にサポートする必要があります。これらの実行ファイルは共有ライブラリとして実装することができます。
    • 書き込みAPI - 録音プロセスがオーディオサンプルを共有メモリリングバッファに書き込む際に使用します。サンプルを書き込む際は、最も古いオーディオサンプルから上書きします。典型的なAPI署名は次のようになります。WriteSamples(BufferIn, BufferInLength)
    • 読み取りAPI - ウェイクワードエンジンとAVSクライアントが共有メモリリングバッファの特定の場所から読み取る際に使用します。典型的な実装例では、場所を64ビットのintegerで表します。たとえば、場所100から200個のサンプルを読み取ると、共有メモリリングバッファに書き込まれた100番目から300番目のサンプルを読み取ることになります。典型的なAPI署名は次のようになります。ReadSamples(BufferIn, BufferInLength)メモ: 新しいオーディオサンプルで上書きされた古い場所から読み取ると、意図しないサンプルが読み取られます。
  4. ウェイクワードエンジン - 共有メモリリングバッファに書き込まれたオーディオサンプルを読み取り、オーディオサンプル内のウェイクワードの出現を分析するコンポーネントです。オーディオサンプルの読み取りと処理の手順はループします。たとえば、ループで場所0からサンプルをN個読み取り、サンプル内のウェイクワードの出現を分析します。次のループでは、次のN個のサンプルを読み取って分析します。ウェイクワードの出現が検出されると、ウェイクワードエンジンは次の2つの場所を識別する必要があります。1) ウェイクワードの開始、2) ウェイクワードの終了。これらの値は、それぞれstartIndexInSamplesendIndexInSamplesとして保存されます。
  5. WakeWordDetectedSignal - ウェイクワードの出現が検出されたときにウェイクワードエンジンからAVSクライアントに送信される信号です。この信号には、startIndexInSamplesendIndexInSamplesの2つの場所が含まれます。
  6. AVSクライアント - クライアントはWakeWordDetectedSignalを受信し、startIndexInSamplesを抽出してから、オーディオサンプルを読み取り、500ミリ秒のプリロールを含めてAVSにストリーミングします。
    • プリロールは、500ミリ秒に相当するサンプル数です。たとえば、オーディオサンプルが16キロヘルツ(kHz)のレートで録音された場合、プリロールは8,000サンプルになります。

リソース