Sonos-Durchsagen

Hallo zusammen,
gibt es für IPS/Raspberry bereits eine Möglichkeit, Durchsagen (mit TTS) über Sonos zu machen? Ich hatte eigentlich an diese Lösung gedacht. Sie setzt aber die Funktion „TTS_GenerateFile“ voraus, die unter Linux wohl noch nicht zur Verfügung steht. Da ich neben den Durchsagen keine anderen Sonos-Funktionen benötige, sollte die Umsetzung möglichst schlank sein.

Gruß
Peter

Moin,

wie hast du denn deine Sonos Schnittstelle bisher umgesetzt? Soweit ich weiß benutzt das IPSSonos Skript google zur Sprachumwandlung: IPSSonos – IP-Symcon

Ansonsten wirst du dich noch etwas auf Text to Speech für die Linuxversion gedulden müssen.

Bisher hatte ich es noch gar nicht verwendet (nur vor Zeiten mal unter FHEM). Ich bin erst mit der Linux-Beta zu IPS gekommen.

Gruß
Peter

Hi Peter!

Wie gucky schon sagte, würde ich dir ebenfalls zu IPSSonos raten. Damit kann man mit „TTS_Simple“ die Text2Speech „Funktion“ von Google verwenden, zur Sprachausgabe über Sonos. Hab ich auch einige Zeit gemacht und hat wirklich gut funktioniert.

IPSSonos – IP-Symcon

Grüße,
Chris

Hallo Chris und gucky,
IPSSonos hatte ich mir auch schon kurz angeschaut, war dann aber etwas zurückgeschreckt, weil dafür ja die IPSLibrary installiert sein muss. Und nur für Durchsagen erschien mir das Gesamtpaket aus IPSLibrary und IPSSonos doch sehr groß.
Läuft beides auch auf dem Raspberry schon gut?

Gruß
Peter

Brownson hat erst gestern irgendwo geschrieben, dass die IPSLibrary aufm Raspi mittlerweile (bis auf ein paar Ausnahmen) laufen soll.

Aber du kannst dir auch einfach nur die entsprechenden Funktionen/Abschnitte aus IPSSonos selbst suchen, welche für die Google-Speech-Geschichte notwendig sind, und dir eine eigene Funktion bauen. Ist vermutlich für dich der schnellere und einfachere Weg…bissi Text kopieren ist ja nicht so schwer :wink: :slight_smile:

Grüße,
Chris

Ich habe gestern mal spaßeshalber versucht, die IPSLibrary zu installieren. Der Baseloader lief auch komplett durch. Es traten dann aber Fehlermeldungen im Zusammenhang mit HTTP_HOST auf (dies liegt laut paresy wohl daran, dass die IPS-beta bisher nur http-get unterstützt Link). Es gibt zwar einen Workaround von Brownson, um trotzdem Module installeren zu können, aber davon habe ich dann erstmal abgesehen. Kurzum, ich habe die Library erstmal wieder deinstalliert. Entweder warte ich jetzt erstmal ab oder ich versuche (temporär) mit PHPSonos weiterzukommen.

Gruß
Peter

Hab grad noch was passendes für dich gefunden :slight_smile:

Wenn du das hier >> Einfache TTS PHP-Class über Google Translate (im Thread sind noch ein paar Änderungen zu lesen, die ebenfalls eingebaut werden müssen…vermute ich mal…)
…damit kombinierst >> IPSSonos - Seite 14

…dann hast du klein und kompakt was du gesucht hast :cool:

Grüße,
Chris

