Neues Modul: Text2Speech

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

Vorheriges Thema - Nächstes Thema

mumpitzstuff

Die Stimme müsste konfigurierbar sein. Für die deutsche Stimme allein gibt es 3 an der Zahl und nicht nur Marlene. Und sobald man eine andere Sprache wünscht, muss man das im Prinzip frei vorgeben können, oder du tippst die gesamte Liste bei dir ins Modul ein:

https://docs.aws.amazon.com/de_de/polly/latest/dg/voicelist.html

mumpitzstuff

Zitat von: Tobias am 22 April 2019, 07:45:23
Bitte prüft mal, ob es jetzt funktioniert. Ist eingecheckt. Ich wollte erst NUR die erine ZEile mit dem Join zurücknehmen, hab mich dann aber doch für den patch entschieden
Ich bin bei mir gerade am umbauen und haben keine TTS Hardware angeschlossen. Deswegen konnte ich die Funktionalität nur ohne Ton in der FHEM WebUI testen

Ich habe alle 4 Kombinationen mit SpeakAsFastAsPossible und Mp3Wrap durchprobiert, jeweils mit leerem Cache und ein weiteres Mal, wo die mp3 Dateinen bereits vorliegen. Alle Varianten funktionieren einwandfrei!

Vielen Dank!

Wzut

@Tobias , ich will die Tage auch mal ran. Gerade auch weil mein SIP Modul ja oft direkt mit T2S zum Einsatz kommt.
Sehe ich das in deiner Doku soweit richtig das du ganz auf die aws Phyton Lösung setzt ohne die von pah bevorzugte Perl Paws Variante ? 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Tobias

Go
Ich nutze die aws cli. Die verwendet imho Python im Hintergrund

Ich habe mir das paws Modul noch nicht angeschaut. Gibts das als Debian Package?


Gesendet von iPhone mit Tapatalk
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

Prof. Dr. Peter Henning

ZitatGibts das als Debian Package

m.E. nicht - es hängen zu viele andere Packages dran. Da muss man den langen Weg über cpan bzw. cpanm gehen. Lohnt sich aber, weil der ganze Python-Overhead wegfällt. Ich habe beides ausprobiert.

LG

pah

Tobias

Bitte testet mal die Amazon Polly Engine im TTS Modul.
Ich habe auf Paws umgestellt.
Es gibt ein neues Attribut: TTS_Language_Custom
Dort kann man einen exakten Language Code reinschreiben. Gilt für alle Engines. zb. bei AWS Polly: George, oder bei Google: de-de
Ist natürlich nur interessant für diegenigen, die die Standard Sprachen und Stimmen die ich ins Modul gebaut habe nicht wollen ;)

Bei Einstellung der TTS_Ressource auf Amazon-Polly wird zuerst geprüft, ob das Paws::Polly installiert ist (cpan paws). Anschließend, ob die credentials in ~/.aws/credentials liegen

https://github.com/tobiasfaust/MyFHEM

2019.04.24 16:54:05 4: TTS_EG_WZ: Auflistung der Textbausteine nach Aufbereitung:
2019.04.24 16:54:05 4: TTS_EG_WZ: 0 => Das ist mein Test Nummer 2.
2019.04.24 16:54:05 4: TTS_EG_WZ: Verwende TTS Spracheinstellung: Deutsch
2019.04.24 16:54:05 4: TTS_EG_WZ: Textbaustein ist keine direkte MP3 Datei, ermittle MD5 CacheNamen: 7c564a078d42029883d0c5f20f1f1f94.mp3
2019.04.24 16:54:06 4: TTS_EG_WZ: Schreibe mp3 in die Datei cache/7c564a078d42029883d0c5f20f1f1f94.mp3 mit 27 Chars
2019.04.24 16:54:06 4: TTS_EG_WZ: Bearbeite jetzt den Text: Das ist mein Test Nummer 2.
2019.04.24 16:54:06 4: TTS_EG_WZ: cache/7c564a078d42029883d0c5f20f1f1f94.mp3 gefunden, kein Download
2019.04.24 16:54:06 4: TTS_EG_WZ: cache/7c564a078d42029883d0c5f20f1f1f94.mp3 hat eine Länge von 2 Sekunden.
2019.04.24 16:54:06 4: TTS_EG_WZ:/usr/bin/mplayer -ao alsa:device=hw=1,0 -really-quiet -nolirc -noconsolecontrols cache/7c564a078d42029883d0c5f20f1f1f94.mp3 >/dev/null
2019.04.24 16:54:08 4: TTS_EG_WZ: Es wurden alle Teile ausgegeben und der Befehl ist abgearbeitet.
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

