AllgemeinFibaro TutorialsTutorials

Mit Fibaro und dem Bose Soundtouch System Text to Speech-Funktionen umsetzen

Wir zeigen Dir beispielhaft mit dem Fibaro Home Center, wie Du Text to Speech-Sprachausgaben über Deine Bose Lautsprecher ausgeben kannst. Dafür haben wir zwei Szenen für Dich erstellt.

Wir zeigen Dir in diesem Beitrag, wie Du Dein Bose Soundtouch System an Dein Smart Home anlernst. Dafür nutzen wir beispielhaft das Fibaro Home Center. Das Prinzip ist aber auch mit anderen Smart Home Systemen zu vergleichen und kann entsprechend umgesetzt werden. Erfahre hier, wie Du zum Beispiel spezifische Musik Files abspielst oder auch Text to Speech in Deinem Smart Home umsetzen kannst.
Für die Steuerung Deines Bose Systems haben wir ein PHP Skript geschrieben. Mit diesem kannst Du zum Beispiel die Preset-Tasten drücken, ausgewählte Titel abspielen oder auch Text to Speech umsetzen. Das bedeutet, dass Du einen beliebigen Text angeben kannst, welcher über die Bose Boxen ausgegeben wird. Dabei ist zum Beispiel eine Statusmeldung möglich, sobald die Waschmaschine fertig ist oder auch das Ansagen des aktuellen Wetterberichts. Hier sind viele verschiedene Szenarien möglich.

Notwendige Geräte & Ausstattung

Wie bereits erwähnt, nutzen wir das Fibaro Home Center, um Dir alle notwendigen Schritte zeigen zu können. Da es sich hierbei aber um eine http-API handelt, sollte es auch mit anderen Smart Home Zentralen möglich sein, einen http-Request durchzuführen. Darauf gehen wir später aber noch genauer ein. Entsprechend kannst Du auch mit einer anderen Zentrale unsere Anleitung umsetzen und die Tipps nutzen, da die API unabhängig von Fibaro funktioniert.

Neben der Fibaro Zentrale nutzen wir für diese Anleitung außerdem einen Bose Soundtouch Lautsprecher. Gleichzeitig benötigt man einen Medienserver sowie einen Webserver, die über ein System laufen. Ansonsten kann unser Text to Speech-Skript nicht umgesetzt werden. Wir nutzen als Netzwerkspeicher den Synology NAS. Auf diesem haben wir den Medienserver und PHP installiert.

Tipp

Solltest Du keinen Synology Nas oder Webserver besitzen, kann Dir unser Tutorial Installation eines Raspberry Pi mit einem Webserver inkl. PHP sicher weiterhelfen.

Die Konfiguration

Für den weiteren Verlauf benötigst Du zunächst das bose_soundtouch_skript, welches Du herunterlädst. In diesem findest Du drei Dateien vor. Die Text to Speech-Datei erstellt mit dem Dienst Voice RSS aus einem Text eine MP3 Datei. In einer zweiten Datei befinden sich die Funktionen sowie in der dritten die Steuerung.

Downloade hier das Bose-Skript!

Sobald Du mit Deinem Webserver verbunden bist, muss das entsprechende Verzeichnis geöffnet werden. Bei uns öffnen wir dafür das Verzeichnis “web”. In diesem haben wir den Ordner “webservice” angelegt. Dort kopieren wir anschließend das Skript zum Bose Soundtouch System hinein. Hier ist vor allem die Datei “play_file” wichtig, denn in dieser befindet sich die Konfiguration.

Zunächst wollen wir den ersten Abschnitt in der “play-file”-Datei konfigurieren. Dafür benötigt man die DLNA-Server-ID. Diesen Server kannst Du mit Deinem Bose System verbinden. Das System vergibt danach eine eindeutige ID. Dafür kannst Du im Browser einfach folgendes eingeben:

http://<IP SoundTouch>:8090/sources

Die IP für Deinen Bose Lautsprecher kannst Du beispielsweise über Deine Fritz!Box herausfinden.
Nach der Eingabe werden Dir die verschiedenen Sources im Browser angezeigt. Unter “sourceAccount” wird Dir die notwendige Account-ID angezeigt, welche das Bose System nun zur Verfügung stellt. Kopiere diese ID und füge sie im “play_file” an der entsprechenden Stelle zur DLNA-Server-ID ein.

$text_to_speech_pfad_file = '';

