Sonos2mqtt, Text2Speech und Amazon Polly?

Begonnen von gestein, 06 Oktober 2021, 10:37:02

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

nachdem meine Sonos nun über Sonos2mqtt zum Laufen gebracht habe (Danke für die tolle Arbeit und die Anleitungen), möchte ich gerne noch die Sprachausgabe mit Amazon Polly realisieren.

Auch da habe ich einges gelesen, aber irgendwie werde ich nicht schlau daraus.
Wie muss ich das nun angehen und welche Parameter muss ich da einstellen?
Könnte mir bitte jemand dabei helfen?

Danke im Voraus
lg, Gerhard

gestein

Bis dato hatte ich das im Sonos-Modul mit dem Speak1-Befehl gehandhabt.
Speak1
mp3:/usr/bin/aws polly synthesize-speech --debug --output-format mp3 --text-type text --voice-id %language% --text '%text%' %filename%


Allerdings hat das sehr oft nicht funktioniert, da entweder das Sonos-Device "disappeared" war oder Sonos der Meinung war, dass der Befehl Speak1 nicht definiert war.

lg, Gerhard

binford6000

Hallo Gerhard,
wenn du bereits sonos2mqtt einsetzt liegt es doch nahe auch
https://github.com/svrooij/node-sonos-tts-polly
einzusetzen.

Das gibt es entweder auch per Node oder aber per Docker.
Bei der Docker-Variante gibt es einen fehler in der Doku. Siehe auch hier.
https://forum.fhem.de/index.php/topic,111711.msg1170095.html#msg1170095

Damit gehts dann in etwa so:
set $device speak de-DE Vicki 15 $text

VG Sebastian

gestein

Hallo Sebastian,

