Ivona TTS Modul

Hallo zusammen,

ich habe Titus gebeten sein Script (TTS mit Amazon / Ivona statt Google Translate) in ein Modul kippen zu dürfen, und hier ist es:
tkugelberg/SymconIvona · GitHub

Bei der Konfiguration kann man fogendes angeben:
Ivona_config.png

Access und Secret Key bekommt man bei IVONA Text-to-Speech, wenn man sich registriert.

Language, Voice, Rate und Volume/Lautstärke dürften selbsterklärend sein.

Default Path ist das Verzeichnis, in das gespeichert werden soll. Wenn es nicht gepflegt wird, wird das Temp Verzeichnis verwendet.

Delete Files bedeuete, dass die erzeugten Dateien im „Default Path“, „Delete minutes after access“ minuten nach dem letzen Zugriff gelöscht werden.
Hierfür wird alle 300 Sekunden ein Script unter der Ivona Instanz eingeplant.

Wenn „Access Path“ ist für den Rückgabewert der erzeugten Datei wichtig.

Es gibt 2 Funktionen:
IVNTTS_getMP3(InstanceID; Text);

Hier kommt der inhalt des MP3 zurück und kann nach belieben weiterverarbeitet werden.

IVNTTS_saveMP3(InstanceID; Text);

Hier wird aus dem Inhalt des MP3 eine Datei erzeugt.
Sie wird im angegebenen Verzeichnis (bzw. Temp) mit dem „md3hash“.mp3 abgelegt. Falls die Datei schon existiert, wird sie nicht erneut erzeugt.
Die Rückgabe ist der Dateiname inklusive Pfad.
Falls ein „Access Path“ angegeben ist, wird dieser mit dem Dateinamen zurückgeliefert.

Dadurch kann man es z.B. direkt mit der „SNS_PlayFiles“ Funktion des Sonos Moduls verwenden:


SNS_PlayFiles(31596 /*[Sonos_neu\Küche]*/ , array(IVNTTS_saveMP3(55186 /*[Ivona]*/,"Geht das so?"),
                                                                                                       IVNTTS_saveMP3(55186 /*[Ivona]*/,"Jepp!")) );

Probiert es mal aus, bei mir geh es gut.

Gruß,
Thorsten

Edit 31.12.2015: Vorraussetzung des lokalen PHP rausgenommen, da hash im IPS jetzt vorhanden ist.

Hallo Thorsten,

bei der Ausführung folgendes Skriptes

SNS_PlayFiles(39668 /*[Sonos\Sonos]*/ , array(IVNTTS_saveMP3(19890 /*[Sonos\Ivona]*/,"Geht das so?"),
                                                                                                       IVNTTS_saveMP3(19890 /*[Sonos\Ivona]*/,"Jepp!")) );

bekomme ich folgende Fehlermeldung:

Warning: file_put_contents(//192.168.178.20/public/4d43263a767a8eb105e1db791de7f507.mp3): failed to open stream: No such file or directory in /usr/share/symcon/modules/SymconIvona/Ivona/ivona.php on line 35

Warning: file_put_contents(//192.168.178.20/public/e6c2fae56dbd3d21a62c622078501024.mp3): failed to open stream: No such file or directory in /usr/share/symcon/modules/SymconIvona/Ivona/ivona.php on line 35

Fatal error: Uncaught exception ‚Exception‘ with message ‚Error sending command: HTTP/1.1 500 Internal Server Error CONTENT-LENGTH: 347 CONTENT-TYPE: text/xml; charset=„utf-8“ EXT: Server: Linux UPnP/1.0 Sonos/29.6-93090 (ZPS1) Connection: close s:ClientUPnPError‘ in /usr/share/symcon/modules/SymconSonos/Sonos/sonos.php:650 Stack trace: #0 /usr/share/symcon/modules/SymconSonos/Sonos/sonos.php(370): PHPSonos->sendPacket(‚POST /MediaRend…‘) #1 /usr/share/symcon/modules/SymconSonos/Sonos/module.php(428): PHPSonos->Play() #2 /usr/share/symcon/scripts/__generated.inc.php(147): Sonos->PlayFiles(Array) #3 /usr/share/symcon/scripts/42620.ips.php(17): SNS_PlayFiles(39668, Array) #4 {main} thrown in /usr/share/symcon/modules/SymconSonos/Sonos/sonos.php on line 650

Meine Konfiguration des Moduls sieht folgendermaßen aus:

Unbenannt.JPG

Wobei der Pfad //192.168.178.20/public eine Samba Freigabe auf meinem Raspberry ist.

Gruß

Axel

Wenn ich per

include 'SonosBY.ips.php';

die SonosBY einbinde erhalte ich als Fehlermeldung:

Fatal error: Cannot redeclare class IVONA_TTS in /usr/share/symcon/modules/SymconIvona/Ivona/ivona.php on line 12

Gruß

Axel

Hallo,

dann gib bitte in dem Parameter den Pfad/Verzeichnis auf dem raspberry an, hinter dem sich der Samba share versteckt.

wenn du z.B. /data/samba/public als //192.168.178.20/public freigegeben hast, musst Du in dem Parameter Default Path „/data/samba/public“ und bei Access Path //192.168.178.20/public angeben.

Das bedeutet, dass sowohl in meinem Modul, als auch in SonosBY.ips.php die Klasse IVONA_TTS enthalten ist. Das hätte ich nicht erwartet.

Gruß,
Thorsten

Hallo Thorsten,

die Pfadangaben habe ich jetzt entsprechend geändert und danach ein Skript mit folgendem Inhalt ausgeführt:

SNS_PlayFiles(39668 /*[Sonos\Sonos]*/ , array(IVNTTS_saveMP3(19890 /*[Sonos\Ivona]*/,"Geht das so?"),
                                                                                                       IVNTTS_saveMP3(19890 /*[Sonos\Ivona]*/,"Jepp!")) );

Die SonosBY habe ich also nicht mehr inkludiert.
Weiterhin erhalte ich folgede Fehlermeldung:

Fatal error: Cannot redeclare class IVONA_TTS in /usr/share/symcon/scripts/IVONA_TTS.ips.php on line 8

Wobei die erste Zeilen meines Skriptes wie folgt aussehen:


///////////////////////////////////////////////////////////////////////////////////////
//   IVONA_TTS             ////////////////////////////////////////////////////////////
//    by Titus 15.10.2015  ////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////

class IVONA_TTS
{
    static  $utc_tz;
    const   ACCESS_KEY = 'AAA'; // HIER DEINEN ACCESS KEY EINTRAGEN!!
    const   SECRET_KEY = 'BBB'; // HIER DEINEN SECRET KEY EINTRAGEN!!
    
    function save_mp3($text, $filename, $language="de-DE", $voice="Marlene", $rate="medium", $volume="loud") {
         $payload['Input'] = array();
            $payload['Input']['Data'] = utf8_encode($text);//{"Input":{"Data":"Hello world"}}'
            $payload['Parameters']['Rate'] = $rate;
            $payload['Parameters']['Volume'] = $volume;
            $payload['Voice']['Name'] = $voice;
            $payload['Voice']['Language'] = $language;
            
            $payload = json_encode($payload); 
            $mp3 = $this->get_mp3($payload);
            file_put_contents($filename, $mp3);
     }

Die bemängelte Zeile ist die direkt unter „class IVONA_TTS“ also dort wo die geschweifte Klammer steht.

Axel

Hallo Thorsten,

wenn ich das Skript trotz der Fehlermeldung einfach noch einmal ausführe geht es.:slight_smile:

Wenn die MP3 Datei dann auf dem Rechner ist kommt das nächste Mal beim gleichen Text keine Fehlermeldung.

Soll ein anderer Text ausgegeben werden erscheint wieder beim ersten Mal die Fehlermeldung.

Schönen Abend und vielen Dank.

Gruß

Axel

Aiaiai…Axel…du machst hier ein durcheinander mit den ganzen Projekten… :rolleyes:

In SonosBY habe ich die Ivona wie folgt „eingebaut“, damit keine Fehler kommen, wenn nicht included:

if (class_exists("IVONA_TTS")) {
          $Ivona = new IVONA_TTS();
            $Ivona->save_mp3($TTS_Text_UTF8, $Sonos_SMBPfadUndDateiname);
        }

…sonst habe ich dazu nichts in meinem Skript. Was du sonst noch irgendwo kreuz und quer reingeschrieben hast, keine Ahnung. Ich befürchte, dass du selbst nicht mehr wirklich den Überblick mit den ganzen TTS Projekten hast?! :slight_smile:

Du solltest dich mal auf eins konzentrieren, dass zum Laufen bringen und dann Schritt für Schritt weiter an dein Ziel gehen, wie auch immer das aussieht. Ansonsten machst du dich nur selbst durcheinander und die ganzen Projekte hier auch noch :slight_smile:

Und ich behaupte mal, dass sobald eines läuft, auch die anderen funktionieren. Weil deine Fehler scheinen alle die gleiche Ursache zu haben.

> Nur ein gut gemeinter Rat :slight_smile:

Grüße,
Chris

Mit dem Aufruf:

SNS_PlayFiles(59624 /*[Hardware\Media\Sonos\Sonos SCZ]*/ ,
array(IVNTTS_saveMP3(11449 /*[Hardware\Media\Sonos\Ivona]*/,"Geht das so?"),
IVNTTS_saveMP3(11449 /*[Hardware\Media\Sonos\Ivona]*/,"Jepp!")) );

bekomme ich:

<br />
<b>Fatal error</b>:  Uncaught exception 'Exception' with message 'Error sending command: HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: 347
CONTENT-TYPE: text/xml; charset="utf-8"
EXT: 
Server: Linux UPnP/1.0 Sonos/31.3-22220 (ZPS3)
Connection: close

s:ClientUPnPError' in /usr/share/symcon/modules/SymconSonos/Sonos/sonos.php:650
Stack trace:
#0 /usr/share/symcon/modules/SymconSonos/Sonos/sonos.php(446): PHPSonos->sendPacket('POST /MediaRend...')
#1 /usr/share/symcon/modules/SymconSonos/Sonos/module.php(427): PHPSonos->SetAVTransportURI('x-file-cifs:/tm...')
#2 /usr/share/symcon/scripts/__generated.inc.php(112): Sonos->PlayFiles(Array)
#3 /usr/share/symcon/scripts/18584.ips.php(3): SNS_PlayFiles(59624, Array)
#4 {main}
  thrown in <b>/usr/share/symcon/modules/SymconSonos/Sonos/sonos.php</b> on line <b>650</b><br />

Das Sonos-Modul habe ich auch gerade noch mal aktualisiert…

Hallo Chris,

Du hattest natürlich Recht.

Ich habe jetzt alles noch mal von vorne neu eingerichtet und jetzt läuft es:)

Vielen Dank Allen die mir geholfen haben und schönen Abend noch.

Gruß

Axel

Na also :slight_smile: Bitte bei zukünftigen Projekten von dir bitte daran denken :wink:

Viel Spaß damit und Grüße,
Chris

Hallo,

„x-file-cifs:/tm…“ deutet darauf hin, dass Du im Ivona Modul weder den „Deafault Path“, noch den „Access Path“ gepflegt hast.

IVNTTS_saveMP3(11449 /[Hardware\Media\Sonos\Ivona]/,„Geht das so?“) erzeugt eine Datei in dem Verzeichnis „Default Path“. Wenn dieser nicht angegeben ist „/tmp“ (oder dem relevanten Temp Verzeichnis)

–> Das kannst Du testen, wenn du dies ausführst:


var_dump(IVNTTS_saveMP3(11449 /*[Hardware\Media\Sonos\Ivona]*/,"Geht das so?"));

Dies sollte bei Dir etwas wie
string(41) „/tmp/4d43263a767a8eb105e1db791de7f507.mp3“
zurückliefern.

Wenn Du nun in der Instanzkonfiguration einen Default Path angibst (z.B. /data/sonos/ivona), sollte die datei dort hingeschrieben werden, und die Rückgabe von IVNTTS_saveMP3 sollte dementsprechend sein (z.B. /data/sonos/ivona/4d43263a767a8eb105e1db791de7f507.mp3"). Diesen Pfad muss es aber vorher geben!

Wenn nun dieser Pfad per Samba freigegeben ist, kann man den Samba Pfad (z.B."//ipsymcon.fritz.box/sonos/ivona") in dem Modulparameter „Access Path“ (also dem Pfad unter dem das Verzeichnis im Netzwerk erreichbar ist) angibt, ist der Rückgabewert dieser Access Path+ Dateiname (also „//ipsymcon.fritz.box/sonos/ivona/4d43263a767a8eb105e1db791de7f507.mp3“).

Und das kann Sonos dann auch abspielen.

Falls Du nun nicht sicher bist, wie ein Samba Verzeichnis freigegeben wird, hier meine config (/etc/samba/smb.conf) als Beispiel:


[global]
        workgroup = fritz.box
        server string = %h server
        security = SHARE
        obey pam restrictions = Yes
        passdb backend = tdbsam
        guest account = root
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\sUNIX\spassword:* %n
 *Retype\snew\sUNIX\spassword:* %n
 .
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        dns proxy = No
        panic action = /usr/share/samba/panic-action %d
        force group = users
        include = /etc/samba/dhcp.conf

[sonos]
        comment = All the data you need
        path = /data/sonos
        read only = No
        guest ok = Yes


So wird das lokale Verzeichnis /data/sonos als /sonos freigegeben. Aber extrem unsicher, da mit root uns so. In meinem Heinnetz ist mir das aber egal.
Falls der Hostname nicht lokal aufgelöst werden kann geht auch z.B. „//192.168.1.13/sonos/ivona“.

Wenn noch Fragen offen sind, einfach Fragen. Aber bitte so genau wie möglich.

Gruß,
Thorsten

Hallo,

ich hatte auf meinem Raspberry noch das ich keine Umlaute verwenden konnte. Deswegen habe ich gerate as „utf8encode()“ entfernt. Dann geht es bei mir.

Kann mir jemand sagen, wie es bei nicht raspberry installationen aussieht?

Danke,
Thorsten

Good job, for me it works very well, I wondered whether to write such a module on my own, fortunately I checked a community before started coding

Hallo,

aus gegebenem Anblass :wink: habe ich eine Exception eingebaut, falls von Ivona kein MP3 sondern was anderes zurückgeliefert wird:

Fatal error: Uncaught exception ‚Exception‘ with message ‚Response from Ivona is no mp3: {„Message“:„Authentication failed“}‘ in /usr/share/symcon/modules/SymconIvona/Ivona/ivona.php:109 Stack trace: #0 /usr/share/symcon/modules/SymconIvona/Ivona/ivona.php(34): IVONA_TTS->get_mp3(‚Wau, wacm!‘) #1 /usr/share/symcon/modules/SymconIvona/Ivona/module.php(96): IVONA_TTS->save_mp3(‚Wau, wacm!‘, ‚/data/sonos/ivo…‘) #2 /usr/share/symcon/scripts/__generated.inc.php(7): Ivona->saveMP3(‚Wau, wacm!‘) #3 /usr/share/symcon/scripts/11570.ips.php(3): IVNTTS_saveMP3(55186, ‚Wau, wacm!‘) #4 {main} thrown in /usr/share/symcon/modules/SymconIvona/Ivona/ivona.php on line 109

Könnte bei der Fehlersuche helfen…

Gruß,
Thorsten

Hallo,

da mittlerweile die hash fuktion im PHP vom IPS enthalten ist, habe ich den hack entfernt.

Halls ihr einen Fehler bekommt, dass die hash oder die hash_hmac funktion fehlt, macht doch mal ein Update vom IPS.
Falls das nichtrs hilft, postet es hier bitte.

Danke,
Thorsten

Hi Thorsten,

bin gerade über : Sprich Freund und tritt ein – Sprachausgabe für den Raspberry Pi mit eSpeak und SVOX-pico | IT@UDE
gestolpert.
Damit wird TEXT in WAVE direkt auf dem Pi umgewandelt.


pico2wave --lang=de-DE --wave=/tmp/test.wav "Hallo zusammen dieses Thema ist etwas, was ich gerne angehen würde.  "

Der Sound ist auf der Sonos nicht schlecht.

Und was mach ich, wenn ich diese Exception bekomme?

Hallo,

Lesen was da steht und versuchen den Fehler zu beheben.
Wenn Du es nicht verstehst, könntest Du den Fehler auch hier posten…

Gruß,
Thorsten

Wie immer war ich zu vorschnell mit dem posten. Lag an dem nicht vorhandenden Verzeichnis und meinen desolaten Linuxkenntnissen.

Hab nun Samba auf meinem Pi eingerichtet. Inova erzeugt auch die entsprechenden MP3´s. Jedoch wird meinem Sonos der Zugriff darauf auf das Verzeichnis verweigert.

Ich denke ich hab irgendwo den Wurm in der Einrichtung.

Muss ich die Freigabe meiner Sonos Bibliothek hinzufügen?

Ja…musst du…

-Chris-