Hab noch etwas ergänzt für die "play" Fraktion (https://forum.fhem.de/index.php/topic,56523.msg657292.html#msg657292)

Auszug aus der CommandRef
Zitat<li>TTS_MplayerCall<br>
    Optional: Angabe des Systemaufrufes zu Mplayer oder einem anderem Tool. Wird ein anderes Tool als mplayer<br>
    dort verwendet gelten folgende Templates: <br>
    <ul>
        <li>{device}</li>
        <li>{volume}</li>
        <li>{volumeadjust}</li>
        <li>{file}</li>
    </ul>
    Beispiele:<br>
    <code>attr myTTS TTS_MplayerCall sudo /usr/bin/mplayer</code>
    <code>attr myTTS TTS_MplayerCall AUDIODEV={device} play -q -v {volume} {file}</code>
  </li>

bitte die Version in meinem Repo testen. Wenn io pushe ich die versions ins fhem Repo
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

Prof. Dr. Peter Henning

Nachdem da jetzt mein Polly-Code eingeflossen ist, würde ich gerne noch weitere Anregungen geben - denn das Modul scheint mir eine Basis für weitere Entwicklungen zu bieten.

- Umlaute: Google (und Polly) haben eigentlich gar kein Problem mit Umlauten, wenn diese richtig encoded sind.

  use Text::Iconv;
  ...
  #-- we may have problems with umlaut characters
  my $converter = Text::Iconv->new("utf-8", "iso-8859-1");
  my $text = $converter->convert($texti);


- Ausgabe: Für die Ausgabe auf Soundsystemen wäre es schön, wenn der Mechanismus implementiert wäre, den ich in dem Polly-Code auch habe: Kombination des gesamten Audiomaterials in einer Datei mit festem Namen, diese wird in ein bestimmtes Verzeichnis (eines DLNA-Servers...) geschoben, nachdem die vorher dort vorhandene Datei gleichen Namens gelöscht worden ist (Aushebeln des DLNA Caching). Dann müsste eiN Abspielbefehl an ein FHEM-Device übermittelt werden.

- Ausgabe: Für die Ausgabe auf Android-Devices könnte man zusammen mit CoolTux eine Erweiterung des Automagic Flowset bauen, die a.) eine Datei übertträgt und b.) diese dann abspielt.

- Ausgabe: Versand per Instant Messenger, z.B. Telegram.

Ich beteilige mich gerne mit weiteren Codefragmenten.

LG

pah

mr.breil

Finde ich eine super Idee. Sowas suche Ich zurzeit.

Tobias

Zitat von: Prof. Dr. Peter Henning am 25 April 2019, 08:37:46
- Ausgabe: Für die Ausgabe auf Soundsystemen wäre es schön, wenn der Mechanismus implementiert wäre, den ich in dem Polly-Code auch habe: Kombination des gesamten Audiomaterials in einer Datei mit festem Namen, diese wird in ein bestimmtes Verzeichnis (eines DLNA-Servers...) geschoben, nachdem die vorher dort vorhandene Datei gleichen Namens gelöscht worden ist (Aushebeln des DLNA Caching). Dann müsste eiN Abspielbefehl an ein FHEM-Device übermittelt werden.

