ラズパイ-Zero でGoogleアシスタント実現!!使ったのはAIY-VoiceV1データとReSpeaker基板・自動起動も出来た!
ラズパイZeroの活用事例です。スマホなどで提供されている Googlea-asistant をラズパイZeroやってみました。(写真が今回作ったもの)
- 実験の経緯
- 機能制限
- 手順1 AIYイメージ準備
- 手順2 ReSpeaker ドライバインストール
- 手順3 AIYプロジェクト設定変更
- 手順4 google認証
- 手順5 最終調整
- 手順6 Google-Assistant起動方法
- 追加設定(自動起動)
- 最後に
実験の経緯
余剰のRaspberryPi-Zeroで、AIスピーカのAmazonエコー構築にトライしましたが、先駆者の情報は、RaspberryPi-3を使うものでした。実際やって見たところ、C言語のビルド動作がとても遅いことや、シングルコアのコマンドになっていない事などから断念しました。
代わりに、AIスピーカのもう一方の” google-assistant” をトライしてみることにしました。調べると、こちらには、google-AIYプロジェクトと言う段ボールでできたAIスピーカのパッケージが販売されて、中身はラズパイ3のボードです。ソフトは、google-assistantのデモがRaspbianベースで公開中(Voice V1)で、そのまま使用することできます。言語はPythonなので、ビルドの必要がありません。
これと、マイクとスピーカAMPが実装された下記基板(ReSpeaker 2-Mics Pi HAT) を1枚使うことで、超廉価に(手っ取り早く)AIスピーカが構築ができました。
そして昨日、” google-assistant” が質問に答えるようになりました。音声はイヤホンで聞いています。
下記を参考にさせていただきました。
機能制限
ただし、機能制限があることお知らせしておきます。
制限①
"OK、google" など音声で起動するHotword機能が、このRaspberryPi-Zeroでは使えません(試しましたが、だめでした)。
(10/7追記:最新のVoice キットV2の作成マニュアルを良く見たところ、こちらも音声起動の記載はなく、ボタンを押してデモ開始とあります。つまり、V2の製品は、今回、私が試行したデモと同じ動作です。ソフトはV1/V2共通にしていると思われます。)
代わりに、押しボタンで対応しています。RaspberryPi-Zeroの仕様通りでのデモ動作になります。
(※最新のVoice キットV2は、RaspberryPiの使用が3からZeroに変更し、RaspberryPi-Zero自体も同梱、マイクロSDにソフト書込みで同梱のため、V2ソフトは未公開です。なお、SnowBoyというhotword機能のソフトがフリーであるため、これを使えればRaspberryPi-Zeroでも hotword機能が持てるはずです。後日やってみます。)
2/16 追記
制限②
google-AIYのソフトでは、音楽サービスと連携が出来ませんでした。本家のgoogle-homeであれば、google-PLAY music かspotifyに連携できるのですが。曲名を言っても、”すみません。お役に立てません”の連発となります。
これら機材を使った、設定作業を簡単に説明します。
手順1 AIYイメージ準備
1)AIY プロジェクトのimg ファイルをダウンロードします。(PCで)
https://aiyprojects.withgoogle.com/voice-v1/#assembly-guide
2)AIYのファイルイメージデータをダウンロードしたら、.xz ファイルなので、
7zipで解凍します。
SD書き込みの定番ツールのEtcherで、この .img ファイルをマイクロSD(8GB以上)に書いて下さい。
3)マイクロSDを挿入し、ディスプレーとマウス、キーボードを繋ぎ、画面が開いたら、welcome raspberryの設定から開始します。
国はJAPANを選択し、WiFiを設定、装置名をraspberrypizeroに変更(私のところはraspberrypiが1台、既にネットワークに居るため)
apt-update 実施し(これがとても時間がかかる)、VNC使用可能になっていることと
Wi-FiのIPを確認し、raspberrypiの設定で、画面解像度を(大きく)設定する。
また、ログイン・パスワードを変更しておく
手順2 ReSpeaker ドライバインストール
Seeed ReSpeaker 2-Mic Pi HAT基板をZeroのヘッダーに実装し、
ドライバを下記を参考にインストールします。
http://wiki.seeedstudio.com/ReSpeaker_2_Mics_Pi_HAT/
のwikiに従って進めます。
2. Setup the driver on Raspberry Pi
LEDとスイッチとイヤホンを流用のため、
python3のスクリプトをインストール
$ sudo apt-get update
$ git clone https://github.com/respeaker/seeed-voicecard.git
$ cd seeed-voicecard
$ sudo ./install.sh
$ reboot
3. Configure sound settings and adjust the volume with alsamixer
この2-Mic Hatには超小型のマイクが左右二つ付いています。ラジオジャックにイヤフォンを差し、いつもの方法でマイクと音声出力を確認します。
$ alsamixer #音量の調整、Escで元の画面に戻ります
$ aplay -l #スピーカーの確認、card番号を覚えておいて下さい
$ arecord -l #マイクの確認、card番号を覚えておいて下さい
pi@raspberrypizero:~ $ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: seeed2micvoicec [seeed-2mic-voicecard], デバイス 0: bcm2835-i2s-wm8960-hifi wm8960-hifi-0 []
サブデバイス: 1/1
サブデバイス #0: subdevice #0
pi@raspberrypizero:~ $ aplay -l
**** ハードウェアデバイス PLAYBACK リスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
サブデバイス: 7/7
サブデバイス #0: subdevice #0
サブデバイス #1: subdevice #1
サブデバイス #2: subdevice #2
サブデバイス #3: subdevice #3
サブデバイス #4: subdevice #4
サブデバイス #5: subdevice #5
サブデバイス #6: subdevice #6
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 1: seeed2micvoicec [seeed-2mic-voicecard], デバイス 0: bcm2835-i2s-wm8960-hifi wm8960-hifi-0 []
サブデバイス: 1/1
サブデバイス #0: subdevice #0
pi@raspberrypizero:~ $
$ arecord -f cd -Dhw:0 | aplay -Dhw:0 #Dhw:0の部分はarecord, aplayで確認したカード番号を入れて下さい
今回のカードは
arecord -f cd -Dhw:1 | aplay -Dhw:1
スピーカ/ヘッドホンの切り替え設定があるので、raspberryの設定で
ヘッドホンに設定していないと聞こえない。
これで自分が話した声がオウム返しに聞こえたら、2-Mic Hatが正常に動作しています。
4. Use the on-board APA102 LEDs
今回、まだ使用していませんが、LEDの点灯試験のため、
pixels.pyを流してみます。3色に光ってカッコイイです。
手順3 AIYプロジェクト設定変更
Seeed ReSpeaker 2-Mic Pi HAT向けに、AIY Projectの設定を一部変更します。
下記を参考にさせていただきました。
intellectualcuriosity.hatenablog.com
(1) Voice Kitの音声系の設定変更
Voice KitのSP基板は無いので音声系の設定を変更します。
sudo nano /boot/config.txt
を実行して、一番後ろの部分のコメントをつぎのように変えます。dtparam=audio=onを生かす
# Enable audio (loads snd_bcm2835)
dtparam=audio=on
#dtoverlay=i2s-mmap
#dtoverlay=googlevoicehat-soundcard
参考:
AIYのデスクトップにある「Check audio」でのオーディオの動作確認は、基板名がVOICEキットと違うのでやらなくて良いです。
(2) Voice Kitのオーディオ設定の変更
Google Assistant SDKの「Configure and Test the Audio」を見て
「/etc/asound.conf」を修正しました。
録音と再生のデバイスを表示するコマンドを実行して、「/etc/asound.conf」を書き換えます。
先ずVoice Kit用のオーディオ設定を変更します。
sudo nano /etc/asound.conf
を実行して、次の記述に入れ替えてリブートします。
pcm.!default {
type asym
playback.pcm "speaker"
capture.pcm "mic"
} pcm.speaker {
type plug
slave {
pcm "hw:1,0" 変更前:0,0
}
} pcm.mic {
type plug
slave {
pcm "hw:1,0"
}
} #追加されていた
pcm.dmixed {
type dmix
slave.pcm "hw:seeed2micvoicec"
ipc_key 555555
} pcm.array {
type dsnoop
slave {
pcm "hw:seeed2micvoicec"
channels 2
}
ipc_key 666666
}
hw:の後はcard number,deive numberとなるので、pcm.micの方は「hw:1,0」、pcm.speake使うので「hw:1:0」に修正しました。
もう一か所、変更が必要です。
動いていそうであるが、スイッチのGPIOが合っていないので、合わせる。Voice KITは、23を使っている。
https://deviceplus.jp/hobby/entry_y14/
ReSpeakerにはあらかじめプッシュボタンが一つ付いていますので、AIYの仕組みを一部変更し、音声聞き出しなどにこのボタンを活用します。このボタンはラズパイのGPIO17につながり、aiyフォルダの中にあるvoicehat.pyというサブプログラムを変更し、対応させます。
[voicehat.py の変更]
$ cd ~/AIY-projects-python/src/aiy/
$ sudo cp voicehat.py voicehjat.py.org #バックアップをとっておいて下さい。
$ sudo vi voicehat.py
_GPIO_BUTTON = 17 #17に変更します。
/home/pi/AIY-projects-python/src/aiy
これでボタンOKになります。
手順4 google認証
ここが鬼門です。個人情報があるため詳細には設定をお見せできませんが、写真を参考にして下さい。
Google Cloud Platform に
まず最初のステップは、Google Cloud上でAPIなどをデバイスで使えるようにします。
こちらのGoogle Cloudコンソールにアクセスし、設定を進めます。
https://console.cloud.google.com/
(1)Google Cloudプロジェクトの作成
Google Cloudにプロジェクトが無い場合は、真ん中上のメニューから、新しいプロジェクトを作成して下さい。
プロジェクトができたらGoogle Assistant APIを検索し、有効化させます。
(3) 認証情報の作成
写真ような OAuth同意画面まで作ります
(4) 認証情報のダウンロード、ラズパイでの登録
作成された認証ファイルを、“JSONをダウンロード”というボタンから、作業しているパソコンにダウンロードします。
ダウンロードした認証情報を、下記スクリプトを使ってパソコンからラズパイのホーム直下に転送します。以下xxx記述の”download_file.json”の部分は実際にダウンロードしたJSONファイルの名前を使い、これをラズパイ側でassistant.jsonという名前に変更しています。
ラズパイのホーム直下にJSONファイルを置くだけなので、ラズパイのファイルマネージャーを使って、移動とリネームで行っても良いです。
置いたら、ラズパイの Start dev terminal のターミナルから、実際のデモでも使用するコマンドを入力します。
src/examples/voice/assistant_grpc_demo.py
すると、googleアカウントの選択確認(初回の場合は、新規登録)がブラウザから聞かれます。
許可を押すことで、認証完了です。(私はこれがだけでOKでした。)
スマホのGoogle Assistant の自分の設定のデバイス欄を見ると、不思議なことに、
Voice Kit が増えています。(今回3度やってしまった?ので、3つ出てしまっていますが)。
こうなれば、もう、ラズパイで、Google Assistantデモが実行可能となります。
手順5 最終調整
念のために、マイク、イヤホン/スピーカ の設定を ラズパイの画面の
Pulse Audio VOLUMECONTROLをダブルクリックし、
音量調整で、入力装置、出力装置、設定を 確認、違っていれば、選択し直しと
音量も調整します。
良ければ、いよいよ、デモの実行です。
コマンドは、これだけ、
src/examples/voice/assistant_grpc_demo.py
下記のように出てきます。ボタン押しの要求が出ています。
手順6 Google-Assistant起動方法
いよいよ起動ですが、起動方法は3つあります。
現状のラズパイZEROでは、1か、2です
起動方法1
pi@raspberrypizero:~ $ cd AIY-projects-python pi@raspberrypizero:~/AIY-projects-python $ src/examples/voice/assistant_grpc_demo.py
こんな感じに画面には 音声認識を少しづつ行っている様子が出ます。
pi@raspberrypizero:~/AIY-projects-python $ src/examples/voice/assistant_grpc_demo.py
/opt/aiy/projects-python/src/aiy/_drivers/_led.py:51: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(channel, GPIO.OUT)
Press the button and speak
[2018-10-03 19:39:07,313] INFO:recorder:started recording
Listening...
[2018-10-03 19:39:13,699] INFO:speech:transcript: 今日の
[2018-10-03 19:39:13,721] INFO:speech:transcript: 今日ので
[2018-10-03 19:39:13,729] INFO:speech:transcript: 今日の天
[2018-10-03 19:39:13,736] INFO:speech:transcript: 今日の天気
[2018-10-03 19:39:13,744] INFO:speech:transcript: 今日の天気を
[2018-10-03 19:39:13,752] INFO:speech:transcript: 今日の天気は
[2018-10-03 19:39:13,759] INFO:speech:transcript: 今日の天気は
[2018-10-03 19:39:13,767] INFO:speech:transcript: 今日の天気は
[2018-10-03 19:39:13,782] INFO:speech:event_type: 1
[2018-10-03 19:39:13,806] INFO:speech:transcript: 今日の天気は
You said " 今日の天気は "
Press the button and speak
起動方法2
OKグーグルか押しボタンSWの併用が出来るコマンド、
pi@raspberrypizero:~ $ cd AIY-projects-python pi@raspberrypizero:~/AIY-projects-python $ src/examples/voice/assistant_library_with_button_demo.py
こんな感じに画面には テキストで出ます。
pi@raspberrypizero:~/AIY-projects-python $ src/examples/voice/assistant_library_with_button_demo.py
ON_MUTED_CHANGED:
{'is_muted': False}
/opt/aiy/projects-python/src/aiy/_drivers/_led.py:51: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(channel, GPIO.OUT)
ON_START_FINISHED
Say "OK, Google" or press the button, then speak. Press Ctrl+C to quit...
ON_CONVERSATION_TURN_STARTED
ON_END_OF_UTTERANCE
ON_RECOGNIZING_SPEECH_FINISHED:
{'text': '今日の天気は'}
ON_RESPONDING_STARTED:
{'is_error_response': False}
ON_RESPONDING_FINISHED
ON_CONVERSATION_TURN_FINISHED:
{'with_follow_on_turn': False}
(error_response表示は、zeroを使っているためと思われます。
起動方法3
ラズパイ2以上で OKグーグルで 音声応答を行う場合のコマンド
OKグーグルか押しボタンSWの併用が出来るコマンド、
Cannot run hotword demo on Pi Zero!Cannot run hotword demo on Pi Zero!
(ラズパイZeroはhotword未対応なのでこう出ます)、 pi@raspberrypizero:~ $ cd AIY-projects-python pi@raspberrypizero:~/AIY-projects-python $ src/examples/voice/assistant_library_demo.py
これも参考です。
スマホのGoogle Assistant の自分の履歴を見ると、
Google Assistantが話した内容が文字で残っています。
追加設定(自動起動)
ラズパイを終了するたびに、ターミナル画面を開いてコマンドを打ち込んでgoogleassistantを
起動していましたが、画面を見ないでも起動したくなり、自動起動の方法を探したところ、下記にありました。
1)ラズパイのデスクトップ画面からターミナルを開いてください。
・サンプルプログラムが置いてあるディレクトリ「AIY-projects-python/src/examples/voice」に移動します。
$ cd AIY-projects-python/src/examples/voice
2)lsコマンドでディレクトリの中身を見て、自動起動するスクリプトを確認します。
assistant_grpc_demo.py
assistant_library_demo.py
assistant_grpc_demo.service
assistant_library_with_button_demo.py assistant_library_with_local_commands_demo.py
cloudspeech_demo.py
・自動実行したいファイルを「main.py」という名前に変更して、「src」ディレクトリの下にコピーします。今回「assistant_grpc_demo.py」を自動起動してみました。
$ sudo cp assistant_grpc_demo.py ~/AIY-projects-python/src/main.py
・自動起動設定ファイルが置いてある場所に移動します。
$ cd /lib/systemd/system/
・ここに、自動起動サービス設定ファイル「voice-recognizer.service」がない場合、nanoで新規に作成します。
$ sudo nano voice-recognizer.service
[voice-recognizer.service]
# This service can be used to run your code automatically on startup. Look in
# HACKING.md for instructions on creating main.py and enabling it. [Unit]
Description=voice recognizer
After=network.target ntpdate.service [Service]
Environment=VIRTUAL_ENV=/home/pi/AIY-projects-python/env
Environment=PATH=/home/pi/AIY-projects-python/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/usr/bin/python3 -u src/main.py
WorkingDirectory=/home/pi/AIY-projects-python
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi [Install]
WantedBy=multi-user.target
# This service can be used to run your code automatically on startup. Look in
# HACKING.md for instructions on creating main.py and enabling it.
・自動起動を有効化し、再起動します。
$ sudo systemctl enable voice-recognizer.service
$ sudo reboot
・自動起動をやめたいときは、下記のようにdisableします。
$ sudo systemctl disable voice-recognizer.service
最後に
RaspberryPi-Zero版の、Google-assistantが実現し、
使ってみて分かった事。
(これは、本家のAIY-Voice Kitにも言える事かもです。)
1.音楽を聴きたい、ニュースを聞きたい、写真を見たいは 丁重に断られます!!
写真と音楽などのマルチメディアでの回答の期待は、
スマホ版のGoogle-assistantか、Amazonエコーを
使って下さい。
2.ラズパイ版のGoogle-assistantでも、スマホ版のGoogle-assistantを使うと、質問の履歴を回答も含めて文字で確認できます。
3.世界各国の会話に対応している様子です。
英語で質問すると、英語で(日本語担当とは別の女の人の声)回答が返って来ます。
意外にも、外国語の勉強に使えるツールかも知れません。
今後の予定
もう少し動作、機能など確認整理し、機能アップしていこうと思います。
※Google Assistantでたくさん使われている
見易いですね。(まだまだ勉強不足ですが)