Neues Modul: Text2Speech

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

Vorheriges Thema - Nächstes Thema

Tobias

Hi,
ich benötige ein paar Tester für mein neues Text2speech Modul. Es befindet sich noch in einer sehr frühen Entwicklungsphase.
ZurZeit habe ich meine paar Zeilen Text2speech als shellscript realisiert. Allerings kann man damit nur sehr kurze Textpassagen lesen lassen da FHEM währenddessen blockiert wird. Deshalb das Ganze nun als Modul mit NoBlocking Mechanismen.

Ziel ist es, FHEm gesprächig zu machen. Den Status meiner Alarmanlage sowie alle Fenster und Türen vorzulesen, die noch offen sind.
Voraussetzung ist ein installierter mplayer sowie konfigurierte sound-devices in /etc/asound.conf. Genutzt wird der Google Translator. Die Qualität der Übersetzung ist IMHO sehr gut.

Anschließend mit visudo den mplayer für alle aufrufbar machen:
ALL     ALL = NOPASSWD: /usr/bin/mplayer

Aufruf:
define <MyTTS> Text2Speech <Alsa-SoundDevice>

define MyTTS Text2speech hw=0.0

set MyTTS tts Das ist ein Test.
set MyTTS tts Das ist ein Test. Und hier noch ein Test.


Per Attr "TTS_Delemiter" kann man einen Delemiter im Text festlegen, bei dem große Texte getrennt werden können. Der Google Translator lässt maximal 100 Zeichen zu. Ist ein Aufruf länger als 100 Zeichen, wird hart nach 100 Zeichen abgeschnitten.

Läuft der FHEM-Server auf einer anderen Maschine, so ist auf dem FHEM-Server Text2Speech als RemoteDevice anzugeben und der FHEM-Client zur Soundausgabe als AusgabeClient (wie oben angegeben). Wichtig ist, das beide Definitions identisch benannt sind, also denselben Namen haben!
define <MyTTS> Text2Speech host[:port][:SSL] [portpassword]

define MyTTS Text2speech 192.168.178.20:7072 MeinFhemPass

set MyTTS tts Das ist ein Test.


Feedback wäre nicht schlecht ;)

History:
* Das Abspielen auf einem RemoteRechner (zb FHEM läuft auf einem Server, der Lautsprecher ist aber an einem abgesetzten RasPi)
* caching von bereits verwendeten tts-Files -> Attribut: TTS_CacheFileDir (default: cache)
* espeak als neue Ressource hinzugefügt -> Attribut: TTS_Ressource
* set <tts> volume <xx> zum setzen der Lautstärke
* das Teilen eines Satzes wenn dieser länger als 100 Zeichen ist.
* entkoppeln von download und Abspielen der tts-Datei, dadurch flüssigere Sprache von mehreren Sätzen
* Nutzung von MP3WRAP bei Google. Einzelne Satzbausteine werden zu einer mp3-Datei gemerged. Dadurch deutlich flüssigere Sprache -> Attribut: TTS_UseMP3Wrap

ToDo:
<leer.... alles abgearbeitet>

Jetzt gibts auch einen Wiki Eintrag: http://www.fhemwiki.de/wiki/Text2Speech
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

Rince

Hi Tobi,

ich hatte mich die letzten Tage auch damit beschäftigt :)
Daher was ich noch so im Kopf habe, vielleicht gefällt dir das ein oder andere davon:

Googles 100 Zeichen Limit umgehen:
http://danfountain.com/2013/03/raspberry-pi-text-to-speech/

Weiterhin ein oder zwei Offline Lösungen:
http://elinux.org/RPi_Text_to_Speech_(Speech_Synthesis)


Ein zusätzlicher Parameter um zwischen den Engines auswählen zu können wäre großartig.
Letztlich sind es ja nur verschiedene Shell Skripte :)


