Ce projet fournit un lecteur multimédia (composant personnalisé) pour l'assistant à domicile qui joue TTS (text-to-dispeops) via un haut-parleur Bluetooth.
Si vous utilisez le tracker de périphérique Bluetooth de HA (pour la détection de présence), ce projet fournit également un tracker Bluetooth de remplacement qui permet aux deux composants de jouer bien ensemble.
Étant donné que le tracker Bluetooth scanne constamment pour les appareils, la lecture de l'audio sur le haut-parleur Bluetooth peut être perturbée / devenir saccadé pendant la numérisation. Ces composants personnalisés fonctionnent ensemble pour s'assurer que l'un d'eux accéde à Bluetooth à tout moment.
Le flux est quelque chose comme ceci:
sudo apt-get install pulseaudio pulseaudio-module-bluetooth bluez mplayer sox libsox-fmt-mp3
sudo adduser pi pulse-access
sudo adduser homeassistant pulse-access
Dans /etc/pulse/system.pa , ajoutez ce qui suit en bas du fichier:
### 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
La dernière partie consiste à persister le paramètre pour A2DP, au cas où votre Bluetooth semble par défaut un profil différent. Je l'ai commenté car il semble être floconneux.
Vous voudrez peut-être décomiser cette ligne si votre audio est coupé:
### Automatically suspend sinks/sources that become idle for too long
#load-module module-suspend-on-idle
Créez le fichier /etc/systemd/system/pulseaudio.service et ajoutez-y ce qui suit:
[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
Activez le service pour démarrer à l'heure du démarrage.
sudo systemctl daemon-reload
sudo systemctl enable pulseaudio.service
Donner un accès aux utilisateurs d'impulsion aux interfaces Bluetooth
Edit /etc/dbus-1/system.d/bluetooth.conf
Ajouter les lignes suivantes:
<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
Créez le fichier [PATH_TO_YOUR_HOME_ASSSISTANT]/scripts/pair_bluetooth.sh et ajoutez-y ce qui suit. Assurez-vous de remplacer l'adresse Bluetooth par celle de votre haut-parleur Bluetooth.
#!/bin/bash
bluetoothctl << EOF
connect 00:2F:AD:12:0D:42
EOF
Assurez-vous d'accorder des autorisations d'exécution pour le script.
sudo chmod a+x [PATH_TO_YOUR_HOME_ASSSISTANT]/scripts/pair_bluetooth.sh
Dans /etc/rc.local , ajoutez ce qui suit à la fin du fichier pour exécuter le script au démarrage:
# Pair Bluetooth devices
[PATH_TO_YOUR_HOME_ASSSISTANT]/scripts/pair_bluetooth.sh
exit 0
Copiez le composant de haut-parleur TTS Bluetooth (à partir de ce repo GitHub) et enregistrez-le dans votre répertoire de configuration d'assistant domestique.
custom_components/tts_bluetooth_speaker/media_player.py
Cette étape ne s'applique que si vous utilisez le tracker Bluetooth.
Copiez le composant Bluetooth Tracker et enregistrez-le dans votre répertoire de configuration d'assistant domestique.
custom_components/bluetooth_tracker/device_tracker.py
pactl list sinks
Vous devriez voir quelque chose comme:
Sink #1
State: SUSPENDED
Name: bluez_sink.00_2F_AD_12_0D_42.a2dp_sink
S'il indique à la place Headset_head_Unit, vous pouvez passer au profil A2DP comme suit:
pactl set-card-profile bluez_card.00_2F_AD_12_0D_42 a2dp_sink
Vérifiez à nouveau et validez qu'il utilise A2DP.
Tester en utilisant la ligne de commande si MPlayer peut diffuser vers A2DP
mplayer -ao pulse::bluez_sink.00_2F_AD_12_0D_42.a2dp_sink -channels 2 -volume 100 /some/mp3file.mp3
À ce stade (après un redémarrage), vous devriez pouvoir commencer à utiliser le haut-parleur TTS Bluetooth dans HA.
Vous trouverez ci-dessous un exemple de la façon dont le composant est configuré. Vous devez spécifier l'adresse Bluetooth de votre haut-parleur et définir éventuellement le niveau volume (doit être comprise entre 0 et 1). Si vous trouvez que votre haut-parleur ne joue pas la première partie de l'audio (c'est-à-dire que la première seconde est manquante lors de la lecture), vous pouvez éventuellement ajouter un silence avant et / ou après les options TTS audio d'origine les options pre_silence_duration et post_silence_duration (doivent être comprises entre 0 et 60 secondes). Si vous avez modifié votre répertoire de cache TTS (dans votre configuration TTS), vous devez définir le cache_dir ici pour correspondre.
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
Si vous utilisez le tracker Bluetooth, vous l'avez probablement déjà dans votre configuration:
device_tracker:
- platform: bluetooth_tracker
Pour tester que tout fonctionne, vous pouvez utiliser les outils de développeur> Services dans le frontage HA pour lire un message TTS via votre haut-parleur Bluetooth:

{ "entity_id": "media_player.tts_bluetooth_speaker", "message": "Hello" }
Une autre façon de le tester est d'ajouter une automatisation qui joue un message TTS chaque fois que HA est démarré:
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'