bin dabei, mein IPS-System von Windows 10 auf Raspberry Pi 3 B+ zu übertragen.
Das geht bisher ganz gut, ich stehe aber jetzt trotz intensiver Forensuche bei der Soundausgabe an.
Auf Win10 habe ich eine Mediaplayer.Instanz angelegt, welche über das TTS-Modul aufgerufen wird.
Wie funktioniert das auf den Raspi?
(Audioausgang und espeak auf dem Raspi funktioniert)
Mit IPS Boardmitteln geht das nur unter Windows.
Schau dich bei den PHP-Modulen um, da gibt es einige für TTS (alle online/cloud) und auch welche um Mediaplayer auf dem Pi zu steuern.
Michael
Ich erzeuge bei mir eine *.wav Datei, die ich mit dem omxplayer abspiele.
Das wav kann ich dann auch mit einer SMB-Freigabe z.B. auf einer Sonos-Box abspielen.
Geht anders als bei WIN, aber geht
nachtrag: ok, den omxplayer hab ich gefunden … aber wenn Du den von IPS aus anssprechen kanst, dann sollte das mit der Befehlsübergabe an den Raspi ja funktionieren … bin auf Eine Beispiel gespannt
So lassen sich auch „fertige“ Dateien (Hundegebell, Klingelsignale etc.) abspielen.
Bis zum Einzug von Alexa habe ich damit auch Internetradio abgespielt.
Das wav erzeuge ich mit pico2wave, sieht dann so aus:
$path = 'home/pi';
$chmod = 0777;
if (!(is_dir($path) || is_file($path) || is_link($path) )) {
mkdir($path,$chmod);
}
$wav_file = "tts".rand(0,999999).".wav"; //zufälligen Namen erzeugen
$pico_command = 'pico2wave --lang=de-DE --wave=/'.$path.'/'.$wav_file.' "'.$Ansage.'"';
shell_exec($pico_command);
IPS_SLEEP(500); // der Himbeere etwas Zeit zum erzeugen gewähren
shell_exec('omxplayer /'.$path.'/'.$wav_file); // hier wieder das abspielen...
IPS_SLEEP(1500); // abspielen abwarten ...
system('rm /'.$path.'/'.$wav_file); // ... und wav-Datei wieder löschen
Beim pico2wave hatte ich auch etwas Hilfe - fertig sieht das ja ganz einfach aus
Meine Ansage schreibe ich in eine Stringvariable. Wenn sich die ändert, wirkt dieser Schnipsel aktiv.
Die Lautstärke habe ich über einen Integer vom LCN-Ausgang (0-100%, also umrechnen) verstellt:
nö, deine Beispiele sind schon super … werd ich mit abkupfern und eventuell für meine Zwecke modifizieren (y)
danke jedenfalls!
mein „einfacher“ -Eintrag war früher und bezieht sich auf das Anwenden des exec-Befehls, was ich ja verzeifelt gesucht habe … einen wav file generieren und abspielen halte ich von der Qualität her auch für die bessere Lösung, so war auch meine Windows-Anwendung…
gibt es keinen andere Möglichkeit beim omxplayer (mit einem Parameter?) oder beim shell_exec Befehl (mit einer Rückgabevariable) abzuwarten, bis der file fertig abgespielt wurde bzw festzustellen, ob der Player gerade spielt?
Mit einem fixen IPS_Sleep() wert zu arbeiten möchte ich vermeiden.
Ich bin auch kein Linux-Freak …
Dazu habe ich nichts gefunden (das heißt aber nichts) - das pico2wave habe ich ja auch nur gefunden, weil jemand mit Zaunpfählen geworfen hat
danke für Deine Hilfe, mit pico2wave funtioniert das genausogut wie vorher unter Windows.
hab meinen code jetzt so angepasst:
<?
// Durchsage eines übergebenen Textes
function Durchsage($text,$klang) {
$path = "var/lib/symcon/media";
$file = "tts.wav";
$wav = array
(
"Durchsage" => "Dreiklang.wav",
"Meldung" => "dingdong.wav",
"Klingel" => "ringing.wav",
);
//FS20_SwitchMode(46986 /*[Schaltsteckdosen\Verstärker]*/, true); //Gerät einschalten
//IPS_Sleep(1000); // 1000 ms warten
//Erstellt die Audiodatei
$pico_command = 'pico2wave --lang=de-DE --wave=/'.$path.'/'.$file.' "'.$text.'"';
shell_exec($pico_command);
IPS_Sleep(1000); // 1000 ms warten
shell_exec('omxplayer /'.$path.'/'.$wav[$klang]); //Spielt die Klang-Datei ab
IPS_Sleep(1500); // 1500 ms warten
shell_exec('omxplayer /'.$path.'/'.$file); //Spielt die erstellte Audio-Datei ab
//IPS_Sleep(1500); // 1500 ms warten
//FS20_SwitchMode(46986 /*[Schaltsteckdosen\Verstärker]*/, false); //Gerät ausschalten
}
?>
Auf einen random wav-file und das löschen dieses files haben ich verzichtet … es wird immer der selbe wav-file einfach überschrieben.
Das ganze ist als funktion aufgebaut, die ich von überall aufrufen kann und als Parameter den Text und die Art des Ruftones übergebe.
Verstehe ich das richtig?
Du erstellst immer wieder das gleiche wav, was im Grunde schon vorhanden ist?
Ich würde (unnötige) Schreibzugriffe auf die SD beim RasPi immer minimieren - bekanntermaßen sterben die Karten dann schneller. Für Klingel/Sound-Meldungen spiele ich einfach fest gespeicherte Dateien ab. Die kannst du ja auch ins Verzeichnis auf dem PI speichern.
Das pico2wave nutze ich nur wenn ich flexible Werte/Variablen mit ansagen will (welches Fenster ist offen, wie ist die Temperatur etc.).
ich nehm die SD-Karte nur zu booten und gib alles andere auf eine SSD … mit einem SSD-Laufwerk läufts mit Windows schon seit 3 Jahren ohne Problem. So hab ich das wenigsten vor. Weil das Problem hab ich sonst mit dem Archivieren der Messwerte hundertfach ja auch – da gibts auch für jeden zu archivierenden Messert eine Datei, die immer wieder überschrieben wird.
Aber ganz ohne TTS mit fertigen WAV-Durchsagen hab ich auch schon überlegt … zumindest für die Standardmeldungen.
Nur nebenbei: wo ist der Unterschied zwischen immer neue Datei erstellen und löschen oder immer die alte Datei überschreiben für die Lebensdauer der SD-Karte?
Ich bin bislang nie zum testen mit einer HDD/SSD gekommen. Auch mit recht vielen Aufzeichnungen hält die SD bei mir immer mind. 2 Jahre …
Klingt aber alles sinnvoll
Grüße, Uwe
könntest Du mir bei dem Abspielen von mp3 und wav Dateien über eine Sonos-Box behilflich sein?
Derzeit verwende ich einen externen und frei zugänglichen http-Server um Sound-Files über Sonos wiederzugeben. Dabei bekomme ich jedoch hin und wieder einen Soap-Call Error des Sonos.Moduls und würde daher gerne die Dateien lokal speichern und aufrufen.
Zur Verfügung habe ich entweder eine Fritzbox mit USB-Stick oder den RaspberryPi auf dem Symcon läuft.
Welche Freigaben müsste ich einrichten (Samba-Share oder http?) und wie wäre der Aufruf aus Symcon (SNS_PlayFiles…)?
Moin Mark,
ich habe meine alten Test-Skripte wieder gefunden …
Auf dem PI habe/hatte ich eine SMB-Freigabe mit entsprechenden Rechten.
Für die Erstellung von TTS-Ansagen nutze ich auf dem PI pico2wave. Für ein fest gespeichertes File (ein klingeldingdong o.ä.) brauchst du das nicht.
Zum testen hatte ich auch einfach ein paar Computerlautsprecher an den PI angesteckt. Wenn es dort geht, geht auch das SNS klaglos.
Hier mal zum probieren:
$path = 'home/pi';
$chmod = 0777;
# erstellt den Pfad mit Rechten, wenn nicht vorhanden
if (!(is_dir($path) || is_file($path) || is_link($path) )) {
mkdir($path,$chmod);
}
$wav_file = "tts".rand(0,999999).".wav"; // erstellt ein File mit einem zufälligen Namen
$pico_command = 'pico2wave --lang=de-DE --wave=/'.$path.'/'.$wav_file.' "'.$Ansage.'"';
shell_exec($pico_command);
# je nach verwendetem PI der Himbeere ggf. etwas Zeit zum abarbeiten geben
//IPS_SLEEP(1500);
//passthru('omxplayer /'.$path.'/'.$wav_file);
system('omxplayer /'.$path.'/'.$wav_file); // gibt das file am Sound-Ausgang des PI wieder
# spielt die gespeicherte TTS und ein fest gespeichertes File
SNS_PlayFiles($sonosID, Array( "//UWE-SYMCON-PI/pisound/$wav_file"/*,"//UWE-SYMCON-PI/pisound/561-thunderheavyTop.wav"*/), 0);
IPS_SLEEP(500);
//exec ('kill $(pgrep omxplayer)'); // falls sich der omxplayer aufhängt > "abschiessen"
system('rm /'.$path.'/'.$wav_file); // das tts-file wieder löschen, der zufällige Name ist nur in diesem Skript vorhanden
Ich bin mittlerweile beim abspielen solcher Geschichten bei Alexa gelandet und nutze das nicht mehr aktiv - aber in den Zeiten vor Alexa habe ich mit dem omxplayer auch Internetradio gehört.
Vielen Dank Uwe für die schnelle Antwort und Hilfe.
Dann werde ich mich zunächst mal an die SMB-Freigabe machen.
Muss ich da etwas spezielles beachten oder kann ich einfach den Anleitungen im Netz folgen?
Alexa benutze ich auch für TTS. Wie spielst Du über Alexa mp3 oder wav-files ab?
Ich bin seinerzeit auch nur den Anleitungen gefolgt, das war recht problemlos.
Gar nicht mehr
Ich lasse sie einfach plappern - so oft kommt das bei uns nicht vor. Ob es nun ‚ding-dong‘ macht oder ‚Da hat jemand geklingelt‘ angesagt wird …
Außerdem habe ich noch an zentraler Stelle im Haus einen PC zur Visu, auch an dessen WebFront lässt sich ja problemlos ein Sound ausgeben.