Dann habe ich mir überlegt, wie man das auch für FritzBox User nutzbar macht:
Ich glaube, man bekommt den mplayer recht einfach dazu, den Text nicht zu sprechen, sondern in eine Datei zu schreiben. Am besten in /temp, das idealerweise auf ner Ramdisk liegen sollte.

Damit könnte ein notify dafür sorgen, dass dieses wav File nun zu einem Sounddevice weitergeleitet wird. Oder besser, ein SOAP Request könnte ausgelöst werden und das Renderdevice eigener Wahl das File abspielen.
Aber das ist eine andere Geschichte.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Tobias

#2
Hi Rince,
die 100 Zeichen Begrenzung von Google habe ich genauso umgangen indem ich den Text in einzelne Sätze zerlege. Ich habe mich im ersten Schritt für die ZErlegung in Sätze entschieden weil bei einzelnen Wörtern der Satz ziemlich abgehackt klingt.
Auf der ToDo Liste steht noch: (siehe erstes Post)
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

Steffen

#3
Zitat von: Tobias am 07 Januar 2014, 12:57:23
Anschließend mit visudo den mplayer für alle aufrufbar machen:
ALL     ALL = NOPASSWD: /usr/bin/mplayer

Aufruf:
define <MyTTS> Text2Speech <Alsa-SoundDevice>

define MyTTS Text2speech hw=0.0

set MyTTS tts Das ist ein Test.
set MyTTS tts Das ist ein Test. Und hier noch ein Test.


Per Attr "TTS_Delemiter" kann man einen Delemiter im Text festlegen, bei dem große Texte getrennt werden können. Der Google Translator lässt maximal 100 Zeichen zu. Ist ein Aufruf länger als 100 Zeichen, wird hart nach 100 Zeichen abgeschnitten.

Feedback wäre nicht schlecht ;)

Hallo!

Würde es auch gerne Testen doch leider bleibt mein Rpi stumm bei "set MyTTS tts Das ist ein Test"
Mplayer ist installiert und Audio Test direkt auf RPI klappt mit Soundausgabe über Klinkenlautsprecher,
aber meine "/etc/asound.conf" ist leer, was müsste ich da eintragen??

pi@raspberrypi ~ $ aplay -l
**** Liste der Hardware-Geräte (PLAYBACK) ****
Karte 0: ALSA [bcm2835 ALSA], Gerät 0: bcm2835 ALSA [bcm2835 ALSA]
  Sub-Geräte: 8/8
  Sub-Gerät #0: subdevice #0
  Sub-Gerät #1: subdevice #1
  Sub-Gerät #2: subdevice #2
  Sub-Gerät #3: subdevice #3
  Sub-Gerät #4: subdevice #4
  Sub-Gerät #5: subdevice #5
  Sub-Gerät #6: subdevice #6
  Sub-Gerät #7: subdevice #7


pi@raspberrypi ~ $ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device


Mfg Steffen

Tobias

#4
zb:
pcm.!default {
        type hw
        card 0
        device 0
}


Wenn du es wie oben das Modul mit hw=0.0 angibst, sollte es funktionieren. Ansonsten mach mal "verbose 5" für dieses Modul und aktualisiere bitte nochmal das Modul aus dem ersten Post. Schau mal bitte dann im Log nach, da steht der abgesetzte Aufruf drin. Funktioniert dieser in der shell?
zb:
sudo /usr/bin/mplayer -ao alsa:device=hw=0.0  -nolirc -noconsolecontrols "http://translate.google.com/translate_tts?tl=de&q=test nochmal"

Bei mir hängt am FHEM-Server eine Terratec Aureon MKII USB-Soundkarte. Mit dieser funktioniert es problemlos....
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

Nochmals aktualisiert!

Text2Speech ist nun Remote fähig. Das heißt der Lautsprecher kann an einen abgesetzten Raspi mit FHEM und der FHEM-Server steuert diesen per Remote-Call.

