Neues Modul: Text2Speech

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

Vorheriges Thema - Nächstes Thema

Toto1973

Hmm, mit dem neuen Modul läuft bei mir VoiceRSS nicht. In der MP3 Datei steht folgendes:
<!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>


Google hingegen scheint nun wieder zu funktionieren ;-)
Raspberry PI2, Rademacher DuoFern Stick, CUL, 2 x SCC,  JeeLink 868 Mhz, JeeLink 433 Mhz, 3x Magic UFO LED WiFi Controller, 4x MAX BC-RT-TRX-CyG, 2x MAX Fensterkontakt, 5x Rademacher Gurtwickler, 6x TX29DTH-it, 2x TX25-it als Helligkeitssensor, 1X HM-ES-PM, 6x Sonoff, 7x G-Homa, PIR-1000

Tobias

Das mit dem Bad-Request kann ich aber nicht bestätigen... Noch ist der Header drin... Bitte testet mal.. ev. geht es jetzt durch die Umstellung auf HTTP 1.1
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

Mit der Datei von 08:03:32 funktioniert Google. VoiceRSS geht nicht: The request has an invalid header name.

So gehts bei beiden:635                    header      => "agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m"              # Den Header gemäss abzufragender Daten ändern


Anderes Thema: Bei einem Timeout des BlockingCall bleibt noch irgend etwas übrig, das bei der nächsten Ansage als ARRAY[123456]
angesagt wird. Hat jemand noch eine Idee was da in der Funktion Text2Speech_AbortFn($) noch bereinigt werden muss?

Was macht das splice(@{$hash->{helper}{Text2Speech}}, 0, $tts_done); das in Text2Speech_Done($) ausgeführt wird? Könnte das, das Arrayfragment löschen, was in Text2Speech_AbortFn($) übrig bleibt?

Tobias

nimm mal bite die Zeile 635 (header) und 634 (httpversion) komplett raus und teste dann nochmal bitte mit Google und VoiceRSS
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

Ging heute Nacht und jetzt auch noch.

Hast Du bei Google die Srechgeschwindigkeit verringert?

Tobias

Ich glaube das man bei Google die Sprechgeschwindigkeit garnicht beeinflussen kann oder ich kenne den Parameter nicht...

Also, nein, habe ich nicht verändert...
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

Ich habe noch ein wenig probiert. Für meinen Text spricht Google 81 s und VoiceRSS 47 s laut Logfile. Die Geschwindigkeit von VoiceRSS hat mich dazu verleitet, zu glauben, Google wäre langsamer geworden.

Man kann den APIkey mit der Geschwindigkeitsangabe erweitern &r=-3 z.B. r=-3 finde ich etwas weniger hektisch.

VoiceRSS spricht die Umlaute so, wie Text2Speech sie sendet, also ae als ae usw. Google spricht ae als ä usw.

Das hier ist keine Lösung:
    $t =~ s/ä/&auml;/g;
    $t =~ s/ö/&ouml;/g;
    $t =~ s/ü/&uuml;/g;
    $t =~ s/Ä/&Auml;/g;
    $t =~ s/Ö/&Ouml;/g;
    $t =~ s/Ü/&Uuml;/g;
    $t =~ s/ß/&szlig;/g;

Auch das Weglassen der Umlautersetzung ist keine Lösung, das mag Google nicht.

Nach einem BlockingCall-Timeout wird die MP3WRAP-Datei, die ihn erzeugt hat, noch zu Ende gespielt.

Schlimbo

Hallo zusammen,

da jeder Text2Speech Aufruf eine mp3 in dem cash Ordner ablegt und der Order mit der Zeit sehr groß wird, habe
ich das Attribut "TTS_CacheFileDir" auf "/tmp" gesetzt, so werden die Dateien bei einen Neustart meines Raspberry's gelöscht.
Das hat auch den Vorteil,  dass bei einem Backup diese,  von Text2Speech angelegt, audio Datein nicht mit gesichert werden,  weil sie sich nicht im FHEM Verzeichnis befinden.
Jetzt wollte aber "TTS_FileMapping" nutzen und die mp3's in einen separaten Verzeichnis ablegen,
dafür gibt es ja das Attribut "TTS_FileTemplateDir" also habe ich es auf "/opt/fhem/audio" gesetzt.
Beim Speicher bekomme ich jedoch die Meldung "Could not create directory: </opt/fhem/audio>"

