ラズパイ って何だべ~? 私設 基板実験室

地元東松島市のイベントや、パソコン・ラズベリーパイの実験報告しています

RaspberryPi-Zero でGoogleアシスタント実現!!使ったのはAIY-VoiceV1データとReSpeaker基板、自動起動も出来た

f:id:masa19569810303:20181004143932j:plain

ラズパイZeroの活用事例です。スマホなどで提供されている Googlea-asistant をラズパイZeroやってみました。(写真が今回作ったもの)

www.switch-science.com

実験の経緯

 余剰の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” が質問に答えるようになりました。音声はイヤホンで聞いています。

www.switch-science.com

 下記を参考にさせていただきました。

aiyprojects.withgoogle.com

deviceplus.jp

機能制限

ただし、機能制限があることお知らせしておきます。
"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機能が持てるはずです。後日やってみます。)

 

これら機材を使った、設定作業を簡単に説明します。

 手順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にプロジェクトが無い場合は、真ん中上のメニューから、新しいプロジェクトを作成して下さい。

    (2) Google Assistant APIの有効化

プロジェクトができたらGoogle Assistant APIを検索し、有効化させます。

    (3) 認証情報の作成

写真ような OAuth同意画面まで作ります

f:id:masa19569810303:20181004215121p:plain

    (4) 認証情報のダウンロード、ラズパイでの登録

作成された認証ファイルを、“JSONをダウンロード”というボタンから、作業しているパソコンにダウンロードします。

ダウンロードした認証情報を、下記スクリプトを使ってパソコンからラズパイのホーム直下に転送します。以下xxx記述の”download_file.json”の部分は実際にダウンロードしたJSONファイルの名前を使い、これをラズパイ側でassistant.jsonという名前に変更しています。

(ラズパイのコンソールなどから) scp download_file.json pi@xxx.local:assistant.json

ラズパイのホーム直下にJSONファイルを置くだけなので、ラズパイのファイルマネージャーを使って、移動とリネームで行っても良いです。

置いたら、ラズパイの Start dev terminal のターミナルから、実際のデモでも使用するコマンドを入力します。

src/examples/voice/assistant_grpc_demo.py

 すると、googleアカウントの選択確認(初回の場合は、新規登録)がブラウザから聞かれます。

f:id:masa19569810303:20181003232055p:plain

 

 選択すると、googleアカウントへのリクエストが出ます。

 許可を押すことで、認証完了です。(私はこれがだけでOKでした。)

f:id:masa19569810303:20181003232120p:plain

 

 スマホGoogle Assistant の自分の設定のデバイス欄を見ると、不思議なことに、
Voice Kit が増えています。(今回3度やってしまった?ので、3つ出てしまっていますが)。

こうなれば、もう、ラズパイで、Google Assistantデモが実行可能となります。 

 

f:id:masa19569810303:20181003232431p:plain

 

 手順5 最終調整

念のために、マイク、イヤホン/スピーカ の設定を ラズパイの画面の

Pulse Audio VOLUMECONTROLをダブルクリックし、

音量調整で、入力装置、出力装置、設定を 確認、違っていれば、選択し直しと

音量も調整します。 

 

f:id:masa19569810303:20181003232331p:plain

 

f:id:masa19569810303:20181003232252p:plain

f:id:masa19569810303:20181003232225p:plain

 

 

良ければ、いよいよ、デモの実行です。

コマンドは、これだけ、 

src/examples/voice/assistant_grpc_demo.py

下記のように出てきます。ボタン押しの要求が出ています。

f:id:masa19569810303:20181003232150p:plain

 

 手順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が話した内容が文字で残っています。

 

f:id:masa19569810303:20181003232513p:plain

 

 

追加設定(自動起動

ラズパイを終了するたびに、ターミナル画面を開いてコマンドを打ち込んでgoogleassistantを
起動していましたが、画面を見ないでも起動したくなり、自動起動の方法を探したところ、下記にありました。

bezelie.com

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でたくさん使われている

 Python(パイソン)言語は、C言語より各段に

 見易いですね。(まだまだ勉強不足ですが)