Szenario wenn der Server im Keller steht, die Sprachausgabe aber im Obergeschoss im Wohnzimmer erfolgen soll ;)
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

Steffen

#6
Zitat von: Tobias am 08 Januar 2014, 08:34:46
zb:
pcm.!default {
        type hw
        card 0
        device 0
}


Wenn du es wie oben das Modul mit hw=0.0 angibst, sollte es funktionieren. Ansonsten mach mal "verbose 5" für dieses Modul und aktualisiere bitte nochmal das Modul aus dem ersten Post. Schau mal bitte dann im Log nach, da steht der abgesetzte Aufruf drin. Funktioniert dieser in der shell?
zb:
sudo /usr/bin/mplayer -ao alsa:device=hw=0.0  -nolirc -noconsolecontrols "http://translate.google.com/translate_tts?tl=de&q=test nochmal"

Bei mir hängt am FHEM-Server eine Terratec Aureon MKII USB-Soundkarte. Mit dieser funktioniert es problemlos....

Ok, danke habe es...es war noch nicht eingetragen:ALL     ALL = NOPASSWD: /usr/bin/mplayer,
obwohl ich es eingetragen hatte aber irgendwie nicht abgespeichert wurde(Der F30 Fehler) ;)!

Danke für die tolle Hilfe, werde jetzt erstmal ein wenig Testen und dann Feedback geben!

Mfg Steffen

Rince

Sodala, hier Feedback:

Erst mal vielen Dank :)

Es scheint so, als könne die Dame entweder keine Umlaute vorlesen, oder sie hat eine Abneigung gegen das Alte Testament ;)

ZitatIm Anfang schuf Gott Himmel und Erde. die Erde aber war wüst und wirr, Finsternis lag über der Urflut und Gottes Geist schwebte über dem Wasser. Gott sprach. Es werde Licht. Und es wurde Licht. Gott sah, dass das Licht gut war. Gott schied das Licht von der Finsternis und Gott nannte das Licht Tag und die Finsternis nannte er Nacht. Es wurde Abend und es wurde Morgen: erster Tag. Dann sprach Gott: Ein Gewölbe entstehe mitten im Wasser und scheide Wasser von Wasser.

Halte ersteres für warscheinlich :)

Davon mal abgesehen, hat es aber tapfer den ganzen Text vorgelesen.


Dann habe ich den Delemiter ausprobiert.

Nun kommen wir noch genau bis zur Urflut, bzw. bis zu Urf (der Rest ist weg).
Egal ob ich den Delemiter auf 0 oder 1 setze, nach Urf ist schluss.

Was mir ansonsten noch auffällt:
Die Trennung des Textes nach Punkten ist schon nicht schlecht, aber schneidet im Zweifel einfach Satzteile weg.

Mal ein Blick ins Logfile:
Zitat2014.01.09 07:42:32.740 4: Text2Speech:sudo /usr/bin/mplayer -ao alsa:device=hw=0.0  -nolirc -noconsolecontrols "http://translate.google.com/translate_tts?tl=de&q= Gott schied das Licht von der Finsternis und Gott nannte das Licht Tag und die Finsternis nannte er"
2014.01.09 07:42:40.999 4: Text2Speech:sudo /usr/bin/mplayer -ao alsa:device=hw=0.0  -nolirc -noconsolecontrols "http://translate.google.com/translate_tts?tl=de&q= Es wurde Abend und es wurde Morgen: erster Tag."

Daher würde ich zwei Erweiterungen vorschlagen:
Nicht nur nach Sätzen trennen, sondern anschließend nochmal die Zeichen zählen. Wenn das zuviele sind, auch auf ; und , reagieren, und, wenn das nicht ausreicht, auch "und" als Trenner benutzen. Also vor dem "und"

Damit müsste man einen passablen Sprechrythmus beibehalten können.


Aber danke, es funktioniert schon gar nicht schlecht. Die Umlaute stehen übrigens im Logfile richtig drin.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Tobias

