Raspberry Pi 4(通称ラズパイ)からAmazon EchoをBluetoothスピーカーとして利用する方法のメモです。
ラズパイはBluetoothを搭載しているのでAmazon Echoとも接続出来ますが、そのままだと出力がラズパイのスピーカーに出てしまい軽くハマったのでやった事を残しておきます。
全部コマンド操作でやります。
目次
スポンサーリンク
Raspberry PiとAmazon EchoのBluetooth接続
まずはラズパイとAmazon EchoのBluetooth接続の仕方から。今回はAmazon Echo Plus 第2世代とペアリングしてみました。
ユーザーをbluetooth、audioグループに追加
Bluetoothスピーカーを使うユーザーがbluetooth、audioグループに所属している必要があるので追加します。
デフォルトのpiユーザーを使っている場合はこの操作は不要です。
$ sudo usermod -a -G bluetooth rpuser $ sudo usermod -a -G audio rpuser
Amazon Echoとペアリングする
まずは必要なパッケージのインストール。
$ sudo apt install bluealsa
bluetoothctlコマンドを使いデバイスの検索を行います。
scanすると付近にあるBluetoothデバイスが続々と出てきますので、そうしたらアレクサに「アレクサ、ペアリングして」と話しかけます。
アレクサアプリからも出来るみたいなのですがやり方がわからなかったので手っ取り早くボイスコマンドを使いました。
$ sudo bluetoothctl [bluetooth]# scan on Discovery started . . [NEW] Device XX:XX:XX:XX:XX:XX Echo Plus-2KU <= 発見 . . [bluetooth]# scan off
Amazon Echoを見つけたらペアリングして接続します。
## 信頼する [bluetooth]# trust XX:XX:XX:XX:XX:XX [CHG] Device XX:XX:XX:XX:XX:XXTrusted: yes Changing XX:XX:XX:XX:XX:XX trust succeeded ## ペアリング [bluetooth]# pair XX:XX:XX:XX:XX:XX Attempting to pair with XX:XX:XX:XX:XX:XX Pairing successful ## 接続 # connect XX:XX:XX:XX:XX:XX Attempting to connect to YY:YY:YY:YY:YY:YY
うまくいっていればここでアレクサが新しいデバイスと接続したと知らせてくれます。
## ペアリングの確認 [Echo Plus-2KU]# paired-devices Device XX:XX:XX:XX:XX:XX Echo Plus-2KU <= 接続できた [Echo Plus-2KU]# quit
ラズパイから音を鳴らしてみます。aplayコマンドの-DオプションでBluetoothデバイスを指定します。
$ aplay -D bluealsa /usr/share/sounds/alsa/Front_Center.wav
「フロント、センター」とスピーカーから聞こえたら成功です。
Amazon Echoの自動接続設定
次回以降も自動でAmazon Echoと接続する設定をしておきます。
$ vi ~/.asoundrc
“XX:XX:XX:XX:XX:XX”の部分は自身の物に置き換えます。
defaults.bluealsa.interface "hci0"
defaults.bluealsa.device "XX:XX:XX:XX:XX:XX"
defaults.bluealsa.profile "a2dp"
defaults.bluealsa.delay 10000
pcm.bt-receiver {
type bluealsa
device "XX:XX:XX:XX:XX:XX"
profile "a2dp"
}
Amazon Echoの音量調整
繋いだ直後だとスピーカーの音量がMAXになっているのでで調整します。まずはamixerで状態を調べます。
$ amixer -D bluealsa Simple mixer control 'Echo Plus-2KU - A2DP',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 127 Mono: Front Left: Playback 127 [100%] [on] Front Right: Playback 127 [100%] [on]
Amazon Echoを指定して音量を50%に設定します。
$ amixer -D bluealsa set "Echo Plus-2KU - A2DP" 50% Simple mixer control 'Echo Plus-2KU - A2DP',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 127 Mono: Front Left: Playback 64 [50%] [on] Front Right: Playback 64 [50%] [on]
ただし、再接続すると元に戻るのでそこは注意。
Amazon EchoとのBluetooth接続を維持する
たまにBluetooth接続が切れてしまうようで突然再接続したと喋りだすので、定期的に無音の音源を再生してなんちゃってキープアライブします。
$ sudo wget -O /home/nosound.wav http://raindrop.sakura.ne.jp/iroiro/muon_01sec.wav $ crontab -e ----- 追加 ----- */5 * * * * /usr/bin/aplay/aplay -q -D bluealsa /home/nosound.wav >/dev/null 2>&1
PythonからAmazon Echoに音声を出力する
pyaudioモジュールを利用してPythonからAmazon Echoに音声を出力するサンプルです。音源にはwavファイルを利用します。
PythonはPyenv経由でインストールした3.6.10で検証。3.7系だとpyaudioモジュールがインストール出来なかった。(未解決)
Pyenvについては書きを参照。OSは違いますがインストール方法は同じです。
pyaudioモジュールはこのようにインストールします。
$ sudo pip install pyaudio
Python経由でwavファイルを再生するサンプルコードです。
import wave
import pyaudio
def play(wav_file):
try:
wf = wave.open(wav_file, "rb")
except FileNotFoundError:
print("No such file " + wav_file)
return
p = pyaudio.PyAudio()
## Bluetoothスピーカーの情報を取得
for device_index in range(p.get_device_count()):
device = p.get_device_info_by_index(device_index)
if device["name"] == "bluealsa":
bluetooth_device = device_index
## Bluetoothスピーカーを指定してストリームオープン
stream = p.open(
format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True,
output_device_index=bluetooth_device
)
# 再生
chunk_size = 1024
data = wf.readframes(chunk_size)
while len(data) > 0:
stream.write(data)
data = wf.readframes(chunk_size)
stream.stop_stream()
stream.close()
p.terminate()
if __name__ == "__main__":
play("/usr/share/sounds/alsa/Front_Center.wav")
実行してスピーカーから音が聞こえたら成功です。
メモは以上です。