Neues Modul: Text2Speech

Begonnen von Tobias, 07 Januar 2014, 12:57:23

Vorheriges Thema - Nächstes Thema

Tobias

#465
Dein APIKey ist fehlerhaft. Deswegen bekommst du die mp3 nicht raus... Der Rest sind Folgefehler...
Den APIKey bekomst du erst nach Anmeldung... Hatte ich aber geschrieben....

2015.08.24 19:21:02 4: tts: Auflistung der Textbausteine nach Aufbereitung:
2015.08.24 19:21:02 4: tts: 0 => Das ist ein Test Nummer 2.
2015.08.24 19:21:02 4: Verwende TTS Spracheinstellung: Deutsch
2015.08.24 19:21:02 4: Text2Speech: Bearbeite jetzt den Text: Das ist ein Test Nummer 2.
2015.08.24 19:21:02 4: Text2Speech: Textbaustein ist keine direkte MP3 Datei, ermittle MD5 CacheNamen: 6667795316f883debdea5ddbb9fa6309.mp3
2015.08.24 19:21:02 4: Text2Speech: Hole URL: http://api.voicerss.org/?hl=de-de&f=48khz_16bit_stereo&key=xxxxxxxx27c048c5a10a81e6xxxxxxxx&src=Das%20ist%20ein%20Test%20Nummer%202.
2015.08.24 19:21:03 4: Text2Speech: Schreibe mp3 in die Datei cache/6667795316f883debdea5ddbb9fa6309.mp3 mit 43619 Bytes
2015.08.24 19:21:03 4: Text2Speech_CalcMP3Duration: cache/6667795316f883debdea5ddbb9fa6309.mp3 hat eine Länge von 5 Sekunden.
2015.08.24 19:21:03 4: Text2Speech:sudo /usr/bin/mplayer -ao alsa:device=hw=0.0 -really-quiet -nolirc -noconsolecontrols cache/6667795316f883debdea5ddbb9fa6309.mp3
2015.08.24 19:21:03 4: Text2Speech_readingsSingleUpdateByName: Dev:tts Reading:duration Val:5
2015.08.24 19:21:03 4: Text2Speech_readingsSingleUpdateByName: Dev:tts Reading:endTime Val:00:00:00
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

slupus

Ich hatte bisher auch das Problem, dass nur noch bereits generierte mp3's ausgegeben wurden. Seit heute funktioniert die Ausgabe auch wieder mit neu generierten mp3's. Das letzte Update von FHEM lief am Samstagmorgen. Außer den Updates habe ich keine Anpassungen vorgenommen, auch das Löschen des Caches war bei mir erfolglos. Können das auch die anderen mit diesem Problem bestätigen?
Ich werde das Verhalten weiter beobachten. Sollte es wieder Probleme geben, probiere ich die neue Ressource aus.

Hollo

