Raspberry Pi 4(通称ラズパイ)を音声コマンドで操作する方法についてメモします。
Amazon Echoは話しかけて操作する近未来的なデバイスとして話題になりましたが、似たような事をRaspberry Piにさせようという目論見です。
今回はラズパイを「ラズパイ、音楽かけて」というボイスコマンドで操作してみます。
Python、GCPのCloud Speech-to-Text APIの導入方法がわかる方向けに書いています。
目次
スポンサーリンク
音声認識の事前準備
ラズパイに話しかけて音楽を再生してもらう為に各種準備を行っていきます。
ラズパイの音声認識に必要なもの
今回は以下を用意しました。
GCPは無料枠があるのでスピーカーとマイクがあればタダで試せます。
品名 | 用途 | 備考 |
---|---|---|
スピーカー Amazon Echo | ラズパイの口になります | セットアップ方法 |
USBマイク MM-MCU06BK | ラズパイの耳になります | 製品情報 |
Speech-to-Text API | Google製の音声認識API | ドキュメント |
Open JTalk | 音声合成アプリケーション | 公式サイト |
MMDAgent version 1.7 | ボイスファイル(Mei)のみ利用 | 公式サイト |
GCPの登録方法、APIの有効化については長くなるのでここでは解説しません。
音声認識にSpeech-to-Text APIを使う理由
ラズパイの音声認識について調べるとフリーのJuliusの情報が出て来ますが、今回はこちらを利用しません。
理由は認識の精度が悪くそのままでは使い物にならないこと、独自の辞書を作り精度を上げるという方法もありますが面倒臭いのと、読み取りたい言葉を網羅しようとすると中々大変なので今回は見送りました。
一方、GCPのSpeech-to-Text APIは非常に精度が高く、有料とは言え月60分の無料枠があるので一日中喋っているので無ければこちらが適切と考えました。
ラズパイからUSBマイクを使う
スピーカーについては下記記事でセットアップ済みなのでマイクを繋げます。
USBマイクMM-MCU06BKをラズパイのUSBに接続し下記コマンドを実行します。
$ arecord -l **** ハードウェアデバイス CAPTURE のリスト **** カード 1: Microphone [USB Microphone], デバイス 0: USB Audio [USB Audio] サブデバイス: 1/1 サブデバイス #0: subdevice #0
マイクのカード番号を覚えておきます。
MM-MCU06BKの場合は何の苦労もなく認識してくれると思います。
次に、マイクの動作確認として自分の声を録音してみます。plughwにはマイクのカード番号を指定します。
$ arecord -D plughw:1 myvoice.wav ## Ctl + C で録音終了 ##
再生します。
$ aplay -D bluealsa myvoice.wav
自分の声がスピーカーから聞こえてくれば成功です。
OpenJTalkのインストール
Open JTalkをインストールしてラズパイに何か喋らせてみます。
$ sudo apt-get install -y open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
MMDAgentからはMeiの声データだけを使います。この音声データはクオリティが高いです。
$ wget --no-check-certificate https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip $ unzip MDAgent_Example-1.7.zip $ sudo cp -r MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice/
任意のテキストを読み取らせwavファイルを作成しそれを再生してみます。
$ echo "はじめまして、ラズベリーパイです" | \ open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice \ -x /var/lib/mecab/dic/open-jtalk/naist-jdic \ -ow voice.wav $ aplay -D bluealsa voice.wav
自分のラズパイが喋ってると思うと少し感動します。
「ラズパイ、音楽かけて」を実装する
準備が整ったのでラズパイに各種機能を実装して音楽をかけさせます。
スピーカー出力とマイク入力の処理は長くなるのでクラス化したもの下記にアップしています。必要なモジュールを入れてGCPの設定が済んでいれば動くはずです。
クラス voice2text を使い、ラズパイに音楽を再生させる処理を書いてみます。
mp3が必要なのでtest.mp3というファイル名で同じディレクトリに置いておきます。
import re import time import subprocess import voice2text if __name__ == "__main__": ## スピーカーとマイクのセットアップ speaker = voice2text.Speaker() gcp_speech = voice2text.GoogleCloudSpeech() speaker.read("ラズベリーパイです") speaker.read("マイクに向かって、何か話してください") try: ## 聞き取り & APIで音声認識 text = gcp_speech.listen() if re.search(r"^ラズパイ\s?音楽\s?(再生|かけて)", text): speaker.read("音楽を再生します") time.sleep(0.5) subprocess.run(['/usr/bin/mpg321', '-q', '-a', 'bluealsa', 'test.mp3']) speaker.read("いかがでしたか") else: speaker.read("読み取った言葉は、{}です".format(text)) except: speaker.read("聞き取り中に、エラーが発生しました")
実行するとこのような感じになります。「ラズパイ 音楽かけて」か「ラズパイ 音楽再生して」でmp3を再生します。
ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card ALSA lib bluealsa-pcm.c:763:(_snd_pcm_bluealsa_open) Couldn't get BlueALSA PCM: PCM not found ラズパイ 音楽かけて (0.89766925573349) <= 読み取った音声内容と解析精度のスコア
正規表現で音声の内容を判定しているあたりが泥臭いですが、コードの中身を知らなければラズパイがAIスピーカーに見えてきます:)
用意したコマンド以外の場合は読み取った内容を読み上げ&表示します。
試しに大好きなアニメ、賭博破戒録カイジの大槻班長のセリフを認識させてみます。音源はYoutubeをスマホで再生してラズパイに聞かせます。(カイジ 焼き鳥ビール)
シーンはカイジをキンキンに冷えたビールで誘惑する悪魔的シーンです。(動画の1:00あたり)
ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card ALSA lib bluealsa-pcm.c:763:(_snd_pcm_bluealsa_open) Couldn't get BlueALSA PCM: PCM not found わしのおごりだ カイジくんの初給料のお祝いさ (0.9202433824539185) <= Youtubeから読み取った内容
精度が非常に高いです。やはり音声認識はGCPを使っておいて正解でした。このレベルの解析を自力でやろうとするとかなり難しいと思います。
セリフ程度であれば他の動画でもちゃんと認識してくれますが、音楽が鳴っていたりすると解析が上手くいきにくいです。また、何故かカイジの声は認識しにくく、大槻班長のセリフは高い精度で認識する事がわかりました。
他にはRe:ゼロのこの方を認識させてみました。(ペテルギウスロマネコンティデス)
ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card ALSA lib bluealsa-pcm.c:763:(_snd_pcm_bluealsa_open) Couldn't get BlueALSA PCM: PCM not found 私は魔女教 大罪 司教 怠惰 担当 ペテルギウスロマネコンティ (0.9343544244766235) <= Youtubeから読み取った内容
一番大事な最後の「です!」が読み取れていないですが、長いセリフをちゃんと解析出来ているのは凄いです。
マイクの精度も関係ありますが、声質が読み取りやすいかどうかも関係してそうですね。
ボイスコントロールにはDBが欲しいかも
当初の目的である「ラズパイ 音楽かけて」は実装できましたが、さらなる発展にはやはり何かしらのDBが欲しいなと思いました。
ラズパイにとってスピーカーは口、マイクは耳だとすればDBは脳(の記憶領域)になります。
まだ検討段階ですが、DB部分は全文検索エンジンのElasticsearchが使えそうです。
単純な正規表現による判定では一字一句、間違えずに発音しないと厳しいので、形態素解析やN-gramで関連度の高いボイスコマンドを検索できれば曖昧に発音してしまっても大丈夫そうです。
また、Elasticsearchはベクトル検索もできるので、Word2Vecを併用すれば更にAIっぽくなりそうな予感がします。
ラズパイは電子工作も可能なデバイスなので、人感センサーを取り付けて人の気配を感知したら話しかけるとかも面白いかもしれない…
最初は単純なサーバとして使おうと思っていましたが、色々なデバイスを繋げた方がラズパイが楽しくなりますね:)