Du musst jetzt eine neue Datei auf deinem Medienserver anlegen. Am besten legst Du dafür auf Deinem Medienserver einen neuen Ordner an, z.B. /text_to_speach/. Dort fügst Du eine Datei, beispielsweise mit dem Namen “text_to_speech.mp3”, ein. In die play_file.php musst Du dann den absoluten Pfad zur Datei eintragen, zum Beispiel “/volume1/music/meinemusik/text_to_speech/text_to_speech.mp3”. Der Inhalt der MP3 Datei ist egal. Wir überschreiben diese Datei immer wieder mit dem, was Du gesprochen haben möchtest.

Tipp

Jegliche Dateien müssen, wie bereits erwähnt, immer auf dem selben Server liegen. Für die einzelnen Dateien haben wir immer verschiedene Ordner angelegt. Sozusagen gibt es für jedes File einen eigenen Ordner, damit man diese jeweils explizit ansprechen kann. Im Bose System kann man nämlich nicht nach bestimmten Titeln suchen, sodass diese Strukturierung die Handhabung deutlich erleichtert.

Für den nächsten Schritt benötigst Du die “text-to-speech-file-id”. Dafür musst Du wieder die IP-Adresse von Deinem Lautsprecher im Browser mit folgender Ergänzung einfügen:

http://<IP SoundTouch>:8090/now_playing

Anschließend wird Dir im Browser noch keine ID angezeigt. Um dies zu ermöglichen, öffne zunächst die Bose Soundtouch App auf Deinem Android oder iOS Smartphone. Rufe in der App den Netzwerkspeicher auf und suche dort in den Ordnern nach der “text-to-speech-Datei”. Starte diese dann. Sobald die Datei abgespielt wird, wirst Du in Deinem Browser auch eine ID unter “location” angezeigt bekommen.

Kopiere diese ID nun in den enstprechenden Code:

$text_to_speach_file_id   = '';

Als nächstes wollen wir die Schnelligkeit für die gesprochenen Texte festlegen. Hierbei entspricht “0” dem Standard, “-10” der langsamsten Sprechgeschwindigkeit und entsprechend “10” der schnellsten. Dabei kannst Du individuell die Geschwindigkeit festlegen:

$text_to_speach_speed = '0';

Sprachdateierstellung mit Voice RSS

Um die Sprachdateien erstellen zu können, benötigen wir einen Anbieter. Wir nutzen dafür den Anbieter Voice RSS. Dieser ist bis zu 350 Requests pro Tag kostenlos, was entsprechend für unser Vorhaben ausreicht. Logge Dich dafür zunächst auf der Seite von Voice RSS ein. Nach erfolgreicher Anmeldung wird Dir ein API Key zugeteilt. Diesen kannst Du nun kopieren und in folgenden Code einfügen:

$voice_rss_api_key    = '';

Mit diesem Schritt ist die Konfiguration abgeschlossen.

Wie funktioniert die API?

Bevor wir mit der Anleitung fortfahren, wollen wir Dir zunächst zeigen, wie die API genau funktioniert. Hierfür gibt es verschiedene Möglichkeiten.

Die erste, klassische Möglichkeit ist die Text to Speech-Funktion. Diese kann wie folgt aussehen:

http://192.168.178.39/webservice/bose_soundtouch/play_file.php?device=192.168.178.30&action=texttospeech&value=Dieser%20Text%20soll%20ausgegeben%20werden

Zunächst gibst Du Deine IP-Adresse vom Webserver ein mit der entsprechenden Ordnerstruktur. Anschließend die IP-Adresse vom Bose Lautsprecher. Danach legst Du die Aktion fest. Hierbei gibt es verschiedene zur Auswahl. Der “value-Wert” umfasst den Text, der gesprochen werden soll. Auch die Lautstärke kannst Du über den “vol-Wert” angeben. Am Ende kannst Du die URL in Deinen Browser einfügen. Nachdem die Datei erstellt wurde, wird die Sprachausgabe über den Bose Soundtouch Lautsprecher stattfinden.

Eine zweite Möglichkeit für die API ist das Starten bzw. Abspielen einer Datei. Möchtest Du beispielsweise eine Soundausgabe für Deine Alarmanlage einrichten, kannst Du die ID Deiner “alarm.mp3” wieder bei “value” eintragen und hast entsprechend die URL für diese Sprachausgabe:

http://<ip zum webserver>/webservice/bose_soundtouch/play_file.php?device=<ip-bose-soundtouch-box>&action=start_file&value=22$247&vol=20

Tipp

Eine ID ändert sich nicht, solange die Datei nicht umbenannt oder verschoben wird.