#467
Zitat von: Tobias am 24 August 2015, 19:14:19
Dein APIKey ist fehlerhaft. Deswegen bekommst du die mp3 nicht raus... Der Rest sind Folgefehler...
Den APIKey bekomst du erst nach Anmeldung... Hatte ich aber geschrieben....
Selbstverständlich hatte ich mich registriert und den angezeigten API-Key in meine Config kopiert.  >:(
Das "musshiernichtrein" war nur als Platzhalter; wenn alle meinen Key nutzen, wird das mit den 350 Anfragen wohl schnell erreicht sein.  ;D

Habe mir gerade mal die "fehlerhafte MP3-Datei" angesehen:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Header</h2>
<hr><p>HTTP Error 400. The request has an invalid header name.</p>
</BODY></HTML>


Wenn ich die erzeugte URL direkt im Browser eingebe, bekomme ich die passende Ansage.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Ellert

Ich habe bei der Verwendung von Text2Speech folgendes Verhalten festgestellt:
Wenn ein langes MP3WRAP (z.B. 163 s) abgespielt wird gibt es eine Timeoutmeldung: "Timeout for Text2Speech_DoIt reached, terminated process 4816".
Der nächste Text wird dann immer mit der Ansage eines Arrays eingeleitet: "SagEs: 0 => ARRAY(0x47671e8)".

Dies ist der Logfileauszug für den langen Text:
2015.08.25 04:15:00 4: Text2Speech: mp3wrap cache/cca6cbb6ea8961297bb4031170e493d3.mp3 cache/templates/stille500ms.mp3 cache/dff1059b189523c8514125b86dce6c30.mp3 cache/f9d4c62182862fed579af8d222787018.mp3 cache/3ac907259a23cf91c9db4c670ae4cbc9.mp3 cache/dc96241aa1f57e549410be202d2f12f1.mp3 cache/c9296a5fe275c2108f2b5d52097fccf5.mp3 cache/cc7e2367b86e52fb735180bb790128d1.mp3 cache/0d40e97e82e65ad7581b0c985e06f18f.mp3 cache/15c281b9a3ce3d390515dc58174c0da8.mp3 cache/7f38b8430aaa6ee3c3fd205b5d80cab4.mp3 cache/98b8acd5052b134afea903e817d1af22.mp3 cache/1f31c779f511680ec944c0bd2c46c1a9.mp3 cache/beb573febe6bd1f114b84cd01e62869b.mp3 cache/0d866b1b39e9303a8cfe6b07f926a0a7.mp3 cache/2cc4aa5cbb433db1ba67154477224ffb.mp3 cache/9ff135956e644e11249b943e0ff66f78.mp3 cache/8bd7c0e288f13ce859c58de96099da49.mp3 cache/82869e23523c6ff476d16e9d299a8611.mp3 cache/8e604c13beec9fe76c4071ec5a8b9488.mp3 cache/dfd6cd758994c4c41587c46143136a01.mp3 cache/89364957474f6b1ef74f468671fb9072.mp3 cache/db8ae7d594e45e04106fd372d25306a5.mp3 cache/6beceafedb892053c5577a8d483ce595.mp3 cache/fbd8313449bc4054275a5de522edf60c.mp3 cache/ce0202016c6357275c900eec029b7709.mp3 >/dev/null
2015.08.25 04:15:01 4: Text2Speech_CalcMP3Duration: cache/cca6cbb6ea8961297bb4031170e493d3_MP3WRAP.mp3 hat eine Länge von 163 Sekunden.
2015.08.25 04:15:01 4: Text2Speech:sudo /usr/bin/mplayer -ao alsa:device=hw=0.0 -really-quiet -nolirc -noconsolecontrols -softvol -softvol-max 100 -volume 1 cache/cca6cbb6ea8961297bb4031170e493d3_MP3WRAP.mp3
2015.08.25 04:15:01 4: Text2Speech_readingsSingleUpdateByName: Dev:SagEs Reading:duration Val:163
2015.08.25 04:15:01 4: Text2Speech_readingsSingleUpdateByName: Dev:SagEs Reading:endTime Val:00:00:00
2015.08.25 04:16:00 1: Timeout for Text2Speech_DoIt reached, terminated process 4816
2015.08.25 04:16:00 2: Text2Speech: BlockingCall for SagEs was aborted


Dies ist der Logfileauszug für den nächsten Text:
2015.08.25 07:05:04 4: SagEs: Angabe einer direkten MP3-Datei gefunden:   => FileTpl_1440479104_#1
2015.08.25 07:05:04 4: SagEs: Auflistung der Textbausteine nach Aufbereitung:
2015.08.25 07:05:04 4: SagEs: 0 => ARRAY(0x47671e8)
2015.08.25 07:05:04 4: SagEs: 1 => templates/stille500ms.mp3
2015.08.25 07:05:04 4: SagEs: 2 => Das Schlafzimmerfenster wurde geschlossen.
2015.08.25 07:05:04 4: Verwende TTS Spracheinstellung: Deutsch
2015.08.25 07:05:04 4: Text2Speech: Bearbeite jetzt den Text: ARRAY(0x47671e8)


Ich würde gern mal zur Probe das Timeout hochsetzen. Ich weiss aber nicht an welcher Stelle der Datei 98_Text2Speech.pm.
Ist es die 60 in der Zeile:
$hash->{helper}{RUNNING_PID} = BlockingCall("Text2Speech_DoIt", $hash, "Text2Speech_Done", 60, "Text2Speech_AbortFn", $hash) unless(exists($hash->{helper}{RUNNING_PID}));

Es wäre nett, wenn mir jemand einen Hinweis geben könnte. Vielen Dank schon mal.

Tobias

#469
Ja, es ist die 60.... setze diese mal testweise auf 200 (sekunden)...

Ich bin bis dato nicht davon ausgegangen das jemand Texte > 60sekunden ansagen lässt. Was gibst du denn aus?? Würde mich mal interessieren.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Ellert

@ Tobias: Das ging ja schnell. Ich lade mir ein Tagesmotto aus dem Netz und lasse es mir zum Frühstück vorlesen. Wegen der Länge des Textes lasse ich die MP3WRAP stumm vorbereiten, dann ist die Ansage flüssig.

Ellert

@Tobias: Die Verlängerung des Timeout hat geklappt, die Ansage eines Arrays beim nächsten Text unterbleibt.

Anmerkung: Auch bei kurzem Timeout wird die Ansage zu Ende gesprochen.

Tobias

Du kannst ja mal VoiceRSS testen ;)
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Tobias

