「Pi函 (pi-bako)」スマートスピーカーで「OK Google」(Voice Kitを実装)

 「OK Google」ができる?



「Pi函 (pi-bako)」を使ってスマートスピーカーを作ってみたいと思います。
以前に作った「零函(zero-bako)」を使ったスマートスピーカーとの違いは、ボタンを押さなくても「OK Google」で会話を開始できる点です。

今回もGoogle社「Google AIY Voice Kit 」のVoice Kitソフトウェアを流用して、自作キットなしで作っています。

前回同様、前段階として、Voice KitソフトウェアをダウンロードしてSDカードに書き込んだり、Googleのサイトに登録して、認証ファイルを入手すると言う流れがあるのですが、その辺は他のWebサイトに詳しい記事がたくさんありますので、そちらを参照していただくとして…。例えばこちらとか。

この記事では、ラズパイ(「Pi 3 Model B」及び「Pi 4 Model B」シリーズ)本体にマウス、キーボードを接続、HDMIケーブルでモニターと繋いで、ソフトウェアを起動し、AIY Projectsのデスクトップ画面(下図)が表示された所からの説明としたいと思います。

デスクトップ画面が表示されると、「Welcome to Raspberry Pi」ダイアログが出て、初期セットアップが始まりますが、ここで注意点があります。


下記、ご注意願います

今回も使用するVoice Kitソフトウェアは結構古い「AIY Kits Release 2018-11-16」で、最新版ではありません。
最新版で作った場合の結果は保証できません…。すいません。

ですので、「Welcome to Raspberry Pi」ダイアログの最後の「Update Software」設定の画面では、「Skip」を選択して、アップデートを行わないようにしてください。


事前準備として

①WiFiを繋ぐ

まずはWiFiを接続します。
(初期セットアップで接続済みの場合はそのままでOKです。)

②VNCを使えるようにする

これ以降の作業をPCからの遠隔操作で行うためです。手順はこちらを参照願います。この機能をオンにすれば、ラズパイ本体に接続していたマウス、キーボード、モニターは不要になります。
イメージ的には下図のようです。ラズパイの画面がWiFiルーター経由でPCに表示されます。
初回起動時は画面サイズが小さい可能性がありますので、解像度の変更が必要です。
(あと、自分の好みでタスクバーを下側にしています。)


③「Pi函 (pi-bako)」にラズパイを組み込む

VNCでPC経由でラズパイ内のシステムの変更が変更可能になりましたので、実際に「Pi函 (pi-bako)」にラズパイ本体とアンプHATを組み込みます。
手順は以前の記事を参照願います。

④USBマイクを接続する

右側面の穴からラズパイ本体のUSB端子にUSBマイクを接続します。
「Google AIY Voice Kit V2」付属の専用マイクの代わりに使用します。





以降の作業は、「Pi函 (pi-bako)」の電源を入れてラズパイとアンプHATを起動、その後、VNCを使いPC上にラズパイ画面を表示させて行います。

PC経由の設定/プログラムファイルの変更ですが…

---------------------------------------------------------------------------------------------------------------
以下の説明について。
当方、プログラミングについてはほとんど素人です。
ネットにある関連記事を参考に、適当にプログラムのコードを弄ってます。
結果オーライで運よく上手くいっているだけの可能性が大きいです。
ですので、もし参考にされる場合は、あくまで自己責任でお願いします。
---------------------------------------------------------------------------------------------------------------


アンプHATで音を出せるようにする

PCからVNCで接続して、その画面からラズパイの中のファイルを変更します。
VNC画面(ラズパイ側のデスクトップ画面)でタスクバーのターミナルアプリケーションアイコンをクリックして、ターミナル画面を立ち上げます。


config.txtを修正する

今回使うアンプHAT「InnoMaker Raspberry Pi HiFi AMP HAT」は、ドライバーとしてhifiberry-amp.dtbo」を使用するようです。
Voice KitのOSには/boot/overlaysフォルダーの中に始めから用意されていますので、config.txtを修正して、そのドライバーを使用するように指定が必要です。

ターミナル画面で、「sudo nano /boot/config.txt」と入力して、Enterキーを押します。(PC画面上で上記の文字列をコピーしてターミナル画面上でペーストしてもOKです。)
このコマンドは「bootフォルダーの中にあるconfig.txtというファイルを文字編集アプリ(nano)で開く」くらいの意味です。

下の方までスクロールさせて、以下の部分を修正します。

①「#dtparam=i2s=on」→「dtparam=i2s=on」(#を消す)



②「dtparam=audio=on」→「#dtparam=audio=on」(先頭に#を付ける)
その下に「dtoverlay=hifiberry-amp」を追加する(ドライバーを指定する)

------------------------------------------------------------------------------------
# Enable audio (loads snd_bcm2835)
#dtparam=audio=on
dtoverlay=hifiberry-amp
------------------------------------------------------------------------------------



そのまま保存します。
キーボードの「Ctrl」キーを押しながら「x」キーを押すと、保存するか聞いてきますので、「y」キーを押します。
ファイル名をconfig.txt(元のまま)にするか聞いてきますので、「Enter」キーを押して保存完了ですので、ターミナルアプリケーションを終了させます。

その後、メニューからラズパイを再起動(Reboot)させます。


設定を確認

再起動後、設定通りに変更されているか確認します。
PCからVNCで接続して、VNC画面(ラズパイ側のデスクトップ画面)で確認します。

①オーディオデバイスが認識されているか?

