Sonos TTS : Sprachausgabe in homee nutzen (NodeRed, Polly, Webhooks)

Servus zusammen,

heute gibt es mal wieder ein kleines Projekt für die NodeRed Interessierten unter euch.
Die Sonos Integration in homee wird ja von vielen seit längerem gewünscht.

Zwei Dinge sind dabei von Interesse. Einmal die Einbindung der Sonos Lautsprecher als Geräte, um die Wiedergabe von Musik zu steuern. Zum anderem die Sprachausgabe von beliebigen Texten als Ansage- oder Informationsmedium.

In diesem Tutorial geht es genau um diesen zweiten Punkt: die Nutzung der Sprachausgabe über Sonos Lautsprecher in homee.

Voraussetzungen:
a) Sonos Lautsprecher
b) Raspberrypi mit NodeRed
c) Node: node-red-contrib-sonospollytts
d) ein Amazon AWS-Konto für Zugriff auf Amazon Polly Sprachausgabe
d) Homegramme mit den Texten aus homee

Eindrücke:

Vorgehen:
a) Bei Amazon AWS ein Konto anlegen , wer das nicht nicht hat. Die Services sin im 1. Jahr kostenlos, danach bewegen sich die Kosten pro Leistung (im Fall für die TTS) im Cent-Bereich.
b) Danach in der Management Console Anlage eines IAM-Benutzer nur für den Polly Dienst. Man bekommt damit einen Benutzernamen, einen Accesskey und einen Secretkey. Diese Daten braucht man dann in NodeRed.
c) In NodeRed Einrichten des sonospollytts node mit Eingabe der Amazon Daten sowie der IP des Sonos-Lautsprechers. Zusätzlich kann man 4 verschiedene deutsche Stimmen auswählen.
d) In homee Anlage von Webhooks mit verschiedenen Text-Nachrichten.

Beispielflow:

