知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

AIY ProjectのVoice KitをVocie Kitなしでやってみた

AIY ProjectはGoogleのDo-it-yourself-arificial intelligence(自作AI)Projectで、Raspberry Pi 3とGoogle Assistant SDKとVoice KitでGoogle Homeみたいなものを自分で作ってみようというものです。

このVoice KitはオフィシャルラズパイマガジンのThe MagiPi Managize 2017年5月号に付属していて£5.39で買えるようなんですが凄い人気で在庫がない状況みたいです。

f:id:IntellectualCuriosity:20170617195852p:plain

ぼくも欲しいなぁっと思ったのですが、在庫なしの表示を見ていつものように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を追加してます。

f:id:IntellectualCuriosity:20170617212958j:plain

  • 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 Assistant APIの設定

ここからは、Google Could PlatformでGoogle Assistant APIを使えるように設定します。

  1. Could Consoleにアクセスして新しいプロジェクトを作ります。
  2. Google Assistant API」を有効にします。
    f:id:IntellectualCuriosity:20170618011754p:plain
  3. OAuth 2.0 clientの認証情報を作成します。

    f:id:IntellectualCuriosity:20170618012430p:plain

  4. 認証情報のOAuth同意画面にメールアドレスとサービス名を設定します。

    f:id:IntellectualCuriosity:20170618013217p:plain

  5. 認証情報を作成してダウンロードします。(太い下線付きの下矢印アイコン)

    f:id:IntellectualCuriosity:20170618013915p:plain

  6. ダウンロードした認証情報ファイルを「/home/pi/assistant.json」というファイル名にして移動します。
  7. デスクトップの「Start dev terminal」をダブルクリックして次のコマンドを実行します。
    sudo systemctl stop voice-recognizer
  8. Googleのアクティビティ管理の設定で以下をオンにします。
    ・ウェブとアプリのアクティビティ
    ・ロケーション履歴
    ・端末情報
    ・音声アクティビティ

 

スイッチとLEDの配線

タクトスイッチとLED(抵抗も)の配線はこんな感じです。

GPIO25をLEDのアノード(足の長い方)に接続して、右隣のGNDを抵抗の端に接続します。

タクトスイッチは極性が無いのでGPIO23と右隣のGNDを好きな方に接続します。

f:id:IntellectualCuriosity:20170618020159j:plain

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 Cloud Speech API

今の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にも対応していませんでした。