Ich generiere das File auf dem IPS-Windows-Server und übertrage die URL des Files per RPC an die Himbeere und lasse es dann abspielen. Allerdings nutze ich auf der RPI nicht Sonos sonder arbeite über MPD/MPC.
Bei Interesse kann ich auch einige Script-Snippets zur Verfügung stellen. Das gesamte Projekt (generalisierte Entwicklung von plattformunabhängigen Remoten Mediaplayer-Klassen ist leider noch nicht so gut dokumentiert, um es hier zu veröffentlichen.

Vielleicht hilft Dir der Tip aber auch schon weiter.

Gruß BONOX

Hallo Chris,
vielen Dank für den Tipp. Ich habe schon mal angefangen, die Skripte einzubinden. Das mp3-File wird schon erzeugt, es gibt aber noch Fehler bei der Ansteuerung von Sonos. Ich werde mir das am Wochenende weiter anschauen.

@Bonox: danke für die Infos. Bei Bedarf komme ich drauf zurück.

Gruß
Peter

Hi,

da hast Du mich auf eine Idee gebarcht…
Geht aber wunderbar:


require "tts.php";
include("PHPSonos.inc.php");
$sonos = new PHPSonos("sonos-kueche-l.fritz.box");

$text = "Draußen sind es" . GetValuefloat(23851 /*[Aussen\Garten\T: Außen\Temperature T]*/  ) . "Grad";
$tts = new TextToSpeech($text);
$tts->saveToFile("/data/sonos/temperatur.mp3");

$sonos->ClearQueue(); //Playlist löschen
$sonos->AddToQueue("x-file-cifs://ipsymcon.fritz.box/sonos/temperatur.mp3"); //Datei hinzufügen
$sonos->SetQueue("x-rincon-queue:RINCON_000E58C3863C01400#0"); //Playlist auswählen (Nötig, wenn Radio vorher ausgewählt war)
$sonos->Play();

IPS_Sleep(5000);

$sonos->SetRadio("x-rincon-mp3radio://swr-mp3-m-swr3.akacast.akamaistream.net/7/720/137136/v1/gnl.akacast.akamaistream.net/swr-mp3-m-swr3","SWR3 Elchradio");
$sonos->Play();

PHPSonos.inc.php sollte da sein, und tts.php sieht so aus:


 <?php
// FileName: tts.php
/*
 *  A PHP Class that converts Text into Speech using Google's Text to Speech API
 *
 * Author:
 * Abu Ashraf Masnun
 * http://masnun.com
 *
 */

class TextToSpeech {
    public $mp3data;
    function __construct($text="") {
        $text = trim($text);
        if(!empty($text)) {
            $text = urlencode($text);
            $this->mp3data = file_get_contents("http://translate.google.de/translate_tts?ie=UTF-8&tl=de&q={$text}");
        }
    }

    function setText($text) {
        $text = trim($text);
        if(!empty($text)) {
            $text = urlencode($text);
            $this->mp3data = file_get_contents("http://translate.google.de/translate_tts?ie=UTF-8&tl=de&q={$text}");
            return $mp3data;
        } else { return false; }
    }

    function saveToFile($filename) {
        $filename = trim($filename);
        if(!empty($filename)) {
            return file_put_contents($filename,$this->mp3data);
        } else { return false; }
    }

}
?>

/data/sonos/temperatur.mp3 ist ein Verzeichnis auf dem BananaPI, dass als /sonos per Samba freigegeben ist.

Genial!
In 10 Minuten so etwas praktisches gebaut… :slight_smile:

Gruß,
Thorsten

Ich benutze ein ähnliches Skript, habe aber noch ein Caching eingebaut damit die Datei nicht jedes mal von Google geladen werden muss. Häufig sind es ja doch immer die gleichen Ausgaben die man haben will.


define("CACHEPATH", "c:\ip-symcon\webfront\user\	ts-cache\\");
define("URLPATH", "http://ips:82/user/tts-cache/");

function speak($q, $emergency = false) {
	if ($q) {
		$q = substr($q,0,100); // Translate nimmt max. 100 Zeichen entgegen
		$umlaute = array("ä", "ö", "ü","Ä","Ö","Ü","ß"); // Und kommt mit Umlauten nicht klar
		$doppelbuchstaben = array("ae", "oe", "ue","AE","OE","UE","ss");
		$q = str_replace ($umlaute,$doppelbuchstaben,$q);

		$hash    = md5($q);
		$file    = CACHEPATH.$hash.".mp3";
		$weburl  = URLPATH.$hash.".mp3";

		if (file_exists($file)) {
			echo("File '".$file."' existiert und wird aus Cache wiedergegeben.");
		} else {
			$url = "http://translate.google.com/translate_tts?q=" . urlencode($q) . "&tl=de";
			$mp3 = @file_get_contents($url);
			if ($mp3 === FALSE) {
				// Download fehlgeschlagen
				$weburl = URLPATH."e48d80e84eef496a38bb6f10c09c4e89.mp3"; // Gespeicherte Datei "Download fehlgeschlagen"
			} else {
				// Download erfolgreich
				file_put_contents($file, $mp3);
				//echo("File unter ".$file." gespeichert.");
			}
		}
		
	   return $url;

	}
}

Sehr schön - so ähnlich habe ich das heute auch gemacht … hat allerdings deutlich länger gedauert als 10 min :wink:

ergänzend: die MAC-Adresse kann man auch im Skript ermitteln:


// ID des Players ermitteln:
$url = "http://".$Player_IP.":1400/status/zp";
$xml = simpleXML_load_file($url);
$player_id = $xml->ZPInfo->LocalUID;

$sonos->SetQueue("x-rincon-queue:".$player_id."#0");
$sonos->Play();

Die beim Google TTS vorhandene Begrenzung der Textlänge kann man mit diesem Workaround, Beitrag #132, umgehen.

Gruß
Peter