ターミナルアプリケーションを立ち上げて、「aplay -l」と入力します。
下図のようになっていればOKです。



②USBマイクが認識されているか?

ターミナルアプリケーションを立ち上げて、「arecord -l」と入力します。
下図のようになっていればOKです。


デモプログラムを動かしてみる

①Googleのサイトに登録した際に入手した認証ファイル「assistant.json」を用意します。

「assistant.json」の入力方法はこちらを参照願います。
そのファイルをファイルマネージャーを使って「home」>「pi」にコピーします。




②ファイルマネージャーで、「home」>「pi」>「AIY-voice-kit-python」>「src」> 「examples」>「voice」を開いてみると、AIY Projectsのデモプログラムがあります。

この中の「assistant_library_with_button_demo.py」を動かしてみます。

③デスクトップ画面の左端の「Start dev terminal」アイコンをダブルクリックします。


起動した「Start dev terminal」ターミナル画面に「src/examples/voice/assistant_library_with_button_demo.py」と入力して、Enterキーを押します。初回のみ、ブラウザーが立ち上がり、アカウントの認証作業があります。
(表示にかなり時間がかかりますが、気長に待ちましょう。認証作業はこちらを参照願います。)

④認証後、デモプログラムが実行されます。
そのターミナル画面のままで、まず「OK Google」と言ってから何か発話します。「ハロー」とか。
ターミナル画面内の文字列が一行づつ増えていけば動作している証拠です。
上手くいけば、何か反応して答えてくれるはずです。

⑤デモプログラムを終了したい場合は、キーボードの「Ctrl」キーを押しながら「c」キーを押すと終了します。

上手く動作しなかった場合の確認点

・マイクの設定を確認

デモプログラムを実行している状態で、デスクトップ画面の左端の「PulseAudio Volume Cont」アイコンをダブルクリックします。
「録音」タブを開いて、デバイス名が「USB PnP Sound Device アナログモノ」に
なっているか確認します。なっていなければ設定し直します。

 

あと、「入力装置」タブを開いて、「マイクロフォン」のレベル調整が小さい場合は100%まで上げます。


・アンプHATの音量設定を確認

同じく「PulseAudio Volume Cont」の「出力装置」タブを開いて、デバイス名が「snd_rpi_hifiberry_amp アナログステレオ」になっているか確認します。
音量設定は小さすぎても聞こえませんが、アンプHATの出力は結構大きいですので、大きくし過ぎるとスピーカーに悪影響がありそうです。
確認のためであれば「50%」前後で良いかと思います。

・日本語化していない

「Google Assistant」サービスを日本語化しないと日本語では返答してくれません。
日本語化の方法はこちらを参照願います。

・発話の音量設定が小さすぎ

デモプログラムは発話の音量設定を変更できますが、現在の設定が小さい場合がありますので、デモプログラムを実行している状態で、「OK Google」と言ってから、「音量10」と発話して、音量設定を変更します。(日本語化した後でないと日本語ではできませんが…)

自動起動にする

「Start dev terminal」ターミナル画面上で、デモプログラムが上手く動作しているようなら、それをラズパイの起動時に自動で起動するように設定します。

①ターミナル画面を出して、「sudo cp src/examples/voice/assistant_library_with_button_demo.py ~/AIY-projects-python/src/main.py」と入力して、Enterキーを押します。

これは自動起動したいデモプログラムを「main.py」という名前でコピーする手順です。
再起動後はこの「main.py」が読み込まれて、Voice Kitプログラムの動きをします。

以後、Voice Kitプログラムを修正する際は、直接「main.py」を編集せずに、元のデモプログラムの「assistant_library_with_button_demo.py」ファイルの方を修正します。
修正後、動作を確認、OKそうなら「main.py」を上書きして、再起動時に自動で起動させる、という流れが良いかと思います。

②ターミナル画面で、「sudo nano /lib/systemd/system/voice-recognizer.service」と入力して、Enterキーを押します。
空のファイルが出来ますので、そこへ以下の文字列をコピーしてペーストします。

------------------------------------------------------------------------------------
# HACKING.md for instructions on creating main.py and enabling it.

[Unit]
Description=voice recognizer
After=network.target ntpdate.service

[Service]
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
Environment=DISPLAY=:0

[Install]
WantedBy=multi-user.target
------------------------------------------------------------------------------------

そのまま保存します。
キーボードの「Ctrl」キーを押しながら「x」キーを押すと、保存するか聞いてきますので、「y」キーを押します。
ファイル名をconfig.txt(元のまま)にするか聞いてきますので、「Enter」キーを押して保存完了です。

③ターミナル画面で、「sudo systemctl enable voice-recognizer.service」と入力して、Enterキーを押します。
これは先ほど作成した「main.py」と言うファイルの自動起動をONにするように設定する手順です。
逆に自動起動をOFFにしたい場合は「sudo systemctl disable voice-recognizer.service」です。

実際の動作は?

ラズパイを再起動して動作を確認します。
電源ONにして起動完了までかなり待ちますが(1分くらい)、「OK Google」と言ってから、「明日の天気は?」と聞くと、日本語で返答してくれます。

とりあえずは上手く動作しているようです。

以前に作った「零函(zero-bako)」との違いは、ボタンを押さずに発話が開始できる事ですが、その他にも今回はアンプHATを使って音を出していますので、音質が良くなっているはずです。

とは言え、「明日の天気は?」なんかの会話では正直その恩恵はないですね。

アンプHATの真価は音楽を再生させた時に発揮されると思いますので、今後の記事でその辺も検証したいと思います。

コメント