Als dritte Möglichkeit kann man die Buttons ansprechen, welche sich auf dem Bose Soundtouch Lautsprecher befinden. Dafür benötigst Du folgende URL:

http://192.168.178.39/webservice/bose_soundtouch/play_file.php?device=192.168.178.30&action=button&value=preset_2&vol=20

Hier gibt es zudem verschiedene Preset-Tasten. Bei “value” gibst Du also entsprechend die Preset-Taste ein, die abgespielt werden soll. Hierfür stehen Dir folgende Parameter zur Verfügung:

  • preset_1
  • preset_2
  • preset_3
  • preset_4
  • preset_5
  • preset_6
  • play
  • stop

Fibaro Home Center – Szenen hinzufügen

Nun ist es möglich, den HTTP-Request in eine LUA-Szene zu kopieren. Wir bündeln jedoch gerne mehrere Möglichkeiten. In diesem Fall haben wir zwei Szenen erstellt. Zum einen eine Szene für die Soundverwaltung sowie eine für den Wechsel der Variablen.

Zunächst klicken wir in unserem Home Center im Browser auf den Menüpunkt “Steuerungen”, danach auf “Variablensteuerungen”. Hier müssen wir nun zwei Variablen hinzufügen: die “bose_sound” und die “text_to_speech_txt” Variable. Dafür einfach die jeweilige Variable anklicken und auf “Hinzufügen” klicken. Der Wert kann zunächst bei 0 bleiben.

Anschließend den Menüpunkt “Szenen” öffnen. Hier musst Du Dir zunächst eine Szene für die Soundverwaltung anlegen. Diese kannst Du nachfolgend einfach kopieren und in Deine Vorlage einfügen:

--[[
%% properties
%% events
%% globals
bose_sound
--]]
 
 
fibaro:debug('Szene wurde gestartet');
 
if (tonumber(fibaro:getGlobalValue('bose_sound')) == 1) then
  fibaro:debug('File Voralarm abspielen');
  local httpClient = net.HTTPClient();
  httpClient:request('http://192.168.178.39/webservice/bose_soundtouch/play_file.php?device=192.168.178.30&action=start_file&value=22$247&vol=20', {});
end
 
 
if (tonumber(fibaro:getGlobalValue('bose_sound')) == 2) then
  fibaro:debug('lautstaerke erhoehen');
  local httpClient = net.HTTPClient();
  httpClient:request('http://192.168.178.39/webservice/bose_soundtouch/play_file.php?device=192.168.178.30&action=start_file&value=22$247&vol=30', {});
end
 
 
if (tonumber(fibaro:getGlobalValue('bose_sound')) == 3) then
  fibaro:debug('Alarm Sound!');
  local httpClient = net.HTTPClient();
  httpClient:request('http://192.168.178.39/webservice/bose_soundtouch/play_file.php?device=192.168.178.30&action=start_file&value=22$248&vol=50', {});
end
 
if (tonumber(fibaro:getGlobalValue('bose_sound')) == 5) then
  fibaro:debug('Alarm Sound!');
  local httpClient = net.HTTPClient();
  httpClient:request('http://192.168.178.39/webservice/bose_soundtouch/play_file.php?device=192.168.178.30&action=button&value=preset_1&vol=50', {});
end
 
 
 
if (tonumber(fibaro:getGlobalValue('bose_sound')) == 4) then
 
  local function url_encode(str)
    if (str) then
      str = string.gsub (str, "\n", "\r\n")
      str = string.gsub (str, "([^%w %-%_%.%~])",
      function (c) return string.format ("%%%02X", string.byte(c)) end)
        str = string.gsub (str, " ", "+")
      end
      return str
    end
 
 
 
    local httpClient = net.HTTPClient();
    httpClient:request('http://192.168.178.39/webservice/bose_soundtouch/play_file.php?device=192.168.178.30&action=texttospeech&value='..url_encode(fibaro:getGlobalValue('text_to_speech_txt'))..'&vol=50', {});

Danach legen wir eine zweite Szene an, mit der wir die erste Szene steuern können. Diese soll sozusagen die Soundverwaltung ansprechen:

--[[
%% properties
%% events
%% globals
--]]
 
 
fibaro:setGlobal('text_to_speech_txt', 'Hier der Text den ihr gesprochen haben wollt!');
fibaro:setGlobal('bose_sound', 4);
fibaro:debug(fibaro:getGlobalValue('text_to_speech_txt'));
fibaro:sleep( 10*1000);
fibaro:setGlobal('bose_sound', 0);

