Text to Speech ist eine feine Sache. 2017 habe ich bereits voicerss in mein smarthome eingebunden und genutzt. Aktuell bin aber fast vollständig auf die Nutzung des Echo Control Bindings und der TTS-Sprachausgabe auf meinen Echo Dots umgestiegen. Warum? Wenn man Musik hört, dann schaltet „Alexa“ gleich die Musik leiser und liest den Text gut vor. Zudem hört sich die Stimme einfach besser an. Und ein Rückgriff auf das reine TTS-Binding von openHAB passt insofern nicht, weil ich die Sprachausgabe teils auch über einen externen Lautsprecher, der nicht direkt am openHAB-Server hängt, vornehmen möchte… Zudem möchte ich noch mehrere Echo Dots gleichzeitig ansteuern, da ich im Haus an verschiedenen Stellen welche im Einsatz habe und diese möchte ich nicht in jeder Rule einzeln ansteuern müssen.
Aber um nicht beim Wechsel der Technologie in zig Rule-Files Änderungen vornehmen zu müssen muss eine einfache Lösung her, wir TSS angesteuert werden kann.
Die Lösung ist eine recht simple: Ich habe ein allgemeines, „generisches“ TTS-Item angelegt. Es ist einfach nur eine Zeichenkette, und wenn ich dann die Zeichenkette ändere in irgendeiner Rule, dann wird diese Änderung konkret mit einer bestimmten Technologie (im unten aufgeführten Beispiel mit Alexa / Echo Control Binding ausgeführt.
Um dann auch die Lautstärke der TTS-Ausgabe steuern zu können habe ich ein zweites Item angelegt.
Items-File:
// Generische Items String GENERIC_TTS_TEXT "TTS [%s]" Number GENERIC_TTS_VOLUME "TTS Volume [%d]" Group gruppeTTSText Group gruppeTTSVolume
Rules-File:
Hinweis hier bei Rückgriff auf Alexa TTS: Alle TTS-Items (Alexa) sind der Gruppe „gruppeTTS“ zugeordnet. Alle TTS_Volume-Items der Gruppe „gruppeTTSVolume“.
rule "Generisches TTS Text" when Item GENERIC_TTS_TEXT changed then if (GENERIC_TTS_TEXT.state.toString() != "") { gruppeTTSText.members.forEach([i| i.sendCommand(GENERIC_TTS_TEXT.state.toString()) ]) GENERIC_TTS_TEXT.postUpdate("") } end rule "Generisches TTS Lautstärke" when Item GENERIC_TTS_VOLUME changed then gruppeTTSVolume.members.forEach([i| if (i.state != GENERIC_TTS_VOLUME.state) { i.sendCommand(GENERIC_TTS_VOLUME.state) } ]) end
Das Ganze lässt sich wie 2017 bereits gepostet auch einfach in dieser Rule durch eine beliebige andre Technologie ersetzen.
In allen andren Rules ist dann nur noch ein <item>.postUpdate(„Diesen Text vorlesen“) anzuwenden und vorher falls nötig die Lautstärke setzen:
(...) GENERIC_TTS_VOLUME.postUpdate(75) GENERIC_TTS_TEXT.postUpdate("Dies ist ein Test") (...)