Neues Modul: Text2Speech

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

Vorheriges Thema - Nächstes Thema

Hollo

Zitat von: netbus am 12 August 2015, 22:33:03
...Ich kann mir das nur so erklären das wir anscheinend auf dem bananapi einen anderen url fetcher oder "generator" haben dürften...
Welche Distribution nutzt Du denn?
Für Bananian kann ich sagen, dass da die URL korrekt zusammengesetzt wird.
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"

netbus

@hollo
Ich verwende Bananian (wheezy)

@fruemmel
dieser Link steht in der mp3 Datei im cache ordner

@otto
ich verwende als locale en_US

fruemmel

Zitat von: netbus am 13 August 2015, 08:57:35
@fruemmel
dieser Link steht in der mp3 Datei im cache ordner
Du hast Recht, steht bei mir auch mit &amp in der cache-Datei. Das ist ja die Antwort von google. Da steht auch drin, dass er das captcha gelöst haben möchte. Jetzt ist nur die Frage, ob der Link auf dem Banana schon falsch generiert wird, oder erst die Antwort von google modifiziert wird.

Hollo

@netbus
Wieso hast Du Dein System auf en_US stehen?
Setz das mal auf de_DE und probier dann mal weiter.
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"

fruemmel

Ich habe es bei mir auf de. Ich glaube aber nicht, dass der Link falsch ist, sondern erst die Antwort von google das &amp enthält. Sonst würde das captcha ja gar nicht abgefragt werden.

netbus

Ich habe nun einen tcpdump gezogen.
Er schickt im ersten Step ein GET /translate_tts?tl=de&client=t&prev=input&q=hallo%20test HTTP/1.0 was eigentlich korrekt wäre bekommt aber ein 302 Moved Temporarily zurück.
Somit schickt er einen neuen Request zu der neuen Location welche den Captcha enthält und dann geht nichts mehr.
Wenn er aber den Fehler 302 ignorieren würde würde er die MP3 bekommen.
Interressant wäre daher wie ein tcpdump auf einem funktionierenden Gerät aussieht.

Step1
GET /translate_tts?tl=de&client=t&prev=input&q=hallo%20test HTTP/1.0
Host: translate.google.com

HTTP/1.0 302 Moved Temporarily
Location: http://ipv4.google.com/sorry/IndexRedirect?continue=http://translate.google.com/translate_tts%3Ftl%3Dde%26client%3Dt%26prev%3Dinput%26q%3Dhallo%2520test&q=CGMSBE6EGjAYv-KxrgUiGQDxp4NLUuXVmYHLv2dSn4JwuiHNUj9mTbw
Date: Thu, 13 Aug 2015 10:28:15 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type: text/html; charset=UTF-8
Server: HTTP server (unknown)
Content-Length: 411
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Connection: close

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://ipv4.google.com/sorry/IndexRedirect?continue=http://translate.google.com/translate_tts%3Ftl%3Dde%26client%3Dt%26prev%3Dinput%26q%3Dhallo%2520test&amp;q=CGMSBE6EGjAYv-KxrgUiGQDxp4NLUuXVmYHLv2dSn4JwuiHNUj9mTbw">here</A>.
</BODY></HTML>


Step2
GET /sorry/IndexRedirect?continue=http://translate.google.com/translate_tts%3Ftl%3Dde%26client%3Dt%26prev%3Dinput%26q%3Dhallo%2520test&q=CGMSBE6EGjAYv-KxrgUiGQDxp4NLUuXVmYHLv2dSn4JwuiHNUj9mTbw HTTP/1.0
Host: ipv4.google.com

HTTP/1.0 503 Service Unavailable
Date: Thu, 13 Aug 2015 10:28:15 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type: text/html
Server: HTTP server (unknown)
Content-Length: 2816
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Connection: close

<!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;client=t&amp;prev=input&amp;q=hallo%20test</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=1609762770752662828&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;client=t&amp;prev=input&amp;q=hallo%20test"><input type="hidden" name="id" value="1609762770752662828"><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: XX.XX.XX.XX<br>Time: 2015-08-13T10:28:15Z<br>URL: http://translate.google.com/translate_tts?tl=de&amp;client=t&amp;prev=input&amp;q=hallo%20test<br>
</div>
</div>
</body>
</html>

netbus

Ich glaube das Problem gefunden zu haben.
Es wird kein User Agent mitgeschickt.
Ich habe testhalber meinen User Agent im Firefox ausgeschalten und schon bekam ich die gleiche Meldung wie FHEM. Mit User Agent bekomme ich sofort die Mp3.
Daher die Bitte an Tobias.
Kannst du den UserAgent einbauen?  ;D  Da du httputils verwendest kann man mittels
$param->{header}
das einbauen

Hollo

Zitat von: netbus am 13 August 2015, 19:23:30
Ich glaube das Problem gefunden zu haben.
Es wird kein User Agent mitgeschickt...
Das habe ich im Beitrag #429 http://forum.fhem.de/index.php/topic,18481.msg319200.html#msg319200 schon geschrieben. Wusste nur nicht wie man das testen und einbauen könnte.
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"

Tobias

Toll wäre es wenn ihr mir  die exakte Codezeile mit der User Agent  Angabe posten könntet. Bitte vorher auch testen ;)

Beitrag kurz gehalten da unterwegs und mobil gesendet

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

netbus

Leider habe ich vom Programmieren recht wenig Ahnung.
Aber laut wiki sollte der Code so in etwa aussehen.