Hi Pah,
ich könnte mittels Attribut einen festen dateinamen vorgeben. Das setzt aber ein mp3wrap zwingend voraus. Man kann das Zielverzeichnis der Dateien jetzt schon angeben. Man müsste das Zielverzeichnis mit Linux Boardmitteln einmounten und dieses dann im TTS Modul TTS_CachFileDir referenzieren.
Mittels notify kann man auf ein filename event des TTs Moduls reagieren.

Ich würde ungern nice-to-have Sachen reinimplementieren wenn diese über bereits vorhandene Module abgedeckt werden. Ist ja auch eine Komplexitätsfrage ;)
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

mumpitzstuff

Warum muss der Dateiname fest sein? Mit einem Notify kann man doch auf den erzeugten Dateinamen reagieren und diesen abspielen lassen. Dann hat man auch keine Probleme mit Caching. Oder verstehe ich da was falsch?

define TTS_SERVER Text2Speech none
attr TTS_SERVER TTS_Language Deutsch
attr TTS_SERVER TTS_TimeOut 60
attr TTS_SERVER TTS_UseMP3Wrap 1


defmod nty_TTS_SERVER notify TTS_SERVER:lastFilename.* set RADIO_WOHNZIMMER stream $EVTPART1

Das Beispiel spielt jetzt bei mir den Stream z.B. über ein WLAN Radio ab.

Prof. Dr. Peter Henning

ZitatFinde ich eine super Idee. Sowas suche Ich zurzeit.

Was genau? Anleitungen zur Ausgabe auf Android und Audiosystemen habe ich zur Genüge als Auszüge aus dem neuen FHEM-Buch gepostet, damit muss ich etwas zurückhaltend sein, sonst verletze ich meinen Autorenvertrag.

@Tobias: Hmmm.
Zitatnice-to-have
ist das eher nicht - und "löschen plus neu schreiben" statt einfach nur "überschreiben" wären nur 2 Codezeilen im Modul. Dann könnte man durch ein einzelnes Attribut abhaken, welche der beiden Schreibmöglichkeiten für die endgültige Datei gewählt wird.

Betreffend MP3wrap: Ich finde es immer unschön, auf die Betriebssystemebene gehen zu müssen. Der Code vom MP3Wrap ist Open Source, zusammen mit SWIG (siehe https://www.thegeekstuff.com/2012/03/swig-perl-examples/) sollte es einfach sein, ein natives Perl-Modul für MP3Wrap zu bauen.

LG

pah

Prof. Dr. Peter Henning

ZitatWarum muss der Dateiname fest sein?
Bose-Systeme können keine Streams abspielen, die sie über das Netz bekommen. Und die Verbindung über Bluetooth ist mir zu wackelig.

Also hilft hier nur der Umweg über einen DLNA-Server. Es geht aber auch nicht, den jedesmal seinen Index erneuern zu lassen - sondern der muss den Namen der Datei bereits kennen.

Ich habe eine ganze Weile gebraucht, um den letztlich einfachen Weg zum Aushebeln des Caching-Mechanismus beim miniDLNA zu finden.

LG

pah

Wzut

Zitat von: Tobias am 25 April 2019, 09:26:55
Mittels notify kann man auf ein filename event des TTs Moduls reagieren.
Du sprichst hier lastFilename an ?
Es wäre sehr schön wenn das in jedem Fall auch so bleiben würde, da ich das im SIP Modul mittels NOTIFYDEV nutze.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Tobias

#974
"lastfilename" würde ich nicht anfassen.
Falls man wirklich einen festen Dateinamen benötigt sehe ich ein neues Attribut wo man einen Pfad mit Dateinamen angeben kann Diesen kann man nur setzen wenn mp3wrap aktiviert ist. Ist dieser gesetzt wird das EndErgebnis immer in diese Datei geschrieben und "lastfilename" angetriggert.
Das wäre mein Lösungsvorschlag.

zu mp3wrap, ja - ich gebe pah recht das es immer unschön ist auf BS-Ebene zu gehen. Sicher werde ich aber nicht ein mp3wrap PerlModul nur dafür schreiben. Wenn es eines gibt kann ich es nutzen. Wenn nicht, bleibt es auf BS-Ebene
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