#8
Danke für den Test...
Der Delemiter ist nicht 0 oder 1 sondern ein Trennzeichen. Default ist er "." (ohne Hochkommata)

Die Trennung nehm ich als Verfeinerung in meine ToDoListe auf...
Als erstes steht die Trennung Download/Sprachausgabe an um die unschönen Nachdenk-Sekunden wegzubekommen

Edit: wenn ich mir den Response so anschaue scheinen nicht viel Interesse an einer Sprachausgabe zu haben... ;)
Gerade im Hinblick auf andere kommerzielle Offline-Lösungen bin ich auf Zuarbeit und Patches angewiesen...
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

Rince

Danke für die Erklärung :)

Ich kann kein Perl, sonst hätte ich schon längst versucht so ein Modul zu schreiben. Daher kann ich mit Patches nicht weiterhelfen.
Ich kann nur testen.

Für meinen Teil möchte ich die Sprachausgabe nicht mehr missen.

Aber ich denke nach wie vor, dass einige eine Offline Lösung bevorzugen würden. Ich setze es mal auf meinem RasPi auf und schreibe dir wie es geht, dann kannst du es vermutlich relativ leicht einbauen.
Per attr die Art der Ausgabe wählen. Dann könnte man einfach mehr TTS Geräte definieren, die jeweils mit verschiedenen Stimmen sprechen. FHEM wird schizophren :)


Eine Bitte:
Wenn du downloaden lässt, kannst du bitte in /tmp speichern lassen?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Tobias

Das Downloadverzeichnis ist per Attr einstellbar.

Diese eine Offlinelösung für den Raspi die 30$ kostet hat sich ganz gut angehört... werde ich mir aber bestimmt nicht bestellen um nur zu testen ;)
Bin mit der Google-Lösung zufrieden.

Was spricht denn gegen die Online-Google-Lösung?
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

Rince

Hi,
bin grad am basteln mit kostenlosen Offline Lösungen.

Was gegen online spricht?
Nun für mich persönlich wenig, ich finde die Google Tante toll, abgesehen davon, dass man ihr keine Emotionen beibringen kann.

Andererseits gibt es Nachteile:
Wenn offline, geht nix
Wenn langsames Internet, dauert es länger
Wer keine unbegrentzte Flat hat, braucht Volumen
Nicht jeder will Google seine ganzen Ansagen anvertrauen


Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

Eine Offline Lösung in die Sekunden einsetzbar ist:
sudo apt-get install espeak

Losplappern tut die Tante zum Beispiel:
espeak -vde+f3 -k5 -s150 "Hallo lieber User, ich bin eine gräßliche Stimme deiner freundlichen Hausautomatisierung"

(gibt auf der Konsole auch viele Fehlermeldungen vom mplayer, aber ansonsten läuft es)

Ich möchte aber vorwarnen:
Kein Vergleich zu Google :)

-vde wählt die deutsche Stimme
f3 steht für female 3, m ist demnach male, und mit der Zahl kann man experimentieren
s150 ist die Sprechrate, ein recht angenehmer Wert
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Strippenzieher

Jetzt auch mal was geschrieben ...

Ich verfolge deinen/euren Thread schon einige Tage, leider kann ich das Modul nicht testen, da mein Fhem (noch) nur auf einer Fritte läuft.
Ich würde es aber sehr begrüßen, wenn du/ihr weiter daran rum feilt ...

MFG Chris

Tobias

Zitat von: Strippenzieher am 09 Januar 2014, 14:04:44
Jetzt auch mal was geschrieben ...

Ich verfolge deinen/euren Thread schon einige Tage, leider kann ich das Modul nicht testen, da mein Fhem (noch) nur auf einer Fritte läuft.
Ich würde es aber sehr begrüßen, wenn du/ihr weiter daran rum feilt ...

MFG Chris
Zumindest der Remote-Teil sollte auf der Fritte laufen ;)
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