[{"id":"9174ad5f.70b808","type":"sonospollytts","z":"2cc975df.7f8f7a","name":"","voice":"48","ssml":false,"dir":"/tmp","sonosipaddress":"192.168.1.113","sonosvolume":"70","sonoshailing":"0","noderedipaddress":"192.168.1.144","noderedport":"1880","config":"81d413f5.ee44e8","x":710,"y":4380,"wires":[[]]},{"id":"b69afde7.4c49a","type":"inject","z":"2cc975df.7f8f7a","name":"","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":350,"y":4440,"wires":[["5712b39d.5abc8c"]]},{"id":"5712b39d.5abc8c","type":"function","z":"2cc975df.7f8f7a","name":"Sample function 1","func":"// The simplest way\nmsg.payload=\"Benvenuti,Wilkommen,Wellcome!\";\nreturn msg;\n","outputs":1,"noerr":0,"x":510,"y":4440,"wires":[["9174ad5f.70b808"]]},{"id":"7834e660.481d18","type":"inject","z":"2cc975df.7f8f7a","name":"","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":350,"y":4480,"wires":[["ba7914e8.37fd28"]]},{"id":"ba7914e8.37fd28","type":"function","z":"2cc975df.7f8f7a","name":"Sample function 2","func":"// Set the Volume\nmsg.volume=\"60\"; // If not set, will take the volume from setting page\nmsg.payload=\"Benvenuti,Wilkommen,Wellcome!\";\nreturn msg;\n\n","outputs":1,"noerr":0,"x":510,"y":4480,"wires":[["9174ad5f.70b808"]]},{"id":"9b1f0f5f.9576f8","type":"inject","z":"2cc975df.7f8f7a","name":"","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":350,"y":4520,"wires":[["4af84cb2.270eac"]]},{"id":"4af84cb2.270eac","type":"function","z":"2cc975df.7f8f7a","name":"Sample function 3","func":"// Create an array of messages\nvar aMessages=[];\n// Add random messages\naMessages.push({volume:\"50\",payload:\"Benvenuti.\"});\n// Wheater in Italy\naMessages.push({volume:\"40\",payload:\"http://media.ilmeteo.it/audio/2018-03-31.mp3\"});\n// Add random messages\naMessages.push({volume:\"30\",payload:\"Cambia la tua voce nei settaggi.\"});\nreturn [aMessages];\n","outputs":1,"noerr":0,"x":510,"y":4520,"wires":[["9174ad5f.70b808"]]},{"id":"cba2165.c9f6168","type":"inject","z":"2cc975df.7f8f7a","name":"Guten Morgen!","topic":"","payload":"Guten Morgen!","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":380,"y":4400,"wires":[["9174ad5f.70b808"]]},{"id":"18aad97d.030f37","type":"comment","z":"2cc975df.7f8f7a","name":"PUSH THE BUTTONS!","info":"","x":380,"y":4360,"wires":[]},{"id":"1ae219a4.028f26","type":"change","z":"2cc975df.7f8f7a","name":"msg-change","rules":[{"t":"move","p":"payload.On","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":570,"y":4320,"wires":[["9174ad5f.70b808","fecad966.407f9"]]},{"id":"c12d5a2c.2f96","type":"http in","z":"2cc975df.7f8f7a","name":"Webhook von homee","url":"/tts","method":"post","upload":false,"swaggerDoc":"","x":380,"y":4320,"wires":[["1ae219a4.028f26"]]},{"id":"fecad966.407f9","type":"debug","z":"2cc975df.7f8f7a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":710,"y":4260,"wires":[]},{"id":"81d413f5.ee44e8","type":"sonospollytts-config","z":"","name":"PollyAWS"}]

Fragen, Anregungen, Hinweise:
Sind gerne willkommen! :wink:

Viel Spaß beim Selbermachen!

VG
Michael

8 Like

Auch dieses Projekt ist wieder super erklärt und sehr interessant :+1:t2:
Eine Frage stellt sich mir dennoch: kann man einzelne Sonos gezielt absprechen?
Du schickst den Webhook ja an die tts Schnittstelle. Oder habe ich etwas falsch verstanden?

1 Like

Ja, jeder Sonos kann per IP separat angesprochen werden… D.h. für jeden Sonos Speaker konfiguriert man einen sonospollytts node und verknüpft dann entsprechend die Webhooks, die dort landen sollen in NodeRed…

Schön ist auch die Möglichkeit die Lautstärke zu konfigurieren und festlegen, ob ein Ankündigungssound vorher erklingen soll.

Die Aussprache ist übrigens super. :+1:t2:

1 Like

umgesetzt :slight_smile: super. Das hatte ich mir schon seit 2 Jahren gewünscht. Nun muss meine Frau ganz viel ertragen :slight_smile:

1 Like

Hi
wenn ich die Sample funktion teste geht es, wenn ich den Webhook über ein Homeegramm teste
kommt im Log folgende Meldung:

“Playsonos RED.httpAdmin file not found: undefined”

Hat jmd eine Idee, was das bedeutet?

Hey :wave:

Habe heute was anderes umgesetzt und das hat nicht viel mit homee zu tun aber mit der Sprachausgabe auf Sonos.

Da ich mich gerade viel mit Telegram beschäftige habe ich auch die Sprachausgabe auf Sonos damit gemacht.
Ich spreche einfach eine Nachricht im Telegram Chat und diese wird dann an den pi gesendet und von dort dann auf der Sonosbox als Audio ausgegeben.

Bei Interesse stelle ich das gerne mal zusammen.
VG
Micha

1 Like

Interesse wenn es auch mit Bose geht :see_no_evil:

Ich habe ne Anlage von Teufel. Da geht das leider gar nicht.

Danke, seit heute auch Sonos im Haus, und direkt umgesetzt.

:beers:

cheers,
spoocs

1 Like

Heho,

So, leider erst jetzt richtig mal einem richtigen Test unterzogen.
Aufgrund des Verhaltens des „Play“-Buttons stehen aber der Praxistauglichkeit stehen noch ein paar Kleinigkeiten im Weg.

1.) wenn Radio-Stream läuft und der SonosPollyTTS schickt was, dann wird das ge-queued, also hintenangestellt und nicht abgespielt. Wenn man später das Radio ausmacht, dann wird in dem Moment der Polly Schnipsel dann (verspätet) abgespielt.

2.) Bei uns wird im Moment nahezu nur Radio gehört, und das per Touch Button oben eben gestartet und gestoppt. Der Play-Touch-Button spielt ja aber nur die letzte Quelle noch mal ab. Man will also das Radio anmachen und hört dann aber z.B. „Der Trockner ist fertig“, Was ja wenig hilft :wink:

Gibts dafür einen Workaround, oder wie handhabt ihr das? Klar, mit Griff zum Handy ist das Radio wieder gestartet, aber a) falls sich dieser Griff vemeiden liesse würd ichs gern tun, und b) ist das abspielen der jeweils letzten homee Meldung ja doch etwas irritierend.

cheers,
spoocs

Hallo spoocs,

eine technische Lösung kann ich dir leider nicht anbieten.

Aber von der Logik her müsste der flow doch einfach das laufende Programm am entsprechenden Lautsprecher stoppen, erst dann die Nachricht abspielen und dann wieder das alte Programm starten.
Grundsätzlich ist das ja sicher möglich. du musst nur einfach einen Schritt vor dem Abspielen einbauen und dann nachher auch wieder einen.