Habe mir jetzt mal das Modul angesehen und wie es aussieht muss TTS_FileTemplateDir ein Unterordnung  von TTS_CacheFileDir sein:

elsif ($a[2] eq "TTS_FileTemplateDir") {
    unless(-e ($TTS_CacheFileDir ."/". $value) or mkdir ($TTS_CacheFileDir ."/". $value)) {
      #Verzeichnis anlegen gescheitert
      return "Could not create directory: <$value>";
    }


Warum können die beiden Verzeichnis nicht unabhängig von einander gewählt werden, gibt es dafür eine besondere Grund?

Gruß  Schlimbo

Hollo

Ohne die Zeilen 634/635 gibt VoiceRSS nun eine korrekte MP3 zurück.  ;D

Ich würde für die Geschwindigkeitsanpassung und die "Qualität" jeweils einen separaten Parameter spendieren.
Das ist übersichtlicher, als das an den ApiKey zu klatschen.
Vielleicht braucht man das für einen anderen Dienst auch noch mal.

Mit "44khz_16bit_stereo" und "r=-3" macht das erstmal einen guten Eindruck.

Umlaute ist noch problematisch, ebenso englische Begriffe wie "streaming"; da ist die Google-Engine etwas flexibler.
Aber wir sind auf dem richtigen Weg.  :)

P.S.:
Die Idee und den Einwand von Schlimbo finde ich gar nicht schlecht, dass sollten 2 unabhängig voneinander definierbare Verzeichnisse sein.
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

#489
neuer Test,
- Quality und Speed als neuer Parameter
- HeaderInfromationen sind nun raus
- Umlautersetzungen nur noch bei Google
- TTS_FileTemplateDir: Wenn es mit einem / beginnt, dann ist es ein absoluter Pfad, sonst ein Unterodner von TTS_CacheFileDir
- TTS_Timeout (optional) hinzugefügt
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

Google geht wie vorher auch, und VoiceRSS funktioniert, mit Umlauten, Qualität und Sprechgeschwindigkeit. TTS_FileTemplateDir habe ich nicht getestet.

Es besteht weiterhin das Problem bei zu kurzem Timeout, dass nach dem Aufruf von Text2Speech_AbortFn($) eine Variable übrig bleibt. Diese wird nach jedem Abbruch des Blocking Call bei der nächsten Ansage mit dem Text "ARRAY[Adresse des Arrays]" vor dem eigentlichen Text angesagt.
Meine Perl Anfängerkenntnisse reichen leider nicht aus, um den Fehler weiter zu analysieren.

Man kann das umgehen in dem man in der Datei 98_Text2Speech.pm in der Zeile 847 die 60 auf einen Wert größer als die längste vorkommende Ansagedauer setzt. Das müsste bei jedem Update der Datei 98_Text2Speech.pm gemacht werden.

@Tobias: Vielen Dank für die Erweiterung des Moduls. Wärst Du bereit ein Attribut für den Timeoutwert einzubauen, damit ich nicht nach einem Update den Wert ändern muss?




Tobias

Habe in meinem letzten Post noch einen optionalen Timeout eingebaut...
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: Danke für den Einbau des Attributs, natürlich funktioniert es. Ich werde das Modul mal im Wirkbetrieb einsetzen.

Tobias

Wenn jetzt soweit alles in Ordnung, checke ich es morgen oder die nächsten Tage ein...
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

Schlimbo

Hi Tobias,

Danke schon mal für die neue Version, hab gerade etwas damit getestet.
Könnte damit den "TTS_FileTemplateDir" Pfad seperat setzen, jedoch wird beim Versuch eine mp3 abzuspielen
(z.B.: "set myTTS tts :Doorbell:")  nur der Pfad der Datei von der Google Stimme vorgelesen.
Beim Setzt des Attribut "TTS_FileMapping" bekomme ich auch noch die Fehlermeldung:
"file does not exist: </tmp//opt/fhem/audio/Doorbell.mp3>"

Meine Attributes:
TTS_CacheFileDir /tmp
TTS_FileMapping Doorbell:Doorbell.mp3
TTS_FileTemplateDir /opt/fhem/audio

Könntest du das bitte noch mal überprüfen?

Gruß Schlimbo