Sprachausgabe auf Homepod bzw. AirPlay-Geräten

Begonnen von pldemon, 03 März 2021, 21:21:46

Vorheriges Thema - Nächstes Thema

pldemon

Hallo,

da ich in der Suche und im Netz diverse Fragen nach einer Sprachausgabe auf einem Homepod Mini/AirPlay-Geräten gesehen habe und ich diese Option bei mir nutze, habe ich meinen ganzen Krempel zusammengepackt und auf GitHub abgelegt. Anbei eine Anleitung zum Nachbauen:

Beschreibung:
Wie schon viele andere Ansätze setzt auch diese Lösung auf das Text2Speach-Modul auf. Text2Speach zeichnet sich dabei für die Generierung der Audio-Dateien verantwortlich. Danach wird die Datei allerdings nicht lokal mit Mplayer wiedergegeben, sondern mit ffmpeg in WAV konvertiert und mittels raop_play auf ein beliebiges, externes AirPlay-Gerät geleitet. Dazu musste allerdings Text2Speach abgeändert werden. Entsprechende Patches habe ich ebenfalls heute eingereicht (https://forum.fhem.de/index.php/topic,119272.0.html). Keine Ahnung aber, ob sie implementiert werden, weshalb ich die Anbindung der Änderungen hier ebenfalls beschreibe.

Installation:
Folgende Pakete müssen installiert werden, damit Text2Speach und »play.sh« funktionieren:

sudo apt-get install libdigest-perl-md5-perl libany-uri-escape-perl libtext-iconv-perl libencode-perl libmp3-info-perl mp3wrap
sudo apt-get install ffmpeg
sudo apt-get install avahi-utils


Ferner muss ein geeigneter Player vorhanden sein. Ich nutze für meine Belange raop_play, da es bereits als fertiges Compilat bereitgestellt wird und immer noch aktiv entwickelt wird:

git clone https://github.com/philippe44/RAOP-Player.git
cp RAOP-Player/bin/raop_play-armhf /usr/bin/raop_play
chmod 755 /usr/bin/raop_play


Zu alles Letzt müssen noch die bereits angesprochenen Änderungen in Text2Speach durchgeführt und »play.sh«,  installiert werden:

git clone https://github.com/pldemone/fhem-modules.git
cp fhem-modules/FHEM/98_Text2Speech.pm /opt/fhem/FHEM/
mkdir -p /opt/fhem_tools/data
cp fhem-modules/tools/play.sh /opt/fhem_tools/
chmod 755 /opt/fhem_tools/play.sh
chown -R fhem /opt/fhem_tools


Das neue Modul muss noch in FHEM geladen werden:
reload 98_Text2Speech

Danach einfach ./play.sh ohne Parameter ausführen, um die Verfügbarkeit der benötigten Pakete zu prüfen:

/opt/fhem_tools/play.sh

Erscheint der Hinweis »Script requires arguments«, so wurden alle benötigten Applikationen gefunden und man kann mit der Anpassung von »play.sh« fortfahren.

Anpassung:
»play.sh« ist für die Wiedergabe und die Steuerung der mittels Text2Speach generierten Audio-Dateien verantwortlich. Es erwartet eine Audio-Datei (Parameter1), die es dann in WAV umwandelt und an gewünschte AirPlay-Geräte sendet (Parameter2). »play.sh« kann (und sollte) geringfügig angepasst werden. Dazu sollten 3 Variablen geändert werden:

presound="/opt/fhem_tools/data/ding.mp3"
Sound/Jingle das der Sprachausgabe vorangestellt wird. Ist die Datei nicht vorhanden, wird die Sprache ohne ein zusätzliches Jingle wiedergegeben.

declare -A SYSTEMS=( ["office"]="192.168.0.130:7000" ["child"]="VSX-527.local")
Systemdefinition der Geräte. »office« und »child« sind im Beispiel frei gewählte Namen. Die Zuweisung kann direkt eine IP oder Hostnamen sein. Wird kein Port eingetragen, versucht das Script den passenden Port mittels avahi_browse zu erkennen.

defhost="office"
Standardgerät auf dem Audio abgespielt wird, wenn das Script ohne separate Option aufgerufen wurde

Anbindung und Nutzung in FHEM
Wie bereits geschrieben, muss Text2Speach zuerst eingerichtet werden. Wir nutzen für unseren Test den Standardprovider »Google« mit folgender Definition in FHEM:

defmod myTTS Text2Speech hw=1.0
attr myTTS TTS_Language Deutsch
attr myTTS TTS_CacheFileDir /opt/fhem/cache
attr myTTS TTS_UseMP3Wrap 1
attr myTTS TTS_MplayerCall /opt/fhem_tools/play.sh {file} "{options}"


Wird nun das »set«-Kommando auf das Gerät abgesetzt, wird der übermittelte Text direkt in FHEM von Text2Speech an Google übermittelt und in Audio umgewandelt. Danach wird es an »play.sh« übergeben, welches aus der mp3-Datei eine WAV-Datei generiert, sie in TTS_CacheFileDir ablegt und anschließend an das gewünschte Ausgabegerät mittels »raop_play« sendet.

In der Praxis würde das Ganze so aussehen:

set myTTS tts Hier kommt ein Test!

Wollt ihr nun, dass ein bestimmtes, zuvor in »play.sh« definiertes Gerät genutzt wird, gibt ihr den in »play.sh« zuvor fest definierten Namen als Parameter in »set« ein:

set myTTS tts [office] Hier kommt ein Test!

In diesem Fall wird »play.sh« die als »office« definierte IP-Adresse und den Port nehmen. In unserem obigen Beispiel »192.168.0.130:7000«.

Ihr könnt aber auch direkt den Hostnamen oder die IP des gewünschten Geräts in »set« eintragen – in diesem Fall wird »play.sh« nach dem Gerät suchen und automatisch den Port setzen

set myTTS tts [192.168.0.2] Hier kommt ein Test!

Zudem könnt ihr die Nachricht auch an mehrere Namen oder Geräte gleichzeitig senden. Hier ein Beispiel:

set myTTS tts [office,192.168.0.2] Hier kommt ein Test!

Das Script kann natürlich auch an andere Belange/Ausgabeformate angepasst werden. Zudem kann auch ein anderer Player benutzt werden und die Ausgabe beispielsweise an Sonos oder Chromecast umgeleitet werden. Mangels geeigneter Hardware (und Bedarf) wurde es aber nicht implementiert.

Gruß,
Mirko

Dirk070

#1
Hallo Mirko,

vielen Dank für Deine Arbeit und die Beschreibung.  :)
In der CommandRef für TTS scheinen Deine Änderungen enthalten zu sein und somit offiziell verfügbar.

Ich nutze den hier aus dem Forum betreuten Docker-Container für FHEM.
Da muss ich mal schauen, wie ich die Pakete, die Deine Lösung benötigt inkludieren kann.

Jedenfalls klasse, das es nun eine Lösung gibt, um den HomePod mini aus FHEM heraus zum Sprechen zu bekommen, Danke!!

Sollte schon jemand diesbezüglich mit dem Docker-Container gearbeitet haben, dann freue ich mich über eine kurze Info.

UPDATE:
Noch eine Kleinigkeit, in der play.sh passt eine Fehlermeldung nicht.
which raop_play >/dev/null 2>&1 || { echo "ffmpeg required but not found. Aborting." >&2; exit 1; }

which raop_play >/dev/null 2>&1 || { echo "raop_play required but not found. Aborting." >&2; exit 1; }

Viele Grüße
Dirk