このプロジェクトは、Bluetoothスピーカーを介してTTS(テキストからスピーチ)を再生するホームアシスタント向けのメディアプレーヤー(カスタムコンポーネント)を提供します。
HAのBluetoothデバイストラッカー(プレゼンス検出用)を使用している場合、このプロジェクトは、両方のコンポーネントがうまく再生できるようにする交換用Bluetoothトラッカーも提供します。
Bluetoothトラッカーは絶えずデバイスをスキャンしているため、スキャン中にBluetoothスピーカーでのオーディオの再生が破壊される /途切れ途切れになる可能性があります。これらのカスタムコンポーネントは、そのうちの1つだけがBluetoothにいつでもアクセスしていることを確認するために連携します。
フローは次のようなものです:
sudo apt-get install pulseaudio pulseaudio-module-bluetooth bluez mplayer sox libsox-fmt-mp3
sudo adduser pi pulse-access
sudo adduser homeassistant pulse-access
/etc/pulse/system.paで、ファイルの下部に次のことを追加します。
### Bluetooth Support
.ifexists module-bluetooth-discover.so
load-module module-bluetooth-discover
.endif
#set-card-profile bluez_card.00_2F_AD_12_0D_42 a2dp_sink
最後の部分は、Bluetoothが異なるプロファイルにデフォルトであると思われる場合に備えて、A2DPの設定を維持することです。それはフレークのように見えるので、私はそれをコメントしました。
オーディオが遮断されている場合は、この行を除外することをお勧めします。
### Automatically suspend sinks/sources that become idle for too long
#load-module module-suspend-on-idle
file /etc/systemd/system/pulseaudio.serviceを作成し、以下を追加します。
[Unit]
Description=Pulse Audio
[Service]
Type=simple
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket
ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disable-shm --exit-idle-time=-1
[Install]
WantedBy=multi-user.target
サービスを起動時に開始できるようにします。
sudo systemctl daemon-reload
sudo systemctl enable pulseaudio.service
BluetoothインターフェイスへのPulseユーザーアクセスを提供します
edit /etc/dbus-1/system.d/bluetooth.conf
次の行を追加します。
<policy user="pulse">
<allow send_destination="org.bluez"/>
<allow send_interface="org.bluez.MediaEndpoint1"/>
</policy>
sudo bluetoothctl
scan on
pair 00:2F:AD:12:0D:42
trust 00:2F:AD:12:0D:42
connect 00:2F:AD:12:0D:42
quit
ファイル[PATH_TO_YOUR_HOME_ASSSISTANT]/scripts/pair_bluetooth.shを作成し、以下を追加します。 BluetoothアドレスをBluetoothスピーカーのアドレスに置き換えてください。
#!/bin/bash
bluetoothctl << EOF
connect 00:2F:AD:12:0D:42
EOF
スクリプトの実行権限を必ず付与してください。
sudo chmod a+x [PATH_TO_YOUR_HOME_ASSSISTANT]/scripts/pair_bluetooth.sh
/etc/rc.localで、ファイルの最後に次のことを追加して、スタートアップでスクリプトを実行します。
# Pair Bluetooth devices
[PATH_TO_YOUR_HOME_ASSSISTANT]/scripts/pair_bluetooth.sh
exit 0
TTS Bluetoothスピーカーコンポーネント(このGitHub Repoから)をコピーし、Home Assistant Config Directoryに保存します。
custom_components/tts_bluetooth_speaker/media_player.py
このステップは、Bluetoothトラッカーを使用している場合にのみ適用されます。
Bluetoothトラッカーコンポーネントをコピーして、ホームアシスタントの構成ディレクトリに保存します。
custom_components/bluetooth_tracker/device_tracker.py
pactl list sinks
あなたは次のようなものを見る必要があります:
Sink #1
State: SUSPENDED
Name: bluez_sink.00_2F_AD_12_0D_42.a2dp_sink
代わりにheadset_head_unitと言った場合、次のようにA2DPプロファイルに切り替えることができます。
pactl set-card-profile bluez_card.00_2F_AD_12_0D_42 a2dp_sink
もう一度確認し、A2DPを使用していることを確認します。
mplayerがA2DPにストリーミングできる場合、コマンドラインを使用してテスト
mplayer -ao pulse::bluez_sink.00_2F_AD_12_0D_42.a2dp_sink -channels 2 -volume 100 /some/mp3file.mp3
この段階では(再起動後)、HAのTTS Bluetoothスピーカーの使用を開始できるはずです。
以下は、コンポーネントの構成方法の例です。スピーカーのBluetoothアドレスを指定し、オプションでvolumeレベルを設定する必要があります(0〜1の間でなければなりません)。スピーカーがオーディオの最初の部分を再生していないことがわかった場合(つまり、再生されたときに最初の秒が欠落しています)、オプションで前および/または元のTTSオーディオの後に、 pre_silence_durationとpost_silence_durationオプション(0〜60秒の間である必要があります)をオプションで追加できます。 TTS Cacheディレクトリ(TTS構成内)を変更する場合は、ここでcache_dirここに設定して一致させる必要があります。
media_player:
- platform: tts_bluetooth_speaker
address: [BLUETOOTH_ADDRESS] # Required - for example, 00:2F:AD:12:0D:42
volume: 0.45 # Optional - default is 0.5
# pre_silence_duration: 1 # Optional - No. of seconds silence before the TTS (default is 0)
# post_silence_duration: 0.5 # Optional - No. of seconds silence after the TTS (default is 0)
# cache_dir: /tmp/tts # Optional - make sure it matches the same setting in TTS config
Bluetoothトラッカーを使用している場合、おそらくこれを構成に既に持っています。
device_tracker:
- platform: bluetooth_tracker
すべてが機能していることをテストするために、HA Frontendの開発者ツール>サービスを使用して、Bluetoothスピーカーを介してTTSメッセージを再生できます。

{ "entity_id": "media_player.tts_bluetooth_speaker", "message": "Hello" }
それをテストする別の方法は、HAが開始されるたびにTTSメッセージを再生する自動化を追加することです。
automation:
- alias: Home Assistant Start
trigger:
platform: homeassistant
event: start
action:
- delay: '00:00:10'
- service: tts.google_translate_say
data:
entity_id: media_player.tts_bluetooth_speaker
message: 'Home Assistant has started'