#473
Hier nochmal die aktuellste Version.. Habe ich gerade mit VoiceRSS ziemlich ausgiebig getestet.
Wenn keine Fehlermeldungen hier eintrudeln, würde ich es morgen einchecken...
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Ellert

ZitatDu kannst ja mal VoiceRSS testen

Bevor Du vorgeschlagen hast VoiceRSS zu testen, hatte ich mir die Stimme angehört und mich gegen einen Test entschieden.

Aber hier nun doch mein Testergebnis (FHEM auf RasPi B+):

Logfile:
2015.08.25 19:00:54 4: Text2Speech: Hole URL: http://api.voicerss.org/?hl=de-de&f=48khz_16bit_stereo&key=gelöscht&src=Hallo%20wie%20geht%20es

Es kommt eine Datei mit folgendem Inhalt zurück:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Header</h2>
<hr><p>HTTP Error 400. The request has an invalid header name.</p>
</BODY></HTML>


Wenn ich die URL am Browser (aktueller Firefox) aufrufe (natürlich mit meinem API-Key) wird der Text gesprochen.

Nachdem ich auf Google umgestellt habe kommt die Captcha-Abfrage.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content="initial-scale=1"><title>http://translate.google.com/translate_tts?tl=de&amp;q=Morgen%20gibt%20es%20was</title></head>
<body style="font-family: arial, sans-serif; background-color: #fff; color: #000; padding:20px; font-size:18px;" onload="e=document.getElementById('captcha');if(e){e.focus();}">
<div style="max-width:400px;">
<hr noshade size="1" style="color:#ccc; background-color:#ccc;"><br>

  To continue, please type the characters below:<br><br>
  <img src="/sorry/image?id=2403786924147101825&amp;hl=en" border="1" alt="Please enable images"><br><br><form action="CaptchaRedirect" method="get"><input type="hidden" name="continue" value="http://translate.google.com/translate_tts?tl=de&amp;q=Morgen%20gibt%20es%20was"><input type="hidden" name="id" value="2403786924147101825"><input type="text" name="captcha" value="" id="captcha" size="12" style="font-size:16px; padding:3px 0 3px 5px; margin-left:0px;"><input type="submit" name="submit" value="Submit" style="font-size:18px; padding:4px 0;"><br><br><br></form>
  <hr noshade size="1" style="color:#ccc; background-color:#ccc;">
 
   <div style="font-size:13px;">
    <b>About this page</b><br><br>Our systems have detected unusual traffic from your computer network.  This page checks to see if it's really you sending the requests, and not a robot.  <a href="#" onclick="document.getElementById('infoDiv').style.display='block';">Why did this happen?</a><br><br>
    <div id="infoDiv" style="display:none; background-color:#eee; padding:10px; margin:0 0 15px 0; line-height:1.4em;">
     This page appears when Google automatically detects requests coming from your computer network which appear to be in violation of the <a href="//www.google.com/policies/terms/">Terms of Service</a>. The block will expire shortly after those requests stop.  In the meantime, solving the above CAPTCHA will let you continue to use our services.<br><br>This traffic may have been sent by malicious software, a browser plug-in, or a script that sends automated requests.  If you share your network connection, ask your administrator for help &mdash; a different computer using the same IP address may be responsible.  <a href="//support.google.com/websearch/answer/86640">Learn more</a><br><br>Sometimes you may be asked to solve the CAPTCHA if you are using advanced terms that robots are known to use, or sending requests very quickly.
    </div>
 
 


