AIY ProjectはGoogleのDo-it-yourself-arificial intelligence(自作AI)Projectで、Raspberry Pi 3とGoogle Assistant SDKとVoice KitでGoogle Homeみたいなものを自分で作ってみようというものです。
このVoice KitはオフィシャルラズパイマガジンのThe MagPi Managize 2017年5月号に付属していて£5.39で買えるようなんですが凄い人気で在庫がない状況みたいです。
ぼくも欲しいなぁっと思ったのですが、在庫なしの表示を見ていつものようにGoogle先生に聞いたらこの記事を教えてもらいました。
Voice KitをVoice Kitなしでやってみるのに必要なもの
How to build your own digital assistant with a Raspberry Piで必要と書いてあったのはこれらです。
- Raspberry Pi 3
- スピーカー(3.5mmミニジャックにつながるもの)
- USBマイク
- GPIO経由で繋げる物理スイッチ
で、ぼくが用意したものはこれです。Voice Kitに忠実にLEDを追加してます。
- Raspberry Pi 3
- On-Lap 1101H(スピーカー付きHDMIモニタ)
(ぼくはTVを持ってないんですが、TVがある人はTVでいいと思う) - SANWA MM-MCU03BK(USBマイクロフォン)
- ちょっと大きめタクトスイッチ
- 緑LEDと330Ωの抵抗
タクトスイッチはGPIO23、LEDはGPIO25に繋げます。(他はGND)
SDカードにVoice Kitイメージを焼く
- AIY Projectの「Get the Voice Kit SD Image」からSDイメージをダウンロードします。
- ダウンロードしたSDイメージをSDに焼きます。
SDカードを焼くのにAIY ProjectではEtcher.ioというユーティリティーが紹介されていて、ぼくもそれを使いました。焼けるまで結構時間がかかります。
SDが焼けたら、ラズパイにセットして起動します。
普通にラズパイをセッティングするように、いつものセッティングをしてください。特別なことはありません。
使いやすくセッティングしたらVoice Kitの音声系の設定を変更します。
sudo leafpad /boot/config.txt
を実行して、一番後ろの部分のコメントをつぎのように変えます。
# Enable audio (loads snd_bcm2835)
dtparam=audio=on
#dtoverlay=i2s-mmap
#dtoverlay=googlevoicehat-soundcard
オーディオ設定
まずVoice Kit用のオーディオ設定を変更します。
sudo leafpad /etc/asound.conf
を実行して、次の記述に入れ替えてリブートします。
pcm.!default {
type asym
capture.pcm "mic"
playback.pcm "speaker"
}
pcm.mic {
type plug
slave {
pcm "hw:1,0"
}
}
pcm.speaker {
type plug
slave {
pcm "hw:0,0"
}
}
リブートしたらデスクトップにある「Start dev terminal」をダブルクリックして、「 leafpad /home/pi/voice-recognizer-raspi/checkpoints/check_audio.py」を実行します。
上付近にある「VOICEHAT_ID = 'googlevoicehat'」を「VOICEHAT_ID = 'bcm2835'」に書き換えて保存します。
保存したら、デスクトップにある「Check audio」をダブルクリックしてオーディオの動作確認をします。
ぼくの場合は途中で失敗したので、Google Assistant SDKの「Configure and Test the Audio」を見て「/etc/asound.conf」を修正しました。
録音と再生のデバイスを表示するコマンドを実行して、「/etc/asound.conf」を書き換えます。
pi@JoJoPi32:~ $ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Microphone [USB Microphone], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
pi@JoJoPi32:~ $ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
サブデバイス: 8/8
サブデバイス #0: subdevice #0
サブデバイス #1: subdevice #1
サブデバイス #2: subdevice #2
サブデバイス #3: subdevice #3
サブデバイス #4: subdevice #4
サブデバイス #5: subdevice #5
サブデバイス #6: subdevice #6
サブデバイス #7: subdevice #7
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
hw:の後はcard number,deive numberとなるので、pcm.micの方は「hw:1,0」で変わらず、pcm.speakerはHDMIを使うので「hw:0:1」に修正しました。
ここからは、Google Could PlatformでGoogle Assistant APIを使えるように設定します。
- Could Consoleにアクセスして新しいプロジェクトを作ります。
- 「Google Assistant API」を有効にします。
- OAuth 2.0 clientの認証情報を作成します。
- 認証情報のOAuth同意画面にメールアドレスとサービス名を設定します。
- 認証情報を作成してダウンロードします。(太い下線付きの下矢印アイコン)
- ダウンロードした認証情報ファイルを「/home/pi/assistant.json」というファイル名にして移動します。
- デスクトップの「Start dev terminal」をダブルクリックして次のコマンドを実行します。
sudo systemctl stop voice-recognizer
- Googleのアクティビティ管理の設定で以下をオンにします。
・ウェブとアプリのアクティビティ
・ロケーション履歴
・端末情報
・音声アクティビティ
スイッチとLEDの配線
タクトスイッチとLED(抵抗も)の配線はこんな感じです。
GPIO25をLEDのアノード(足の長い方)に接続して、右隣のGNDを抵抗の端に接続します。
タクトスイッチは極性が無いのでGPIO23と右隣のGNDを好きな方に接続します。
LEDには次のような意味があって、「~/voice-recognizer-raspi/src/led.py」でカスタマイズができるそうです。
LEDの動作 | 説明 |
---|---|
パルス | スタートアップ中かまだ音声認識できない状態 |
点滅(数秒間隔) | 利用可能な状態 |
オン | 聴いている状態 |
パルス | 考え中か返答中の状態 |
パルス → オフ | シャットダウン中の状態 |
3回点滅 → ポーズ | エラー |
Google Assistantの実行
マニュアルで実行する場合はデスクトップの「Start dev terminal」をダブルクリックして次のコマンドを実行します。
src/main.py
Ctrl-Cでプログラムを終了できます。
サービスとして実行する場合は次のコマンドを実行します。
sudo systemctl start voice-recognizer
サービスを止める場合は次のコマンドを実行します。
sudo systemctl stop voice-recognizer
サービスを自動実行させる場合は次のコマンドを実行します。
sudo systemctl enable voice-recognizer
今のGoogle Assistant APIは英語にしか対応していませんが、Google Cloud Speech APIは80カ国語に対応していると書いてあったので、Google Could Speech APIを有効にしてGoogle Cloud Speechを使うように設定ファイルを変えてみました。
設定ファイルの場所
/home/pi/.config/voice-recognizer.ini
設定ファイル
# Default config file for the voice-recognizer service.
# Should be installed to ~/.config/voice-recognizer.ini
# Select the trigger: gpio (default), clap.
# trigger = clap
# Uncomment to enable the Cloud Speech API for local commands.
cloud-speech = true
# Uncomment to change the language. The following are supported:
# Embedded Assistant API [cloud-speech = false] (at launch)
# en-US
# Cloud Speech API with local TTS [cloud-speech = true]
# de-DE en-GB en-US es-ES fr-FR it-IT
# (This is limited by the local TTS. Cloud Speech API supports many more.)
language = ja-JP
# Path to client secrets for the Assistant API.
assistant-secrets = ~/assistant.json
# Path to service account credentials for the Cloud Speech API.
cloud-speech-secrets = ~/cloud_speech.json
Google Assistantはクラウドから応答を音声ファイルとして受け取るのに対して、Google Cloud Speechは応答をテキストファイルで受け取ってローカルのTTS(Text To Speechプログラム=音声合成プログラム)を使う仕組みになっているようなんです。
設定ファイルのコメントにも書かれている通りTTSが日本語に対応していないため、エラーが出てしまいました。
また、英語にした場合は動作するものの、音声がGoogle Assistantに比べて聞き難く、IFTTTのGoogle Assistantにも対応していませんでした。