Danke für den Hinweis.
Ich habe den ganzen Abend versucht die Installation der node-Version mit "npm i -g @svrooij/sonos-tts-polly" zum Laufen zu bringen.
Leider bekomme ich immer den Fehler:
/home/pi/nodejs/node-v16.9.1-linux-armv6l/bin/sonos-tts-polly: Zeile 1: use strict: Kommando nicht gefunden.
/home/pi/nodejs/node-v16.9.1-linux-armv6l/bin/sonos-tts-polly: Zeile 2: Syntaxfehler beim unerwarteten Wort `('
/home/pi/nodejs/node-v16.9.1-linux-armv6l/bin/sonos-tts-polly: Zeile 2: `var __importDefault = (this && this.__importD


Dann habe ich versucht docker zu installieren, scheitere aber noch an den Zugriffsrechten:
docker run armhf/hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Da finde ich sicher noch die Lösung.

lg, Gerhard

binford6000

Moin Gerhard,

Zitat von: gestein am 07 Oktober 2021, 00:47:16
/home/pi/nodejs/node-v16.9.1-linux-armv6l/bin/sonos-tts-polly: Zeile 1: use strict: Kommando nicht gefunden.
/home/pi/nodejs/node-v16.9.1-linux-armv6l/bin/sonos-tts-polly: Zeile 2: Syntaxfehler beim unerwarteten Wort `('
/home/pi/nodejs/node-v16.9.1-linux-armv6l/bin/sonos-tts-polly: Zeile 2: `var __importDefault = (this && this.__importD


das hattte ich bei der Node Variante auch:
https://forum.fhem.de/index.php/topic,111711.msg1151952.html#msg1151952
Daher (und weil sonos2mqtt auch bereits im Container läuft) bin ich auf Docker umgestiegen.

ZitatDann habe ich versucht docker zu installieren, scheitere aber noch an den Zugriffsrechten:
docker run armhf/hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Da finde ich sicher noch die Lösung.

Probier mal mit sudo:
sudo docker run armhf/hello-world

VG Sebastian


gestein

Hallo Sebastian,

Danke für die Tipps.
Ich habe heute mal etwas Verrücktes wegen der Node-Installation von sonos-tts-polly versucht und bin in den sudo-Modus gewechselt.
Dann musste ich noch den Suchpfad richtig setzen und siehe da, sonos-tts-polly läuft.
Da ist also etwas bei der Installation von node und/oder sonos-tts-polly mit den Rechten schiefgegangen.

Ich bräuchte aber bitte noch eine Schubs.
Wie binde ich nun sonos-tts-polly in fhem ein? Was muss ich dazu im Text2Speech-Device eintragen.
Irgendwie werde ich aus den ganzen Threads und Beiträgen nicht schlau.

Danke im Voraus
lg, Gerhard

Danke im Voraus
lg, Gerhard

kjmEjfu


touch .env
pico .env
# Set the IP of one known sonos speaker (device discovery doesnt always work inside docker.)
SONOS2MQTT_DEVICE=$SONOS_IPADRESSE
# Set the mqtt connection string
SONOS2MQTT_MQTT=mqtt://$MQTT_USER:$MQTT_USER_PASSWORD@$MQTT_SERVER_IP:$MQTT_SERVER_PORT
# Publish distinct if your want
# SONOS2MQTT_DISTINCT=true
# Set the IP of the docker host (so node-sonos-ts knows where the events should be send to)
SONOS_LISTENER_HOST=$IPADRESSE_DOCKERHOST
# Set text-to-speech endpoint (optional)
SONOS_TTS_ENDPOINT=http://$IPADRESSE_DOCKERHOST:5601/api/generate
SONOS2MQTT_DISCOVERY=true
SONOS2MQTT_DISCOVERYPREFIX=sonos
docker run --name=sonos2mqtt --env-file .env -p 6329:6329 svrooij/sonos2mqtt


touch .env-polly
pico .env-polly
SONOS_TTS_AMAZON_KEY=$AMAZON_KEY
SONOS_TTS_AMAZON_SECRET=$AMAZON_SECRET
SONOS_TTS_AMAZON_REGION=eu-central-1
SONOS_TTS_CACHE_FOLDER=cache
SONOS_TTS_CACHE_URI=http://$IP_ADRESSE_DOCKERHOST:5601/cache/
SONOS_TTS_ALLOW_GET=true
docker run --name=sonos-tty-polly --env-file .env-polly -d -v /opt/polly/cache:/usr/src/app/cache -p 5601:5601 svrooij/sonos-tts-polly


bei den ganzen $ musst du halt die Variable durch den richtigen Wert ersetzen.

Dann hast du schon mal die Container mit sonos_mqtt und sonos_tts_polly ordentlich laufen.

Anschließend weiter unter https://wiki.fhem.de/wiki/Sonos2mqtt
Migriere derzeit zu Home Assistant

gestein

#7
Hallo,

vielen Dank an alle.
Mit eurer Hilfe konnte ich schon mal sonos-tts-polly und sonos2mqtt zum Laufen bringen.
Wenn ich den "speak"-Befehl im Sonos-Device absetze, dann wird im lokalen Verzeichnis die entsprechende Datei erzeugt.
Die Datei kann ich im Webbroswer auch mit dem Link aufrufen und der Text wird abgespielt.
Im Log steht dann:
2021.10.08 00:23:32.793 3: MQTT2_DEVICE set MQTT2_RINCON_000E58D553D401400 speak 30 Hallo Gerhard, es klappt!
2021.10.08 00:23:32.871 4: SonosTTS: ermittelte CodePage: ascii , konvertiere nach UTF-8
2021.10.08 00:23:32.872 4: SonosTTS: MaxChar = 3000, Delimiter = (?<=[\.!?])\s*, ForceSplit = 0, AddDelimiter =
2021.10.08 00:23:32.873 4: SonosTTS: Auflistung der Textbausteine nach Aufbereitung:
2021.10.08 00:23:32.873 4: SonosTTS: 0 => Hallo Gerhard, es klappt!
2021.10.08 00:23:34.295 4: SonosTTS: Verwende TTS Spracheinstellung: Deutsch
2021.10.08 00:23:34.297 4: SonosTTS: Textbaustein ist keine direkte MP3 Datei, ermittle MD5 CacheNamen: 9b2a60a4fac638539a7a60998dce448b.mp3
2021.10.08 00:23:34.298 4: SonosTTS: Bearbeite per MP3Wrap jetzt den Text: Hallo Gerhard, es klappt!
2021.10.08 00:23:35.965 4: SonosTTS: Es wurden alle Teile ausgegeben und der Befehl ist abgearbeitet.
2021.10.08 00:23:36.193 3: MQTT2_DEVICE set MQTT2_RINCON_000E58D553D401400 notify 30 http://192.168.0.117:8083/fhem/SonosSpeak/9b2a60a4fac638539a7a60998dce448b.mp3


Aber man hört nix vom Lautsprecher.
Auch wenn ich händisch den Befehl "notify 30 http://192.168.0.117:8083/fhem/SonosSpeak/9b2a60a4fac638539a7a60998dce448b.mp3" eingebe, dann passiert auch nix.
Im log-File erscheint kein weiterer Eintrag, obwohl "verbose 5" eingetragen ist.

Was passiert eigentlich beim "notify"-Aufruf?

lg, Gerhard

binford6000

Guten Morgen Gerhard,
hast du dich wie kjmEjfu empfohlen hat ans Wiki gehalten? Und damit auch das HTTPSRV-Device angelegt?
Du kannst die Codeschnipsel dort 1:1 verwenden. Bei dir zeigt der Link ins FHEM-Verzeichnis:
http://192.168.0.117:8083/fhem/SonosSpeak/9b2a60a4fac638539a7a60998dce448b.mp3

Mit HTTPSRV-Device sollte im TTS-Device der korrekte Link auftauchen:
http://10.3.3.9:5601/fhem/cache/cb93b8818ea47a3439d69a2c7cf60d9a.mp3
Dieser zeigt bei mir auf den Docker-Host und den Port von sonos-tts-polly.

defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb

VG Sebastian

gestein

Guten Morgen Sebastian,

ja, das habe ich.
Ich habe mich damals (für die Sonos-Devices) auch an eine Anleitung gehalten und habe daher das Verzeichnis "/var/SonosSpeak".
Das passt aber nicht zu der nun verwendeten Namenskonvention.
Im userreading "httpName" im "SonosTTS" wird auf den HTTPSRV verwiesen:
userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}

Daher steht da bei mir dann:
http://192.168.0.117:8083/fhem/var/SonosSpeak/9b2a60a4fac638539a7a60998dce448b.mp3

Das geht aber anscheinend nicht mit dem HTTPSRV-Device zusammen, denn das würde zugreifen auf (ohne var):
http://192.168.0.117:8083/fhem/SonosSpeak/9b2a60a4fac638539a7a60998dce448b.mp3
Mit dem "/var" konnte ich es nicht zum Laufen bringen.

Daher werde ich wohl auch auf das "cache" umsteigen.
Ist für mich eh besser alles nach Anleitung zu machen ;)

Habe gerade festgestellt, dass die Ansage auf meinen Sonos One etc. zu hören sind. Super, danke für die Hilfe!!
Nur bei den älteren Sonos Amp geht's noch nicht - mal sehen.

Vielen herzlichen Dank!
lg, Gerhard

Otto123

#10
Hi,

wenn ihr sonos2mqtt nutzt und sonos-tts-polly ordentlich damit einbindet (wie oben #6 beschrieben), dann hat das alles nichts mehr mit Text2Speech und Webservern zu tun!
Dann lautet einfach der speak Befehl etwas anders!

Das kann auch parallel genutzt werden.

https://wiki.fhem.de/wiki/Sonos2mqtt#Speak_Befehl

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz