WebSocket インタフェース
WebSocket の接続が確立した後、テキストメッセージで音声認識のリクエストを行い、逐次レスポンスを受け取れます。リアルタイムで録音されている音声ストリームなど音声データを少しずつ送信し、認識結果を逐次取得できます。
以下のようなステップで処理を行います。
WebSocket インタフェース の詳細を隠蔽して簡単にリアルタイム音声認識アプリケーションを作るためのクライアントライブラリを提供しています。使い方は、リアルタイム音声認識ライブラリ Wrpの使い方を参照してください。
音声ストリーミングを使ったアプリケーションは、WebSocketの接続後、コマンドとコマンドの応答(s、p、e)、サーバの処理に応じたイベント(S、E、C、U、A)を受け取り、実装を行います。一般的な流れは以下のようになります。
以下ではステップバイステップで実装の方法を説明します。コマンドとコマンドの応答(s、p、e)、サーバの処理に応じたイベント(S、E、C、U、A)の詳細、レスポンスについては、ストリーミングの応答を参照してください。
利用の方法
1. WebSocketの接続
WebSocket で音声認識サーバに接続します。このとき、以下の2つのエンドポイントのどちらかを選択することで、ログ保存を許可するかどうかを選べます。
wss://acp-api.amivoice.com/v1/ (ログ保存あり)
wss://acp-api.amivoice.com/v1/nolog/ (ログ保存なし)
ログ保存については、ログ保存を参照してください。
サーバとの通信はテキストメッセージで行われます。ここではPythonを使ったコードで説明しますが、他の言語でも同様にWebSocket接続が確立した後 はテキストメッセージの送受信を行うことでリアルタイムの音声認識を行うことができます。
ここではWebSocketを簡単に扱うためにPythonのwebsocket-clientライブラリを使います。AmiVoice APIのWebSocketインタフェースのログ保存ありのエンドポイントに WebSocket で接続します。サーバと WebSocket の接続が確立したときにon_openが呼び出され、サーバからメッセージを受け取ったときにon_messageが呼び出されます。このメソッドに処理を追加していきながら、音声認識サーバとの通信を説明します。
import websocket
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(threadName)s %(message)s")
def on_open(ws):
logger.info("open")
def on_message(ws, message):
logger.info(f"message: {message}")
def on_close(ws):
logger.info("close")
ws = websocket.WebSocketApp('wss://acp-api.amivoice.com/v1/',
on_open=on_open,
on_message=on_message,
on_close=on_close)
ws.run_forever()
基盤システムが非常に混雑した場合、ごく稀にWebSocket接続が失敗してしまうことがあります。この場合、接続に成功するまで何度かリトライを試みてください。
2. 音声認識のリクエスト
WebSocket の接続に成功したら、sコマンドを送信します。sコマンドは以下の形式です。
s <audio_format> <grammar_file_names> <key>=<value> ...
audio_formatにはそのセッションで送信する音声の音声フォーマットを指定します。grammar_file_nameには、リクエストパラメータの接続エンジン名を指定します。続けて<key>=<value>の形式で、認証情報 (authorization)をauthorization={APPKEY}のように設定します。<key>=<value>にはその他のリクエストパラメータを設定することができます。
サンプルに同梱している音声ファイル(test.wav)を汎用エンジン(-a-general)を使って書き起こしすることを考えます。この音声ファイルはサンプリングレート16kHz、wavコンテナファイルですので、audio_formatに16Kを指定します。詳細はヘッダありの音声ファイルの場合を参照してください。grammar_file_nameには最も汎用的に利用できる-a-generalを設定します。WebSocket 接続時のハンドラon_openには、以下のようなコードを追加します。
APPKEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
def on_open(ws):
logger.info("open")
command = f"s 16K -a-general authorization={APPKEY}"
logger.info(f"send> {command}")
ws.send(command)
その他のリ クエストパラメータを設定するには、<key1>=<value1> <key2>=<value2>...形式でsコマンドに追加します。ここでは「あのー」や「えーっと」などの不要語をあえて表示するkeepFillerToken、アップデートイベントの送信タイミングresultUpdatedIntervalを変更して 1 秒に設定するように、sコマンド行に2つのパラメータを追加します。
def on_open(ws):
logger.info("open")
command = f"s 16K -a-general authorization={APPKEY} keepFillerToken=1 resultUpdatedInterval=1000"
logger.info(f"send> {command}")
ws.send(command)
リクエストパラメータに設定する値に空白が含まれる場合は、valueを"value"のようにダブルクォートで囲んでください。例えば、segmenterPropertiesに複数のパラメータを設定する場合は以下のようにします。
segmenterProperties="useDiarizer=1 diarizerAlpha=1e-20 diarizerTransitionBias=1e-10"
on_openは以下のようになります。
def on_open(ws):
logger.info("open")
command = f"s 16K -a-general authorization={APPKEY} segmenterProperties=\"useDiarizer=1 diarizerAlpha=1e-20 diarizerTransitionBias=1e-10\""
logger.info(f"send> {command}")
ws.send(command)
詳細はリファレンスのsコマンドパケットを参照してください。
レスポンス
音声認識のリクエストを受け付けると、サーバはテキストメッセージ、sコマンド応答パケット、を返します。
成功したとき
s
失敗したとき
s の後ろに半角スペースを挟んでエラーメッセージ を受け取ります。エラーの種別については、リファレンスのsコマンド応答パケットを参照してください。
s エラーメッセージ
例:
s received unsupported audio format
基盤システムが非常に混雑した場合、ごく稀に以下のようなエラーを返すことがあります。この場合、sコマンドが成功するまで何度かリトライを試みてください。
エラーメッセージの詳細は、リファレンスのsコマンドパケット サーバエラーを参照してください。また、後述のクライアントプログラムの状態遷移も参照してください。
s can’t connect to recognizer server (can’t connect to server)