Sound-Ausgabe mit dem Raspberry Pi?

Guten Abend

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)

lg
Bauli

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 :wink:

Grüße, Uwe

Das mit dem omxplayer hört sich brauchbar an … wo kreg ich den und hast DU da ein Script Beispiel dafür für den Aufruf?

Gibt es keine Möglichkeit, per IPS Befehle an den Raspi abzuschicken (wie z.B <<espeak „dies-oder-das“>>)?

lg
Bauli

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

lg
Bauli

Ganz einfach …

shell_exec('omxplayer /'.$path.'/'.$wav_file);

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 :wink:

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:

$vol= GetValue(12345 /*[.System\Audio\Lautstärke\zentrale Lautstärke]*/);
$vola= (($vol/100)*255);
echo "Volume:".$vol."% entspricht ".$vola.chr(10);
system("amixer sset 'PCM',0 $vola%");


Grüße, Uwe

ok, hab’s schon gefunden

exec(espeak -vde „morgen kommt die Müllabfuhr“) funtioniert prächtig!

geht auch einfacher als vorher mit TTS und mediaplayer

lg
baui

Dann muss ich mir das wohl in einer ruhigen Minute auch noch mal ansehen :wink:

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…

lg bauli

noch eine Frage als Linux-Neuling:

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.

lg Bauli

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 :smiley:

Grüße, Uwe

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.

lg
bauli

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.).

Grüße, Uwe

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?

so will ich das machen (habs aber nnoch nicht probiert, zuerst soll das System richtig laufen):
https://www.carluccio.de/raspberry-pi-root-filesystem-auf-usb-festplatte/

lg
Bauli

Pascht scho :smiley:

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 :smiley:
Grüße, Uwe

Hallo 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…)?

Vielen Dank im Voraus

Mark

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.

Ich hoffe das hilft.
Grüße, Uwe

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?

Danke für die Unterstützung

Mark

Moin Mark,

Ich bin seinerzeit auch nur den Anleitungen gefolgt, das war recht problemlos.

Gar nicht mehr :smiley:
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.

Grüße, Uwe

Den noch zum WebFront:

WFC_AudioNotification(50969 /*[WebFront]*/, 'Klingel', 57256 /*[salamisound-7727641-klingel-ding-dong.mp3]*/);

Das File habe ich einfach über die Console in die Media-Dateien hochgeladen (keine Freigaben notwendig).