IP address: gelöscht<br>Time: 2015-08-25T17:27:13Z<br>URL: http://translate.google.com/translate_tts?tl=de&amp;q=Morgen%20gibt%20es%20was<br>
</div>
</div>
</body>
</html>


Dann in Kürze: Captch gelöst, in 98_Text2Speech.pm header auf den Altenativen umgestellt, reload, Google gibt Captcha zurück, umgestellt auf VoiceRSS, wieder: Bad Request - Invalid Header

Jetzt habe ich diese Datei wieder reloaded: 98_Text2Speech.pm 9003 2015-07-29 18:39:12Z tobiasfaust $ und alles läuft wie vorher.

Aber, ich habe das Gefühl nichts Neues herausgefunden zu haben.

Ellert

Schnelltest:
Mit der neuen Datei und Google kommt wieder die Captcha-Abfrage.
Mit VoiceRSS wieder: Bad Request - Invalid Header.
Der Aufruf sieht für mich o.k. aus.
2015.08.25 20:25:48 4: Text2Speech: Hole URL: http://api.voicerss.org/?hl=de-de&f=48khz_16bit_stereo&key=GELÖSCHT&src=so%20jetzt%20nochmal%20VoiceRss

Hat es bei Dir funktioniert?


netbus

mit dem bestehenden Modul funkt Google noch.
Mit dem neuen funkt weder Google noch Voicerss.
Es kommt immer folgende Fehlermeldung

PERL WARNING: Use of uninitialized value $mp3Duration in string at ./FHEM/98_Text2Speech.pm line 561

Ellert

@Tobias: Ich hab mal den Header verändert weil ich nicht weiss ob ich ihn ganz löschen darf.
header     => " "
Damit funktioniert VoiceRSS, aber Google nicht. Im Googleaufruf fehlt "&client=t&prev=input", wie hier beschrieben:
http://forum.fhem.de/index.php/topic,18481.msg317208.html#msg317208

Google funktioniert hiermit (offizielles Modul):
2015.08.25 20:37:50 4: Text2Speech: Hole URL: http://translate.google.com/translate_tts?tl=de&client=t&prev=input&q=Das%20war%20wohl%20nichts%20VoiceRss

und hiermit nicht (Modul vom 25.8.):
2015.08.25 23:43:43 4: Text2Speech: Hole URL: http://translate.google.com/translate_tts?tl=de&q=geht%20google%20auch

Ich war bis heute auch der Meinung es müsste der UserAgent angegeben werden. Das halte ich nicht mehr für notwendig.

Die HTTPUtils verwendet als Voreinstellung HTTP/1.0 http://www.fhemwiki.de/wiki/HttpUtils#HttpUtils_BlockingGet, dort siehe Bedeutung von httpversion. Bei der Verwendung von HTTP/1.0 ist die Angabe eines Headers optional http://www.mediaevent.de/tutorial/http-request.html, siehe HTTP/1.0. und HTTP/1.1

Mein Vorschlag: Der Header sollte frei bleiben, dann funktioniert VoiceRSS. Und "&client=t&prev=input" sollte wieder in den Googleaufruf, dann funktioniert auch Google.

Zusätzlich hätte ich gern ein Attribut fürs Timeout des BlockingCall und ein AutoFallBack auf VoiceRSS, wenn Google nach Captchas fragt  ;)

Mir ist noch aufgefallen, das die VoiceRSS Datei ca. 6 mal größer ist als die von Google. Mir würden 16 kHz bei 16 bit mono von Google ausreichen.

Tobias

Auf ein Neues. Mit dem aktuellen Modul funktioniert sowohl Google als auch VoiceRSS

