スマートスピーカーを鳴らす(ラズパイZeroにVoice Kitを実装)

スマートスピーカーを自作?



「零函(zero-bako)」を使ってスマートスピーカーを作ってみたいと思います。

実は、Google社から「Google AIY Voice Kit V2」というラズパイZeroが付属した自作キットがすでに販売されていまして、そのVoice Kitソフトウェアを流用すれば、自作キットなしでもスマートスピーカー機能が実現できます。

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

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



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

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


config.txtを修正する

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


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

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

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

②「dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4」を追加する(GPIOから音声出力させる)

------------------------------------------------------------------------------------
# Enable audio (loads snd_bcm2835)
dtparam=audio=on
[pi0]
dtoverlay=dwc2
dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4
[all]
------------------------------------------------------------------------------------



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

その後、ラズパイをメニューからシャットダウンさせて、電源を切ります。


ラズパイZeroをスピーカー本体に組み込む

①ラズパイを収納する


底面の収納部にラズパイ本体を上図の向きでMicroUSB端子同士が平行になるように入れます。
次にラズパイを平行に動かして、ラズパイ側とスピーカー側のMicroUSB端子を接続します。
(ラズパイZero本体の固定も兼ねますので、奥まで確実に差し込みます。)

②電源(5V)、電源ランプ(LED)を接続する


電源の「+」と「-」をラズパイ本体に接続します。
ラズパイ本体のGPIOピンの「5V」に「+」を、「GND」に「-」を接続します。
電源ランプ用のLCD(ボタンに内蔵)の「+」と「-」をラズパイ本体のGPIOピンに接続します。
ラズパイ本体のGPIOピンの「3.3V」に「+」を、「GND」に「-」を接続します。 これにより電源ON時にスピーカー前面のボタンが光り、通電状態を知らせます。

③ボタンを接続する


ボタンの「+」と「-」をラズパイ本体のGPIOピンに接続します。
「Google AIY Voice Kit V2」付属の専用ボタンは回路的にはGPIO23に接続されいるようですので、それを代用する形で使用します。

④アンプへの音声入力を接続する


アンプへの音声入力をラズパイ本体のGPIOピンに接続します。
ラズパイZeroには他のシリーズのように専用の音声出力端子がありませんので、GPIOから出力させます。

⑤USBマイクを接続する





背面のUSB端子にUSBマイクを接続します。
「Google AIY Voice Kit V2」付属の専用マイクの代わりに使用します。

⑥電源を接続して、ラズパイを再起動する




設定を確認

再起動後、設定通りに変更されているか確認します。
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キーを押します。初回のみ、ブラウザーが立ち上がり、アカウントの認証作業があります。
(ラズパイZeroでは処理速度が遅いため、表示にかなり時間がかかりますが、気長に待ちましょう。認証作業はこちらを参照願います。)

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

ちなみに、ラズパイZeroを使ったVoice Kitスマートスピーカーでは、「OK Google」という話しかけでの動作開始はできないようです。(ボタン押し開始のみ)
他の機種(3Bシリーズ等)では可能なので、ラズパイ自体の処理速度の違いで制限をかけているのかもしれません。

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

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

・マイクの設定を確認

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

 

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


・音量設定が小さすぎ

デモプログラムは発話で音量を変更できますが、現在の音量設定が小さい場合がありますので、デモプログラムを実行している状態で、ボタンを押して、「音量10」と発話して、音量設定を変更します。

・日本語化していない

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

自動起動にする

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

①ターミナル画面を出して、「sudo cp src/examples/voice/assistant_library_with_button_demo.py ~/AIY-projects-python/src/main.py」と入力して、Enterキーを押します。
これは自動起動したいデモプログラムを「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」です。

実際の動作は?

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

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

ただ、要改善項目もあります。
GPIOからの音声出力に少しノイズが乗って聞こえます。(音量が大きい場合、気になる…。)
3Bシリーズ、等の3.5mmオーディオ出力もあまり音質が良くないと言われますが、これは元々の仕様なのでしょうか?

ノイズを目立たなくする方法は、「PulseAudio Volume Cont」アイコンをダブルクリックして出てくる画面で、「出力装置」タブを開いて、レベル調整を上げる事です。
下図のように「100%」より小さかった場合は「100%」まで上げます。
これによってスピーカー自体の音量調節レベルを、相対的に下げる事でノイズのレベルが下がったように聞こえます。





コメント