該項目為家庭助手提供了一個媒體播放器(自定義組件),該媒體助理通過藍牙揚聲器播放TTS(文本到語音)。
如果您正在使用HA的藍牙設備跟踪器(用於檢測),則該項目還提供了一個替換藍牙跟踪器,允許兩個組件可以很好地播放。
由於藍牙跟踪器不斷掃描設備,因此在掃描時可能會破壞藍牙揚聲器上的音頻播放。這些自定義組件共同努力,以確保其中只有一個在任何給定時間訪問藍牙。
流是這樣的:
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
最後一部分是堅持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
讓脈衝用戶訪問藍牙接口
edit /etc/dbus-1/system.d/bluetooth.conf /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 ,然後將以下內容添加到其中。確保用藍牙揚聲器替換藍牙地址。
#!/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藍牙揚聲器組件(從此Github repo中),然後將其保存到您的家庭助手配置目錄。
custom_components/tts_bluetooth_speaker/media_player.py
僅當您使用藍牙跟踪器時,此步驟才適用。
複製藍牙跟踪器組件並將其保存到您的主助手配置目錄。
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藍牙揚聲器。
以下是如何配置組件的示例。您需要指定揚聲器的藍牙地址,並選擇設置volume級(必須在0到1之間)。如果您發現揚聲器沒有播放音頻的第一部分(即播放時缺少第一秒),那麼您可以選擇在原始tts音頻hsing pre_silence_duration和post_silence_duration選項(必須在0到60秒之間)。如果您更改了TTS緩存目錄(在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
如果您使用的是藍牙跟踪器,則可能已經在配置中已經存在了:
device_tracker:
- platform: bluetooth_tracker
為了測試所有功能,您可以在HA Frontend中使用開發人員工具>服務通過藍牙揚聲器播放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'