Änderungen:
-Google URL-Addon wieder eingebaut (ist mit irgendwie verloren gegangen :( )
- Doku angepasst
- HttpVersion auf 1.1 gesetzt

Wenn ihr noch andere TTS-Onlinedienste mit WebAPI habt kann ich versuchen auch diese noch einzubauen...

Google:
2015.08.26 07:55:14 4: tts: Auflistung der Textbausteine nach Aufbereitung:
2015.08.26 07:55:14 4: tts: 0 => Das ist ein Test mit Google und VoiceRSS ob beides korrekt funktioniert
2015.08.26 07:55:14 4: Verwende TTS Spracheinstellung: Deutsch
2015.08.26 07:55:14 4: Text2Speech: Bearbeite jetzt den Text: Das ist ein Test mit Google und VoiceRSS ob beides korrekt funktioniert
2015.08.26 07:55:14 4: Text2Speech: Textbaustein ist keine direkte MP3 Datei, ermittle MD5 CacheNamen: a4cc14a047e210f5e2c4d0566e142c6f.mp3
2015.08.26 07:55:14 4: Text2Speech: Verwende Google OnlineResource zum Download
2015.08.26 07:55:14 4: Text2Speech: Hole URL: http://translate.google.com/translate_tts?tl=de&client=t&prev=input&q=Das%20ist%20ein%20Test%20mit%20Google%20und%20VoiceRSS%20ob%20beides%20korrekt%20funktioniert
2015.08.26 07:55:15 4: Text2Speech: Schreibe mp3 in die Datei cache/a4cc14a047e210f5e2c4d0566e142c6f.mp3 mit 20304 Bytes
2015.08.26 07:55:15 4: Text2Speech_CalcMP3Duration: cache/a4cc14a047e210f5e2c4d0566e142c6f.mp3 hat eine Länge von 5 Sekunden.
2015.08.26 07:55:15 4: Text2Speech:sudo /usr/bin/mplayer -ao alsa:device=hw=0.0 -really-quiet -nolirc -noconsolecontrols cache/a4cc14a047e210f5e2c4d0566e142c6f.mp3


VoiceRSS:
2015.08.26 07:56:58 4: tts: Auflistung der Textbausteine nach Aufbereitung:
2015.08.26 07:56:58 4: tts: 0 => Das ist ein Test mit Google und VoiceRSS ob beides korrekt funktioniert.
2015.08.26 07:56:58 4: Verwende TTS Spracheinstellung: Deutsch
2015.08.26 07:56:58 4: Text2Speech: Bearbeite jetzt den Text: Das ist ein Test mit Google und VoiceRSS ob beides korrekt funktioniert.
2015.08.26 07:56:58 4: Text2Speech: Textbaustein ist keine direkte MP3 Datei, ermittle MD5 CacheNamen: 6edcf1bccb8a05bb9b99333101399cee.mp3
2015.08.26 07:56:58 4: Text2Speech: Verwende VoiceRSS OnlineResource zum Download
2015.08.26 07:56:58 4: Text2Speech: Hole URL: http://api.voicerss.org/?hl=de-de&f=48khz_16bit_stereo&key=xxxxxxxxx527c048c5a10a81e619xxxxxxx&src=Das%20ist%20ein%20Test%20mit%20Google%20und%20VoiceRSS%20ob%20beides%20korrekt%20funktioniert.
2015.08.26 07:56:59 4: Text2Speech: Schreibe mp3 in die Datei cache/6edcf1bccb8a05bb9b99333101399cee.mp3 mit 85091 Bytes
2015.08.26 07:56:59 4: Text2Speech_CalcMP3Duration: cache/6edcf1bccb8a05bb9b99333101399cee.mp3 hat eine Länge von 11 Sekunden.
2015.08.26 07:56:59 4: Text2Speech:sudo /usr/bin/mplayer -ao alsa:device=hw=0.0 -really-quiet -nolirc -noconsolecontrols cache/6edcf1bccb8a05bb9b99333101399cee.mp3


Ich sehe dort auch einen Dateigrößenunterschied. Google spricht 5sekunden, VoiceRSS 11sekunden.
Bei VoiceRSS kann man aber auch einen Parameter angeben um die Sprechgeschwindigkeit zu beinflussen:
Zitatr -> The speech rate (speed). Allows values: from -10 (slowest speed) up to 10 (fastest speed). Default value: 0 (normal speed). (optional)
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Hollo

Sehr schön Tobias, dann teste ich mal weiter.

@netbus
Hatte ich oben schon geschrieben; soll laut Tobias aber an der fehlerhaften MP3-Datei liegen.

@Ellert
Das mit dem -bad request- Header hatte ich oben schon gemeldet.
Schön, dass Du das bestätigen konntest; jetzt brauche ich den "Fehler" nicht mehr in meinem System suchen.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"