Amazon Web Services ブログ

Amazon Transcribe では WebSockets をサポートしています



Amazon Transcribe のようなサービスが大好きです。魔法のように私の想像力を刺激する一種の未来的なテクノロジーです。さまざまな言語やアクセントにリアルタイムで対応した、正確で自動化されたスピーチ認証システムは本当に素晴らしいものです。多くのユースケースが考えられ、それらのほとんどすべてが興味をそそるものです。今まで使用できた Amazon Transcribe ストリーミング API は HTTP/2 ストリーミングで使用することができました。今日、あなたの構築したリアルタイムの音声機能に対して、別の統合オプションとして WebSockets が追加されています

この投稿では、ブラウザでクライアント側の JavaScript のみを使用して、スピーチを文字起こししています。ただし、ビルドする前に基礎が必要です。Amazon Transcribe、WebSockets、Amazon Transcribe ストリーミング API に関して多くの情報をレビューし、デモを幅広く説明していきます。詳細な情報については、Amazon Transcribe ドキュメントを確認してください。

アクションがわかりにくい場合は、デモを直接確認できますが、最初にこの記事を簡単に確認することをお勧めします。

Amazon Transcribe とは?

Amazon Transcribe は、機械学習モデルを適用し、音声のスピーチをテキストのトランスクリプションに変換します。Amazon Transcribe の最も強力な機能の 1 つは、音声をリアルタイムに文字起こしする機能です。今まで、この機能は HTTP/2 ストリーミングで使用できました。今日、WebSockets を使用して Amazon Transcribe に接続する機能をお知らせしています。

リアルタイムのトランスクリプションでは、Amazon Transcribe は英国英語 (en-GB)、米国英語 (en-US)、フランス語 (fr-FR)、カナダフランス語 (fr-CA)、米国スペイン語 (es-US) をサポートしています。

WebSockets とは?

WebSockets は HTTP のように TCP の上に構築されたプロトコルです。HTTP が短期間のリクエストに最適なのに対して、永続的なリアルタイムコミュニケーションを必要とする状況に対しては、これまでもうまくいきませんでした。HTTP 接続は、通常メッセージの最後に閉じますが、WebSocket 接続は開いたままです。これはつまり、メッセージがハンドシェイクや接続のネゴシエーションを追加することで、帯域幅や遅延が発生することなく、双方向にメッセージを送信できるということです。WebSocket 接続は全二重であり、サーバとクライアントがデータを同時に送信できることを意味します。クロスドメインの使用も想定して設計されているため、HTTP を使用していても、クロス発生リソースの共有 (CORS) で混乱することはありません。

HTTP/2 ストリーミングでは、HTTP によるリアルタイムコミュニケーションで発生する問題の多くを解決し、最初に Amazon Transcribe Streaming API で HTTP/2 を使用できます。WebSocket サポートはより広い対象者に向けて Amazon Transcribe ストリーミングを開き、既存の WebSocket ベースの統合や知識を有する顧客が統合しやすくなります。

Amazon Transcribe ストリーミング API の機能

認可

最初に行う必要があるのは、IAM ユーザーが Amazon Transcribe Streaming WebSockets を使用できるように認証することです。AWS Management Console で、次のポリシーをユーザーに添付します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "transcribestreaming",
            "Effect": "Allow",
            "Action": "transcribe:StartStreamTranscriptionWebSocket",
            "Resource": "*"
        }
    ]
}

認証

Transcribe は、リクエストを認証するために AWS Signature Version 4 を使用します。WebSocket 接続については、pre-signed URL を使用し、これは必要なすべての情報を含み、URL のクエリ パラメータとして渡されます。これにより、WebSocket を確立するために使用できる認証済みエンドポイントが提供されます。

必要なパラメータ

必要なパラメータのすべては、事前署名された URL をクエリ文字列の一部として含みます。これらは次の通りです。

  • language-code: 言語コード。en-US、en-GB、fr-FR、fr-CA、es-US のいずれか。
  • sample-rate: 音声のサンプルレート (Hz)。en-US および es-US では最大16000、その他の言語では 8000
  • media-encoding: 現在、pcm のみが有効です。
  • vocabulary-name: Amazon Transcribe では、データで確認できるであろう珍しい言葉や、固有の言葉についてカスタムボキャブラリを定義できます。カスタムボキャブラリを使用するには、ここを参照してください。

音声データの要件

データを送信する前に、知っておく必要があることがいくつかあります。最初に、Transcribe では、音声が PCM データとしてエンコードされることが予想されます。デジタル音声ファイルのサンプルレートは、キャプチャされた音声の品質に関係しています。これは秒 (Hz) あたりの時間であり、デジタル信号を生成するためにアナログ信号がチェックされます。高品質データについては、16,000 Hz またはそれ以上のサンプルレートが推奨されます。電話での会話など低品質音声については、8,000 Hz のサンプルレートを使用します。現在、米国英語 (en-US) および米国スペイン語 (es-US) では、最高 48,000 Hz のサンプルレートをサポートしています。その他の言語では、最高 16,000 Hz のレートをサポートしています。

使用しているデモでは、lib/audioUtils.js はブラウザからの受信音声のバイト数のサンプルレートを減らす downsampleBuffer() 機能と、未加工音声バイトを取り込んで PCM に変換する pcmEncode() 機能を含んでいます。

リクエスト形式

適切なサンプルレートで PCM データとして音声をエンコードすると、WebSocket 接続で送信する前に、エンベロープに包む必要があります。各メッセージには 3 つのヘッダーが含まれ、メッセージ本文に PCM でエンコードされた音声バイトが続きます。メッセージ全体は、バイナリイベントのストリーミングメッセージとしてエンコードされ、送信されます。以前 HTTP/2 API を使用していた場合、WebSockets をもう少し簡単に使用するにあたり 1 つだけ違いがあります。送信した音声データの各チャンクに暗号サインが必要ないということです。

応答形式

受信するメッセージは、同じ汎用形式に従います:バイナリエンコードされたイベントストリーミングメッセージであり、3 つのヘッダーと本文が含まれます。音声バイトの代わりに、メッセージ本文には Transcript オブジェクトが含まれます。音声が特定される自然な停止ポイントに達するまで、一部の応答が返されます。この応答を形成する方法についての詳細は、the docs をチェックし、main.jshandleEventStreamMessage() 機能を確認してください。

デモを見てみましょう!

一部のコンテキストを入手しました。デモを試してみましょうAWS Amplify コンソール を使用してデプロイしました。確認するか、ボタンを押して自分のコピーをデプロイしてみてください。以前認証した IAM ユーザーのアクセス ID と秘密鍵を入力し、[Start Transcription] ボタンを押して、マイクで話してみましょう。

Amplify コンソールのデプロイ

完全なプロジェクトは GitHub で使用可能です。もっとも重要なファイルは lib/main.js です。このファイルでは、必要な依存関係をすべて定義し、ボタンをワイヤアップして index.html のフィールドを形成し、マイクのストリーミングにアクセスし、WebSocket で Transcribe にデータをプッシュします。コードは詳しくコメントされ、簡単に理解できるようになっていますが、質問がある場合は GitHub repo にお気軽に疑問をお寄せくだされば、喜んでサポートいたします。デモのベースを形成するコードを提供していただきました、Transcribe チームのソフトウェア開発エンジニアである Karan Grover に感謝申し上げます。