Alexaの組み込み1:ラズパイZero向けの音声入出力デバイスの組み込み

December 24, 2017

前回作成したmbedbot(mbedを使ったおしゃべりボット)は音声認識にマイクロソフトのSpeech API、発話内容を決定するのにGoogleのDialogflow(旧api.ai)、音声合成にaquestalk pico(LSI)を使用しましたが、今回はAmazon Alexaをraspberry pi zeroに組み込んでもう少しスマートにおしゃべり機能を実現しようと思います。

対話を行うためにはまずスピーカーとマイクをラズパイゼロに追加する必要がありますので、それらの入手と設定を行いました。

スピーカーについては、できるだけ安上がりで、USBポートを使わず、小型軽量なものが良かったので、USBスピーカーではなくラズパイ内蔵機能を使ってGPIO(#18)からPWMの音声信号を出力させて、手持ちのスピーカーで鳴らすことにしました。こちらを参考にさせていただきました(ありがとうございます)。ラズパイゼロのGPIOで音声を出力するには、gpio_alt.cと言うプログラムをAdafruitから入手してコンパイルし、下記のような引数で実行します。

gpio_alt -p 13 -f 0
gpio_alt -p 18 -f 5

グランドとGPIOを直接スピーカーに繋いでも小さい音しか聞こえませんので、手持ちのトランジスタでエミッタ接地増幅回路を実装して増幅することにしました。スピーカーは手持ちの不要な伝言再生機を分解して取り出したもの(十円玉サイズ)を使いました。

マイクについては、下記のものを購入しました。

[amazonjs asin=”B01M7YIYZV” locale=”JP” title=”サンワサプライ USBマイクロホン MM-MCU02BK”]

特にドライバを入れなくてもUSBに接続するだけで認識されました。あとデフォルトのデバイスを指定するため、こちらのサイトを参考に、下記のような設定ファイル(.asoundrc)をホームディレクトリにおきました。

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"
  }
}

hw:1,0は「カード1のデバイス0」と言う意味らしいです。

下記のように、録音用のデバイスのリストはarecord -l、再生用のデバイスのリストはaplay -lで表示されます。この表示のカード、デバイスの番号を.asoundrcで指定すると、それがデフォルトのハードウエアデバイスになる、と言うことだと思います。

pi@raspberrypi:~/project/alexa/AlexaPi $ 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
pi@raspberrypi:~/project/alexa/AlexaPi $ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Microphone [USB Microphone], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

 

下の写真はマイクとスピーカーを接続した状態です。スピーカーで隠れてますが、ユニバーサル基板上に増幅回路やピンヘッダがあります。あとモーターやスピーカーの電源はラズパイゼロからではなく、乾電池を使ってます。