Raspberry Pi Zero WHを使ってAmazon Echo Flexから音を出す

Raspberry Pi

構成図

今回の作業の大まかな構成図です。

Raspberry Pi zeroとAmazon echo flexをBlootoothで接続して、音を再生します。

Bluetoothの準備

Raspberry Pi Zero WHでBluetoothスピーカーを接続する準備を行います。

Amazon Echoをペアリングモードにします。
スマホやWEBのAlexaアプリか、声で「ペアリングして」といえばいいです。

コマンド
$ sudo bluetoothctl
[bluetooth]# scan on
[NEW] Device xx:xx:xx:xx:xx:xx Echo Flex-xxx
[bluetooth]# trust xx:xx:xx:xx:xx:xx
[bluetooth]# pair xx:xx:xx:xx:xx:xx

xx:xx:xx:xx:xx:xxの部分は適宜読み替えてください。

これでペアリングが完了しました。

次に、音をBluetooth経由で出力できるように設定します。

コマンド
$ sudo vim /etc/asound.conf
/etc/asound.conf
defaults.bluealsa.interface "hci0"
defaults.bluealsa.device "xx:xx:xx:xx:xx:xx"
defaults.bluealsa.profile "a2dp"
defaults.bluealsa.delay 10000

pcm.btreceiver {
    type plug
    slave.pcm {
        type bluealsa
        device "xx:xx:xx:xx:xx:xx"
        profile "a2dp"
    }
    hint {
        show on
        description "Bluetooth Receiver"
    }
}

pcm.!default {
    type plug
    slave.pcm "btreceiver"
}

2箇所のxx:xx:xx:xx:xx:xxはalexaのMACアドレス

これで以下のコマンドを実行して音が出れば完了です。

コマンド
$ aplay -D bluealsa /usr/share/sounds/alsa/Front_Center.wav

Open JtalkでRaspberry Piを喋らせる

Raspberry Pi(ラズパイ)を音声合成で日本語をしゃべらせてみた!(OpenJTalk) | りけろぐ
「ラズパイを音声合成でしゃべらせてみたい!」 ラズパイは最近IoTデバイスとして注目されています。 ラズパイはいわば小さいパソコンで、色々なことが出来ます。 前回、そんなラズパイをセットアップしてみました。 Google AIY Voice
Open JTalkのインストール
$ sudo apt-get install -y open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
女性の声の追加
$ cd /opt
$ mkdir openjtalk
$ sudo chown pi openjtalk
$ cd /opt/openjtalk
$ wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip --no-check-certificate
$ unzip MMDAgent_Example-1.7.zip
$ rm MMDAgent_Example-1.7.zip
発音スクリプトの追加
$ vi openjtalk.sh
openjtalk.sh
#!/bin/bash
tempfile=`tempfile`
if [ $# -ne 1 ]; then
	if [ $2 = "mei" ]; then
    	option="-m /opt/openjtalk/MMDAgent_Example-1.7/Voice/mei/mei_normal.htsvoice \
		-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
		-ow $tempfile"
	elif [ $2 = "mei_angry" ]; then
    	option="-m /opt/openjtalk/MMDAgent_Example-1.7/Voice/mei/mei_angry.htsvoice \
		-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
		-ow $tempfile"
	elif [ $2 = "man" ]; then
   	 option="-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
		-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
		-ow $tempfile"
	else
    	option="-m /opt/openjtalk/MMDAgent_Example-1.7/Voice/mei/mei_normal.htsvoice \
		-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
		-ow $tempfile"
	fi
else
    option="-m /opt/openjtalk/MMDAgent_Example-1.7/Voice/mei/mei_normal.htsvoice \
        -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
        -ow $tempfile"

fi
echo "$1" | open_jtalk $option
aplay -q $tempfile
rm $tempfile

MMDAgent_Example-1.7のパスの部分は適宜読み替えてください。

引数にmei_angryなどといれるとその声で再生されます。
何も入れないい場合はmeiで再生されます。

喋らせる
$ chmod +x openjtalk.sh
$ ./openjtalk.sh "おはよう" mei

このタイミングでecho flexから音が出なくなりました。

アップデートやrebootなどいろいろ試したのですが、原因はつかめず。

Amazon Echo Flexの電源を抜いて入れ直したらしゃべるようになりました。

Raspberry Pi を再起動した場合は再接続されないので
(Alexa側がペアリングモードを抜ける)
アレクサに一言「ペアリングして」と言えば自動的に繋がります。

あとはこのシェルスクリプトに喋らせたい言葉を突っ込めば好きに喋らせることができます。

iPhoneのオートメーション機能を使えばiPhoneから喋らせることも可能です。

キープアライブする

Amazon Echoから音が出力できるようになりましたが、時間をおくと接続が切れて、このとき再生すると

「〇〇に接続します」

と再生中の音にかぶせてAlexaが喋ります。

そこで、無音wavファイルを定期的に再生して接続を切れないようします。

参考サイト:

Amazon EchoをRaspberry PiのBluetoothスピーカーとして利用する | work.log

再生するシェルスクリプトを作成します。

alexa_keepalive.sh
#!/bin/bash

cd `dirname $0`

aplay -D bluealsa muon_01sec.wav

無音のwavファイルを適当に拾ってきます。

今回は参考サイトのリンク先にあったものを利用しました。

これを定期実行するためにcronに登録します。

5分毎に実行されます。

crontab -e
$ crontab -e

以下を追加
(ディレクトリは適宜読み替えてください)

*/5 * * * * /opt/scripts/alexa_keepalive.sh >/dev/null 2>&1

これで定期的に無音のファイルをAlexaから再生することで接続が切れないようになります。

iPhoneから喋らせる

ショートカットアプリを使えば簡単にsshができます。

400x400bb

ショートカット 

※ openjtalk.shのパスやファイル名が異なっているので適宜読み替えてください

適当にこのように作ってボタンを押して喋らせたい言葉を入力すれば、おしゃべりマシーンの完成です。

コメント

タイトルとURLをコピーしました