いちかわちゃん
こんにちは【いちかわちゃん】です。
アドバンスト・メディアという会社で開発をしています。
「Linuxで音声認識を動かしてみた」という題材で3回に分けてお話していきます。
前回の題材ではACPのサンプルを動かしました。みなさんも手を動かしていただけたでしょうか?
各回で話すことは以下です。
・AmiVoice Cloud Platformのプログラムで音声ファイルから音声認識する。
・AmiVoice Cloud Platformのプログラムで簡易的にマイクから音声認識する。 ←now
・AmiVoice Cloud Platformのプログラムでマイクから音声認識する。
続きものの記事のため、前回の記事を見てない人は参照ください。
今回の目標はACPのC++とarecordコマンドを使ってマイク認識するまでです。
以下の環境で動かしています。
OS | Ubuntu18.04 |
アーキテクチャ | AMD64 |
GCC | 7.5.0 |
手順
1.ACPサンプル改造
2.コマンド実行
1.ACPサンプル改造
作業ディレクトリのファイル構成は以下のようになっていると嬉しいです。
work/
├ acp/
│ ├ Wrp
│ ├ Hrp
│ ├ audio
│ ├ curl-ca-bundle.crt
│ └ readme.txt
└ poco/
acp/Wrp/cpp/WrpSimpleTester.cppのファイルオープン(402行目あたり)を適当なエディタで修正します。
#if 0 // 音声データファイルのオープン FILE* audioStream; if (fopen_s(&audioStream, audioFileName, "rb") == 0) { // 音声データファイルからの音声データの読み込み char audioData[4096]; int audioDataReadBytes = (int)fread(audioData, 1, 4096, audioStream); while (audioDataReadBytes > 0) { // 認識結果情報待機数が 1 以下になるまでスリープ int maxSleepTime = 50000; while (wrp->getWaitingResults() > 1 && maxSleepTime > 0) { wrp->sleep(100); maxSleepTime -= 100; } // WebSocket 音声認識サーバへの音声データの送信 if (!wrp->feedData(audioData, 0, audioDataReadBytes)) { print("%s", wrp->getLastMessage()); print("WebSocket 音声認識サーバへの音声データの送信に失敗しました。"); break; } // 音声データファイルからの音声データの読み込み audioDataReadBytes = (int)fread(audioData, 1, 4096, audioStream); } // 音声データファイルのクローズ fclose(audioStream); } else { print("音声データファイル %s の読み込みに失敗しました。", audioFileName); } #else char audioData[512]; while(1){ int audioDataReadBytes = read(STDIN_FILENO, audioData, 512); if (!wrp->feedData(audioData, 0, audioDataReadBytes)) { print("%s", wrp->getLastMessage()); print("WebSocket 音声認識サーバへの音声データの送信に失敗しました。"); break; } } #endif
#if 0でファイルを開く部分をガバっとコメントアウトして、#else以降の行を追加します。
以下のコマンドでビルド
$ cd ~/work/acp/Wrp/cpp/
$ bash build
2.コマンド実行
acp/Wrp/cpp/run2.shを作って以下の内容を書き込んでください。
#!/bin/bash read -p "Please enter AppKey: " AppKey set -x export SSL_CERT_FILE=../../curl-ca-bundle.crt export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:bin/linux64_release arecord -f cd -r 16000 -c 1 | bin/linux64_release/WrpSimpleTester wss://acp-api.amivoice.com/v1/ ../../audio/test.wav 16K -a-general $AppKey
以下のコマンドで実行
$ cd ~/word/acp/Wrp/cpp/
$ bash run2.sh
適当に喋るとリアルタイムで音声認識出来ます。
Please enter AppKey: [APPKEY]
+ export SSL_CERT_FILE=../../curl-ca-bundle.crt
+ SSL_CERT_FILE=../../curl-ca-bundle.crt
+ export LD_LIBRARY_PATH=/opt/ros/melodic/lib:bin/linux64_release
+ LD_LIBRARY_PATH=/opt/ros/melodic/lib:bin/linux64_release
+ arecord -f cd -r 16000 -c 1
+ bin/linux64_release/WrpSimpleTester wss://acp-api.amivoice.com/v1/ ../../audio/test.wav 16K -a-general [APPKEY]
録音中 WAVE 'stdin' : Signed 16 bit Little Endian, レート 16000 Hz, モノラル
{"results": ... }
-> こんにちは。
{"results": ... }
-> さようなら。
もし、全然認識しないとかだと以下のコマンドでマイクの音をチェックしてみてください。
$ arecord -f cd -r 16000 -c 1 | aplay -f cd -r 16000 -c 1
※マイクの入力をそのまま、スピーカーに渡すことが出来ます。
まとめ
今回はACPサンプルを少し改造して簡易的にリアルタイム認識をしてみました。
次回はC++内で録音まで完結するリアルタイム認識をやります。
次の記事
この記事を書いた人
-
いちかわちゃん
Linuxやら組み込みやらで問い合わせすると高確率でエンカウントするモンスター。