Frag mich aber bitte nicht, wie das funktioniert :wink:
Ich bin noch absoluter nod red Anfänger…
Die Sonos Integration ist aber bei mir das nächste was ich angehen möchte, daher klinke ich mich einfach mal ein.

Bist du evtl. so nett und schickst mir mal deinen flow zu? Dann hätte ich schon mal einen Anfang.

Vielen Dank und ein schönes Wochenende vorab!

Tobias

Hi,

Ein erster Anfang ist eigentlich ja genau oben beschrieben, Inklusive einem Beispielflow…? :wink:

cheers,
spoocs

Alles klar.
Ich sehe es mir Morgen mal genauer an.
Danke.

Hast du denn eine Lösung für dein „Abspiel-Problem“ gefunden?

Hallo zusammen,

ich habe mal noch eine Frage zur Umsetzung.

Soweit funktionieren die Trockenübungen ohne homee super.
@spoocs auch dein Problem mit der queue kann ich nicht nachvollziehen. Ich habe allerdings den node-red-contrib-sonospollytts node durch den tts-ultimative node (wie in node red vorgeschlagen) geändert. Da scheint es ja kürzlich ein Update gegeben zu haben. Evtl. hilft dir das weiter?
Damit spielt er entsprechende Meldungen während einem laufenden Stream (in meinem Fall Radio) ab und läßt den stream anschließend weiterlaufen.

Ich habe allerdings noch ein Problem mit dem webhook. Evtl. kann mir da einer einen Tipp geben.
1
Welchen port gebe ich im webhook an? den von node red oder den vom tts-ultimate? Aktuell habe ich aber bei keinem eine entsprechende Ausgabe, daher muss der Fehler noch woanders sein. Laut Beispiel von @medicus07 ist es ja der port von node red.

2
In welchem Format gebe ich das in homee ein?
Ich habe es wie oben gezeigt versucht, aber das klappt noch nicht.

Bei mir sieht mein Test-flow aktuell so aus

Danke für ein paar Tipps!

Ok, das Thema mit dem webhook habe ich lösen können.
Zum einen war es ein Problem mit der homee web app, die das hg gar nicht abgespielt hat und zum anderen war es ein schlichter Schreibfehler im webhook…

Ich habe
"{ „0n“ : „Die Waschmaschine ist fertig“ } gesendet
und nicht
{ „On“ : „Die Waschmaschine ist fertig“ }
:see_no_evil:

Aber gut, Problem gelöst.

Kann ich den per webhook auch steuern, auf welchem Lautsprecher die Ansage ausgegeben wird?
Ich möchte bestimmte Meldungen nur auf bestimmten Lautsprechern ausgeben. Über den node wäre es ja immer die gleiche Einstellung für alle Ansagen.

Danke

@Shadow31 Hallo Shadow31, vor dem gleichen Problem stehe ich jetzt auch, der Webhook funktioniert nicht. Welche URL muss denn im Webhook angegeben werden ?

Und was muss eigentlich im „http in node“ in node red für eine URL angegeben werden ?

Hallo Christian,

Der webhook sieht bei mit wie folgt aus:


Du gibst also die IP von node red inklusive dem port von node red und /tts ein.
Methode ist Post
Content Type application/json
Und im Body z.b.
{ „On“ : „Der Trockner ist fertig“ }

http in node ist wie folgt:

image

Ich hatte wie oben erwähnt auch das Problem, das mein hg gar nicht abgespielt wurde. Ich hab immer nach dem Fehler in node red oder dem webhook an sich gesucht.
Ist mir erst aufgefallen, als ich im hg gesehen habe, das das zum letzten mal 2 stunden vorher abgespielt wurde. Hab das hg dann einfach gelöscht und nochmal erstellt und dann gings.
War bei mir aber die web app.

hoffe das hilft dir weiter.

vg

@Shadow31 Ich danke dir vielmals, es funktioniert :slight_smile:

Nur noch mal der Verständlichkeit für Anfänger halber:
das „/tts“ ist natürlich ein frei wählbarer Name bzw. URL-Bestandteil (sollte URL-syntaxkonfom sein). Er muss nur auf beiden Seiten gleich sein - im http-Node und im HG-webhook.

cheers,
spoocs

Hallo @spoocs,

kann man Meldungen auch nur auf bestimmten Sonos ausgeben?
Also abhängig der Meldung, sollen unterschiedliche sonos angesprochen werden.

Der Webhook sagt ja aktuell einfach nur „Spiele das ab“ und im flow sage ich, wo er was abspielen soll. Wäre ja super, wenn ich das über den Webhook definieren könnte.

Besten Dank und VG