Sind beide Szenen angelegt und gespeichert, kann nun nach Aktivierung der zweiten Szene die erste abgespielt werden. Dies ist auch einfach zu testen, indem man den Wert “4” bei “bose_sound” zum Beispiel auf “1” ändert und die Szene startet. Danach wird der erste Block aus der ersten Szene aktiviert und zum Beispiel der Sound der Alarmanlage abgespielt.

Text to Speech testen

Um die Text to Speech-Funktion in unserer Szene zu testen, ändern wir den Text in der zweiten Szene hinter “text-to-soeech-txt” beispielsweise in “Hier der Text, den Du gesprochen haben willst”. Anschließend müssen wir die Szene noch triggern, indem wir “bose_sound” auf “4” setzen. Damit sprechen wir entsprechend den Block mit der Kennzeichnung “4” aus der ersten Szene an. Danach wird eine Pause eingefügt sowie am Ende der “bose_sound” Wert wieder auf “0” gesetzt, damit das System am Ende wieder auf den Ausgangszustand gesetzt wird. Am Ende natürlich speichern und über “Start” die zweite Szene ausführen.

Die zweite Szene wird danach ebenfalls gestartet und der vorgegebene Text als Sprachausgabe über die Bose Soundtouch Lautsprecher ausgegeben.

Möglicherweise kommt Dir diese Vorgehensweise etwas kompliziert vor. Natürlich kann man den nachfolgenden Teil unserer Szene ebenfalls in eine Szene für beispielsweise die Aktion “Waschmaschine” hinein kopieren.

if (tonumber(fibaro:getGlobalValue('bose_sound')) == 4) then
 
  local function url_encode(str)
    if (str) then
      str = string.gsub (str, "\n", "\r\n")
      str = string.gsub (str, "([^%w %-%_%.%~])",
      function (c) return string.format ("%%%02X", string.byte(c)) end)
        str = string.gsub (str, " ", "+")
      end
      return str
    end
 
 
 
    local httpClient = net.HTTPClient();
    httpClient:request('http://192.168.178.39/webservice/bose_soundtouch/play_file.php?device=192.168.178.30&action=texttospeech&value='..url_encode(fibaro:getGlobalValue('text_to_speech_txt'))..'&vol=50', {});
  end

Unsere Vorgehensweise ist jedoch wesentlich komfortabler, um zukünftige Änderungen wie beispielsweise API Befehle schneller umsetzen zu können. Denn so muss man nur innerhalb unserer Szene Änderungen vornehmen und nicht mehrere Szenen heraussuchen und jeweils verändern. Dieses Verfahren hat sich für uns bisher bewährt, immerhin nutzen wir dieses auch für andere Szenen. Die Szenarien werden dadurch übersichtlicher und deutlicher zu lesen.

Einrichtung abgeschlossen

Nun hast Du gelernt, wie Du über Deine Zentrale das Bose Soundtouch System ansprechen kannst und entsprechend Sprachausgaben erstellen kannst. Dir stehen dabei viele Möglichkeiten zur Verfügung, unterschiedliche Szenarien mit Sprachausgabe zu erstellen: Du kannst zum Beispiel einen Voralarm, wie in diesem Beitrag erklärt, erstellen, genauso auch einen Großalarm. Beispielsweise kannst Du auch eine Soundausgabe erstellen, wenn die Alarmanlage de- oder aktiviert wird.

Wir hoffen, Dir hat diese Anleitung gefallen. Für Fragen stehen wir Dir jederzeit gerne zur Verfügung. Kontaktiere uns einfach über die Kommentarfunktion oder schau auch gerne in unserem Forum vorbei!

Ralf

Im Jahre 2018 habe ich ein Haus gebaut und versuche, nach und nach smarte Produkte ins Haus zu integrieren. Ich freue mich, Euch die Smart Home Welt näherzubringen und gemeinsam mit Euch zu lernen.

Ähnliche Artikel

2 Kommentare

  1. Hallo,
    eine gelungene Anwendung.
    Wie kann man einigermaßen bequem die Id für einzelne mp3 Dateien herausfinden? Wenn ich sie abspiele reicht die Zeit bei kurzen Dateien nicht um im Webbrowser now_playing aufzurufen. Ich mochte nämlich auch dann vorgefertigte Sprachnachrichten ausgeben, wenn das Internet streikt.

    Hast Du da eine Idee? Kann man die Dateien nicht im Klartext starten?

    Michael

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Schaltfläche "Zurück zum Anfang"