work.log

元エンジニアの備忘録的ブログ

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

投稿:2020-01-14 17:19  更新:

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
音源の提供元:無音のwavファイル

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

実行してスピーカーから音が聞こえたら成功です。

メモは以上です。

スポンサーリンク

コメント

コメントを残す

よく読まれている記事

  • 本日
  • 週間
  • 月間