use HttpUtils;
sub X_GetHttpResponse($)
{
    my ($hash, $def) = @_;
    my $name = $hash->{NAME};
    my $param = {
                    url        => "http://translate.google.com/translate_tts",
                    timeout    => 5,
                    hash       => $hash,                                                                                  # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
                    method     => "GET",                                                                                  # Lesen von Inhalten
                    header     => "agent: Mozilla/1.22\r\nUser-Agent: Mozilla/1.22",    # Den Header gemäss abzufragender Daten ändern
                    callback   =>  \&X_ParseHttpResponse                                                                  # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten
                };
                         
    HttpUtils_NonblockingGet($param);                                                                                     # Starten der HTTP Abfrage. Es gibt keinen Return-Code.
   
}

Invers

Nachdem nunmehr 2 Monate seit meiner letzten Anfrage hier vergangen sind, wage ich es, noch einmal erneut zu fragen. Vielleicht haben sich ja neue Erkenntnisse ergeben.

Ich erhalte seit einer gefühlten Ewigkeit die Meldung:
Prototype after '@' for main::Text2Speech_SplitString : @$$$$ at ./FHEM/98_Text2Speech.pm line 465

Kann mir inzwischen jemand etwas dazu sagen?

Danke im Voraus.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Ellert

@Invers: Das ist eine Perl Warnung, die erzeugt wird, weil bei der Deklarierung der Subroutine Text2Speech_SplitString nach einem Prototypen für eine Liste weitere skalare Prototypen angegeben werden.

Nach einem Listenprototypen skalare Prototypen anzugeben ist ungewöhnlich, da der Listenprototyp eingentlich alles abgreift.

Mehr dazu gibt  es hier: http://modernperlbooks.com/mt/2009/08/the-problem-with-prototypes.html

Invers

Vielen Dank für die gute Erklärung. Was du geschrieben hast, habe ich soweit verstanden. Leider sind meine Englischkenntnisse nicht so gut, um dem Text im Link folgen zu können. Die Google-Übersetzung trägt auch nicht positiv dazu bei.

Die Erklärung lässt nach meiner Meinung darauf schliessen, dass man dieses Problem relativ leicht aus dem Weg räumen könnte.
Kann ich noch einen Tipp haben, ob ich da im Modul durch eine kleine Änderung etwas bewirken kann?


Auch die Frage, ob das Ganze negative Auswirkungen hat, würde mich interessieren.
Falls das egal ist und nichts dadurch beeinträchtigt wird, wäre es ja egal, ausser, dass es unschön ist.

Nochmals danke.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Tobias

#463
Ich hatte heute mal etwas Zeit und hab mich mal dran gesetzt.
Leider habe ich es mit dem Google Captcha nicht  hinbekommen. Hier bin ich auf Mithilfe angewiesen!!!

Alternativ habe ich eine neue Ressource "VoiceRSS" eingebaut.
Ihr müsst euch registrieren um einen APIKey zu bekommen. Ist für den normalen Gebrauch auch Kostenlos:
http://www.voicerss.org/registration.aspx

Bitte mal das neue Modul in Fhem einfügen, reloaden, den TTS_APIKey eingeben sowie die Ressource auf VoiceRSS ändern.
Dann mal 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

Hollo

#464
Zumindest bei mir haut da noch was nicht hin.
Mit der neuen Modul-Version bekomme ich Fehlermeldungen...

2015.08.24 16:56:56 1: PERL WARNING: Use of uninitialized value $mp3Duration in string at ./FHEM/98_Text2Speech.pm line 552.
2015.08.24 16:57:31 4: MyTTS: Auflistung der Textbausteine nach Aufbereitung:
2015.08.24 16:57:31 4: MyTTS: 0 => Test
2015.08.24 16:57:31 4: Verwende TTS Spracheinstellung: Deutsch
2015.08.24 16:57:31 4: Text2Speech: Bearbeite jetzt den Text: Test
2015.08.24 16:57:31 4: Text2Speech: Textbaustein ist keine direkte MP3 Datei, ermittle MD5 CacheNamen: 32cb74707cca1b4b159ac2531f4fc883.mp3
2015.08.24 16:57:31 4: Text2Speech: Hole URL: http://api.voicerss.org/?hl=de-de&f=48khz_16bit_stereo&key=musshiernichtrein&src=Test
2015.08.24 16:57:31 4: Text2Speech: Schreibe mp3 in die Datei cache/32cb74707cca1b4b159ac2531f4fc883.mp3 mit 339 Bytes
2015.08.24 16:57:31 1: PERL WARNING: Use of uninitialized value $mp3Duration in string at ./FHEM/98_Text2Speech.pm line 552.
2015.08.24 16:57:31 4: Text2Speech:/usr/bin/mplayer -ao alsa:device=hw=0.0  -nolirc -noconsolecontrols -softvol -softvol-max 110 -volume 100 cache/32cb74707cca1b4b159ac2531f4fc883.mp3
2015.08.24 16:57:31 4: Text2Speech_readingsSingleUpdateByName: Dev:MyTTS Reading:duration Val:
2015.08.24 16:57:31 4: Text2Speech_readingsSingleUpdateByName: Dev:MyTTS Reading:endTime Val:00:00:00


Rückstellen auf Google wird nicht übernommen (ebenso wie das Language-Feld nicht korrekt ist);
nach manuellem Rückstellen (cfg) und Restart weiterhin keine Funktion und Fehlermeldung m3Duration.

Vorherige Version wieder eingespielt und läuft.

Übrigens ist mir dabei gerade aufgefallen (was aber nicht am Modul liegt)...

MPlayer2 2.0-728-g2c378c7-4+b1 (C) 2000-2012 MPlayer Team
Cannot open file '/root/.mplayer/input.conf': Permission denied
Failed to open /root/.mplayer/input.conf.


Da stimmt doch was nicht; die liegt bei mir unter /etc/mplayer/input.conf  :-\
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"