Text2Speech: Unterschied zwischen den Versionen
(→Links) |
|||
(23 dazwischenliegende Versionen von 9 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Infobox Modul | {{Infobox Modul | ||
|ModPurpose=Sprachausgabe über | |ModPurpose=Sprachausgabe über FHEM | ||
|ModType= | |ModType=h | ||
|ModForumArea=Unterstützende Dienste | |ModForumArea=Unterstützende Dienste | ||
|ModTechName=98_Text2Speech.pm | |ModTechName=98_Text2Speech.pm | ||
|ModOwner=tobiasfaust ( | |ModOwner=tobiasfaust ({{Link2FU|118|Forum}} / [[Benutzer_Diskussion:Tobias.faust|Wiki]]) | ||
}} | }} | ||
Das Modul [[Text2Speech]] ermöglicht es, eine Sprachausgabe über FHEM zu realisieren. Das Modul ist Client-Server-fähig. | Das Modul [[Text2Speech]] ermöglicht es, eine Sprachausgabe über FHEM zu realisieren. Das Modul ist Client-Server-fähig. Einzelne Sprachbausteine werden zwischengespeichert damit diese bei erneutem Gebrauch nicht noch einmal nachgeladen werden müssen um somit einen flüssigen Spachfluss zu gewährleisten. | ||
==Text2Speech Sprachengines== | |||
Die Default Sprachengine ist Google mit deutscher, weiblicher Stimme. | |||
Die Sprachengines Amazon Polly, Google und VoiceRSS sind OnlineSysteme die eine Internetverbindung voraussetzen. Die Sprachengines ESpeak und SVOX-Pico sind lokal installierte Sprachengines die keine Internetverbindung benötigen. | |||
Als Empfehlung kann kann folgende Liste mit absteigender Sprachqualität eine Hilfestellung bieten: | |||
* Amazon Polly | |||
* Google | |||
* VoiceRSS/ESpeak/SVOX-Pico | |||
Die Sprachengine "Amazon Polly" ist kostenpflichtig. In den ersten 12 Monaten sind 5Mio Zeichen kostenlos, danach kosten 1Mio Zeichen 4US$ (Stand Februar 2021): [https://aws.amazon.com/de/polly/pricing/ Amazon Polly Pricing] | |||
==Definition Lokale Architektur== | ==Definition Lokale Architektur== | ||
===Abhängigkeiten Installationspakete=== | |||
:<code>sudo apt-get install | Egal welche Sprachengine verwendet werden soll müssen folgende Pakete installiert sein: | ||
* IO::File | |||
* Digest::MD5 | |||
* URI::Escape | |||
* Text::Iconv | |||
* Encode::Guess | |||
* MP3::Info | |||
* mp3wrap (Empfohlen, aber optional, wird über das Attribut TTS_UseMp3Wrap aktiviert) | |||
<syntaxhighlight lang="bash"> | |||
sudo apt-get install libdigest-perl-md5-perl libany-uri-escape-perl libtext-iconv-perl libencode-perl libmp3-info-perl mp3wrap | |||
</syntaxhighlight> | |||
===zusätzliche Abhängigkeiten von Espeak=== | |||
<syntaxhighlight lang="bash">sudo apt-get install lame espeak</syntaxhighlight> | |||
===zusätzliche Abhängigkeiten von SVOX-pico=== | |||
<syntaxhighlight lang="bash">sudo apt-get install lame libttspico-utils</syntaxhighlight> | |||
Für ARM/Raspbian sind die <code>libttspico-utils</code> leider nicht verfügbar, deswegen müsste man diese selbst kompilieren oder das vorkompilierte Paket aus [http://www.robotnet.de/2014/03/20/sprich-freund-und-tritt-ein-sprachausgabe-fur-den-rasberry-pi/ dieser Anleitung] verwenden, folgend in aller Kürze: | |||
<syntaxhighlight lang="bash"> | |||
sudo apt-get install libpopt-dev | |||
cd /tmp | |||
wget http://www.dr-bischoff.de/raspi/pico2wave.deb | |||
sudo dpkg --install pico2wave.deb | |||
</syntaxhighlight> | |||
===zusätzliche Abhängigkeiten von Amazon Polly=== | |||
* Paws::Polly | |||
<syntaxhighlight lang="bash"> | |||
sudo cpan Paws | |||
</syntaxhighlight> | |||
Die Zugangsdaten zum eigenen AWS Konto müssen unter ~/.aws/credentials liegen. | |||
<syntaxhighlight lang="bash"> | |||
[default] | |||
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxx | |||
aws_access_key_id = xxxxxxxxxxxxxxx | |||
</syntaxhighlight> | |||
Die Zugangsdaten erhält man in dem man im AWS Konto eine IAM Gruppe mit einem PollyRead Profile erstellt und diese Gruppe eine neuen User zuweist. | |||
Nach Anlegen des Users erhält man einmalig(!) das Schlüsselpaar. | |||
==allgemeine Konfiguration== | |||
Relevant für die korrekte SprachEngine sind die folgenden Attribute: | |||
* TTS_Ressource | |||
* TTS_Language '''oder''' TTS_Language_Custom | |||
Mit <code>aplay -l</code> kann man eine Liste der möglichen Audio Ausgabedevices erhalten. Von dem gewünschten Ausgabedevice ermittelt man nun die Kartennummer und das Subdevice. | |||
Neben dem Audio Equipment gibt es zwei Voraussetzungen im System: | |||
* Der User fhem muss Berechtigung haben Sound auszugeben und | |||
< | * es muss ein Player installiert sein. | ||
<syntaxhighlight lang="bash">sudo usermod -aG audio fhem</syntaxhighlight> | |||
Nach dieser Änderung muss sich der Benutzer neu anmelden! Ein Neustart von FHEM oder dem System ist notwendig! | |||
Test2Speech wurde ursprünglich für mplayer entwickelt: | |||
<syntaxhighlight lang="bash">sudo apt-get install mplayer</syntaxhighlight> | |||
Damit mplayer ohne sudo aufgerufen wird muss das Attribute <code>TTS_MplayerCall </code> gesetzt werden. Wird das weggelassen muss [[FHEM_mit_sudo|fhem sudo Berechtigung]] bekommen. | |||
<syntaxhighlight lang="perl">define MyTTS Text2Speech hw=0.0 | |||
attr MyTTS TTS_MplayerCall /usr/bin/mplayer</syntaxhighlight> | |||
Das Programm mplayer hat auf einigen Systemen sehr große Verzögerungen beim Start, als '''Alternative''' ist z.B. play verwendbar | |||
<syntaxhighlight lang="bash">sudo apt-get install sox libsox-fmt-all</syntaxhighlight> | |||
Die Definition muss in der Bezeichnung das Audiogerätes und im Attribute <code>TTS_MplayerCall </code> so aussehen (Mindestens Version 19378 2019-05-12 erforderlich). | |||
<syntaxhighlight lang="perl">define MyTTS Text2Speech hw:0,0 | |||
attr MyTTS TTS_MplayerCall AUDIODEV={device} /usr/bin/play -q -v $(({volume}*{volumeadjust}/10000)).$(({volume}*{volumeadjust}%10000)) {file}</syntaxhighlight> | |||
Bei wiederholten Sprachbausteinen wird durch die Verwendung von MP3Wrap eine deutlich flüssigere Sprachausgabe erreicht. Für die Verwendung von Kombinationen aus fertigen mp3 Files und Texten in der Art "Text:bing.mp3:Text" ist dies zwingend notwendig. | |||
<syntaxhighlight lang="bash">sudo apt-get install mp3wrap</syntaxhighlight> | |||
Als Ergänzung die Definition ein Attribute <code>TTS_UseMP3Wrap</code> : | |||
< | <syntaxhighlight lang="perl">attr MyTTS TTS_UseMP3Wrap 1 | ||
attr MyTTS verbose 4</syntaxhighlight> | |||
</ | |||
Ein erster Test kann wie folgt durchgeführt werden (als Einzeiler, ohne Zeilenumbruch einzugeben): | Ein erster Test kann wie folgt durchgeführt werden (als Einzeiler, ohne Zeilenumbruch einzugeben): | ||
:<code> set MyTTS tts Das ist ein Test. Jetzt prüfen wir, ob wir etwas aus dem angeschlossenen Lautsprecher hören. Beim ersten Mal haben wir allerdings noch Sprechpausen. Spätestens beim zweiten Durchlauf ist der Textfluss flüssiger.</code> | :<code> set MyTTS tts Das ist ein Test. Jetzt prüfen wir, ob wir etwas aus dem angeschlossenen Lautsprecher hören. Beim ersten Mal haben wir allerdings noch Sprechpausen. Spätestens beim zweiten Durchlauf ist der Textfluss flüssiger.</code> | ||
Hört man etwas aus dem Lautsprecher, so führen wir das Kommando ein zweites Mal aus. Jetzt sollte es sich besser anhören. Bleiben die Lautsprecher stumm, so ist das | Hört man etwas aus dem Lautsprecher, so führen wir das Kommando ein zweites Mal aus. Jetzt sollte es sich besser anhören. Bleiben die Lautsprecher stumm, so ist das FHEM-Log zu kontrollieren. Gegebenenfalls ist das [[verbose]]-Level auf 5 zu stellen. | ||
War der Test erfolgreich, kann das verbose-Attribut wieder gelöscht werden. | War der Test erfolgreich, kann das verbose-Attribut wieder gelöscht werden. | ||
==Definition Client-Server Architektur== | ==Definition Client-Server Architektur== | ||
Es gibt Installationen, bei denen der FHEM-Server z.B. im Keller steht, die Sprachausgabe soll aber räumlich entfernt stattfinden, z.B. im Wohnzimmer. Hierzu ist am Zielort eine FHEM-Instanz anzulegen, z.B. über einen [[Raspberry Pi]], IP: 192.168.178.10. | Es gibt Installationen, bei denen der FHEM-Server z.B. im Keller steht, die Sprachausgabe soll aber räumlich entfernt stattfinden, z.B. im Wohnzimmer. Hierzu ist am Zielort eine FHEM-Instanz anzulegen, z.B. über einen [[Raspberry Pi]], IP: 192.168.178.10. | ||
Auf dem FHEM-Server ist Text2Speech als Remote zu definieren: | Auf dem FHEM-Server ist Text2Speech als Remote zu definieren: | ||
define MyTTS Text2Speech 192.168.178.10:7072 | define MyTTS Text2Speech 192.168.178.10:7072 <Passwort>; | ||
attr Text2Speech room Text2Speech; | attr Text2Speech room Text2Speech; | ||
Am Zielort ist Text2Speech auf dem Raspi wie folgt zu definieren: | Am Zielort ist Text2Speech auf dem Raspi wie folgt zu definieren: | ||
define MyTTS Text2Speech hw=0.0; | define MyTTS Text2Speech hw=0.0; | ||
attr MyTTS room Text2Speech; | attr MyTTS room Text2Speech; | ||
attr MyTTS TTS_UseMP3Wrap 1; | attr MyTTS TTS_UseMP3Wrap 1; | ||
attr MyTTS verbose 4; | attr MyTTS verbose 4; | ||
Der Passwort Zugang ist entsprechend der {{Link2CmdRef|Anker=allowed}} zu definieren. | |||
Bitte die Installation von Mplayer und Mp3Wrap nicht vergessen! | Bitte die Installation von Mplayer und Mp3Wrap nicht vergessen! | ||
Danach der Test wie oben angegeben. | Danach der Test wie oben angegeben. | ||
==Sprachausgabe per Bluetooth-Lautsprecher unter Raspbian Jessie== | |||
Für die Sprachausgabe über Bluetooth bieten sich verschiedene Lautsprecher an. Wichtig ist jedoch, dass diese entweder gar nicht in einen Standby Modus wechseln oder aber über Bluetooth aus dem Standby aufgeweckt werden können. Folgende Lautsprecher sollen laut Internetrecherche funktionieren: | |||
* Creative D80/D100/D200 | |||
* Sony Soundbar HT-XT3 | |||
* Panasonic SC-ALL6EG-W / SC-NE1 | |||
* Bose Soundtouch 10 | |||
* Bose Soundlink Mini II | |||
* B&O Beoplay S3 | |||
* JBL Charge 2+/3 | |||
* LG Art 51 | |||
* UE Roll | |||
* Energy PowerBar Elite | |||
* Teufel Cinebar 11 | |||
Die folgenden Schritte müssen nacheinander durchgeführt werden, um auf einem aktuellen Jessie System Audio Inhalte über Bluetooth zu streamen: | |||
'''1.''' USB-Bluetooth-Stick verbinden | |||
und per ''lsusb'' prüfen, ob der Stick erkannt wurde. | |||
'''2.''' System aktualisieren und notwendige Pakete installieren | |||
sudo apt-get update | |||
sudo apt-get upgrade | |||
sudo apt-get install alsa-utils bluez bluez-tools pulseaudio-module-bluetooth python-gobject python-gobject-2 | |||
sudo reboot | |||
'''3.''' Benutzer pi zur PulseAudio Gruppe hinzufügen | |||
sudo usermod -a -G lp pi | |||
sudo usermod -a -G pulse-access,audio root | |||
sudo adduser pi pulse-access | |||
'''4.''' Datei daemon.conf von PulseAudio anpassen | |||
sudo nano /etc/pulse/daemon.conf | |||
Nach folgender Zeile suchen | |||
; resample-method = speex-float-1 | |||
und wie folgt erweitern | |||
; resample-method = speex-float-1 | |||
resample-method = trivial | |||
und | |||
; system-instance = no | |||
system-instance = yes | |||
speichern und schliessen | |||
'''5.''' In PulseAudio müssen jetzt zusätzliche Module geladen werden | |||
sudo nano /etc/pulse/system.pa | |||
am Ende der Datei folgendes hinzufügen | |||
.ifexists module-bluetooth-policy.so | |||
load-module module-bluetooth-policy | |||
.endif | |||
.ifexists module-bluetooth-discover.so | |||
load-module module-bluetooth-discover | |||
.endif | |||
speichern und schliessen | |||
'''6.''' Jetzt müssen wir dafür sorgen, dass PulseAudio automatisch geladen wird | |||
sudo nano /etc/systemd/system/pulseaudio.service | |||
und folgenden Inhalt einfügen | |||
[Unit] | |||
Description=PulseAudio Sound System | |||
Before=sound.target | |||
[Service] | |||
BusName=org.pulseaudio.Server | |||
ExecStart=/usr/bin/pulseaudio | |||
Restart=always | |||
[Install] | |||
WantedBy=multi-user.target | |||
speichern und schliessen | |||
'''7.''' Danach müssen wir PulseAudio neu starten | |||
sudo systemctl daemon-reload | |||
sudo systemctl enable pulseaudio.service | |||
sudo systemctl start pulseaudio.service | |||
'''8.''' Prüfen ob PulseAudio läuft | |||
systemctl status pulseaudio | |||
'''9.''' Jetzt den Audio Output einstellen: X entweder mit 0 (auto), 1 (3,5mm Klinke) oder 2 (HDMI) ersetzen. | |||
sudo amixer cset numid=3 X | |||
'''10.''' Die Lautstärke kann auf 100% gesetzt werden mit | |||
sudo amixer set Master 100% | |||
sudo pacmd set-sink-volume 0 65535 | |||
'''11.''' Soundausgabe z.B. über Kopfhörer prüfen | |||
paplay /usr/share/sounds/alsa/Front_Left.wav | |||
'''12.''' Jetzt können wir mit der Einrichtung von Bluetooth beginnen | |||
sudo nano /etc/bluetooth/audio.conf | |||
und folgendes einfügen | |||
[General] | |||
Enable=Source,Sink,Headset,Gateway,Control,Media,Socket | |||
HFP=true | |||
Class=0x20041C | |||
speichern und schliessen | |||
sudo nano /etc/bluetooth/main.conf | |||
unter [General] folgendes einfügen | |||
Name = RaspStream | |||
Class = 0x20041C | |||
speichern und schliessen | |||
sudo hciconfig -a | |||
eingeben und die MAC Adresse des Bluetooth Dongles aufschreiben | |||
Jetzt müssen die Bluetooth Settings angepasst werden (XX:XX:XX:XX:XX:XX steht für die MAC Adresse des Bluetooth Dongles) | |||
sudo nano /var/lib/bluetooth/XX:XX:XX:XX:XX:XX/settings | |||
einngeben und folgendes einfügen | |||
[General] | |||
Discoverable=true | |||
Alias=RaspStream | |||
Class=0x20041C | |||
speichern und schliessen | |||
Jetzt muss der Raspberry wieder neu gestartet werden | |||
sudo reboot | |||
'''13.''' Jetzt können Bluetooth Dongle und Bluetooth Lautsprecher gepaired werden | |||
bluetoothctl | |||
und folgende Befehle nacheinander eingeben | |||
agent on | |||
default-agent | |||
discoverable on | |||
scan on | |||
der Bluetooth Lautsprecher sollte jetzt irgendwann aufgelistet werden und kann dann gepaired werden mit | |||
pair XX:XX:XX:XX:XX:XX | |||
trust XX:XX:XX:XX:XX:XX | |||
Bluetooth console verlassen mit | |||
quit | |||
Damit sollte die Einrichtung abgeschlossen sein und wir können überprüfen, ob wir etwas über Bluetooth ausgeben können | |||
mplayer -ao pulse http://stream01.iloveradio.de/iloveradio1.mp3 | |||
'''14.''' Das Modul Text2Speech sollte dann mit 'default' angelegt werden | |||
define TTS Text2Speech default | |||
==Sprachausgabe per Bluetooth-Lautsprecher== | ==Sprachausgabe per Bluetooth-Lautsprecher== | ||
{{Randnotiz|RNTyp=Info|RNText=Dieser Abschnitt | {{Randnotiz|RNTyp=Info|RNText=Dieser Abschnitt repräsentiert nicht den aktuellen Stand. Bezüglich Verbindung, Neustart alsa und dem Testbeispiel am Ende muss er überarbeitet werden}} | ||
Es ist ebenfalls möglich die Sprachausgabe nicht über einen direkt per Kabel angeschlossenen Lautsprecher auszugeben, sondern per Bluetooth an einen oder mehrere Bluetooth-Lautsprecher. Der Test2Speech-Author verwendet einen CreativeD80. | Es ist ebenfalls möglich die Sprachausgabe nicht über einen direkt per Kabel angeschlossenen Lautsprecher auszugeben, sondern per Bluetooth an einen oder mehrere Bluetooth-Lautsprecher. Der Test2Speech-Author verwendet einen CreativeD80. | ||
Dabei ist auf dem Client mit der lokal eingerichteten Text2Speech-Instanz folgendes vorzunehmen: | Dabei ist auf dem Client mit der lokal eingerichteten Text2Speech-Instanz folgendes vorzunehmen: | ||
Zeile 144: | Zeile 322: | ||
{{Randnotiz|RNTyp=Fehl|RNText=Dieses Beispiel geht allein wegen der ständigen Änderung bei Google nicht. Auch stimmt das Ausgabe Gerät nicht. Man könnte so testen :<code>mplayer -ao alsa:device=bluetooth http://1live-diggi.akacast.akamaistream.net/7/965/119435/v1/gnl.akacast.akamaistream.net/1live-diggi</code>}} | {{Randnotiz|RNTyp=Fehl|RNText=Dieses Beispiel geht allein wegen der ständigen Änderung bei Google nicht. Auch stimmt das Ausgabe Gerät nicht. Man könnte so testen :<code>mplayer -ao alsa:device=bluetooth http://1live-diggi.akacast.akamaistream.net/7/965/119435/v1/gnl.akacast.akamaistream.net/1live-diggi</code>}} | ||
:<code>mplayer -ao alsa:device=hw=0.0 -nolirc -noconsolecontrols -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=Das ist ein Test.";</code> | :<code>mplayer -ao alsa:device=hw=0.0 -nolirc -noconsolecontrols -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=Das ist ein Test.";</code> | ||
== Problembehandlung == | |||
=== Beim abspielen via Bluetooth "stottert" die Wiedergabe === | |||
Das Problem tritt im Zusammenhang mit der verwendeten Abspielsoftware ab. Aus nicht nachvollziehbaren Gründen harmoniert die Kombination Bluetooth und Mplayer nicht immer perfekt. Lösung hierfür ist, anstelle mit Mplayer mit VLC zu arbeiten. | |||
Hierfür legt man ein Skript z.B. mit dem Namen /opt/bin/vlc-wrapper.sh an mit folgendem Inhalt: | |||
<pre>#!/bin/bash | |||
cvlc -A alsa --alsa-audio-device bluealsa --quiet --no-interact --play-and-exit $1</pre> | |||
Der Teil <pre>-A alsa --alsa-audio-device bluealsa</pre> kann ggf. weggelassen werden, wenn die Ausgabe nicht gezielt auf einem bestimmten Audiogerät erfolgen soll. | |||
Anschließend muss die Ausgabe von Text2Speech noch auf das Skript umgeleitet werden mit folgendem Befehl in FHEM:<pre>attr myTTS TTS_MplayerCall /opt/bin/vlc-wrapper.sh</pre> | |||
=== MickyMaus-artiger Sound === | |||
Das Problem tritt auf, wenn man per mp3wrap mehrere mp3 Files zusammenzieht die eine unterschiedliche Auflösung haben. | |||
== Links == | == Links == | ||
* Vorstellung und Diskussion des Moduls im | * Vorstellung und Diskussion des Moduls im {{Link2Forum|Topic=18481|LinkText=FHEM Forum}} | ||
* [[Wetter_vorlesen_lassen|Code Snippets: Wetter vorlesen lassen]] | * [[Wetter_vorlesen_lassen|Code Snippets: Wetter vorlesen lassen]] | ||
* [https://aubreykloppers.wordpress.com/2015/06/25/bluetooth-speaker-raspberry-pi-the-ultimate-guide/ weitere Guideline für Bluetooth per Rasperry Pi] | * [https://aubreykloppers.wordpress.com/2015/06/25/bluetooth-speaker-raspberry-pi-the-ultimate-guide/ weitere Guideline für Bluetooth per Rasperry Pi] | ||
* [https://www.alefo.de/bluetooth-lautsprecher-und-adapter-f63/liste-kompatibler-bt-lautsprecher-fuer-amazon-dot-t907.html Liste von Bluetooth Lautsprechern] | |||
* [http://www.forum-raspberrypi.de/Thread-tutorial-bluetooth-audio-streaming-mit-a2dp-raspbian-jessie Bluetooth einrichten mit Raspbian Jessie] | |||
[[Kategorie:Akustische Ausgabe]] |
Aktuelle Version vom 10. Juni 2021, 08:17 Uhr
Text2Speech | |
---|---|
Zweck / Funktion | |
Sprachausgabe über FHEM | |
Allgemein | |
Typ | Hilfsmodul |
Details | |
Dokumentation | EN / DE |
Support (Forum) | Unterstützende Dienste |
Modulname | 98_Text2Speech.pm |
Ersteller | tobiasfaust (Forum / Wiki) |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
Das Modul Text2Speech ermöglicht es, eine Sprachausgabe über FHEM zu realisieren. Das Modul ist Client-Server-fähig. Einzelne Sprachbausteine werden zwischengespeichert damit diese bei erneutem Gebrauch nicht noch einmal nachgeladen werden müssen um somit einen flüssigen Spachfluss zu gewährleisten.
Text2Speech Sprachengines
Die Default Sprachengine ist Google mit deutscher, weiblicher Stimme.
Die Sprachengines Amazon Polly, Google und VoiceRSS sind OnlineSysteme die eine Internetverbindung voraussetzen. Die Sprachengines ESpeak und SVOX-Pico sind lokal installierte Sprachengines die keine Internetverbindung benötigen.
Als Empfehlung kann kann folgende Liste mit absteigender Sprachqualität eine Hilfestellung bieten:
- Amazon Polly
- VoiceRSS/ESpeak/SVOX-Pico
Die Sprachengine "Amazon Polly" ist kostenpflichtig. In den ersten 12 Monaten sind 5Mio Zeichen kostenlos, danach kosten 1Mio Zeichen 4US$ (Stand Februar 2021): Amazon Polly Pricing
Definition Lokale Architektur
Abhängigkeiten Installationspakete
Egal welche Sprachengine verwendet werden soll müssen folgende Pakete installiert sein:
- IO::File
- Digest::MD5
- URI::Escape
- Text::Iconv
- Encode::Guess
- MP3::Info
- mp3wrap (Empfohlen, aber optional, wird über das Attribut TTS_UseMp3Wrap aktiviert)
sudo apt-get install libdigest-perl-md5-perl libany-uri-escape-perl libtext-iconv-perl libencode-perl libmp3-info-perl mp3wrap
zusätzliche Abhängigkeiten von Espeak
sudo apt-get install lame espeak
zusätzliche Abhängigkeiten von SVOX-pico
sudo apt-get install lame libttspico-utils
Für ARM/Raspbian sind die libttspico-utils
leider nicht verfügbar, deswegen müsste man diese selbst kompilieren oder das vorkompilierte Paket aus dieser Anleitung verwenden, folgend in aller Kürze:
sudo apt-get install libpopt-dev
cd /tmp
wget http://www.dr-bischoff.de/raspi/pico2wave.deb
sudo dpkg --install pico2wave.deb
zusätzliche Abhängigkeiten von Amazon Polly
- Paws::Polly
sudo cpan Paws
Die Zugangsdaten zum eigenen AWS Konto müssen unter ~/.aws/credentials liegen.
[default]
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxx
aws_access_key_id = xxxxxxxxxxxxxxx
Die Zugangsdaten erhält man in dem man im AWS Konto eine IAM Gruppe mit einem PollyRead Profile erstellt und diese Gruppe eine neuen User zuweist. Nach Anlegen des Users erhält man einmalig(!) das Schlüsselpaar.
allgemeine Konfiguration
Relevant für die korrekte SprachEngine sind die folgenden Attribute:
- TTS_Ressource
- TTS_Language oder TTS_Language_Custom
Mit aplay -l
kann man eine Liste der möglichen Audio Ausgabedevices erhalten. Von dem gewünschten Ausgabedevice ermittelt man nun die Kartennummer und das Subdevice.
Neben dem Audio Equipment gibt es zwei Voraussetzungen im System:
- Der User fhem muss Berechtigung haben Sound auszugeben und
- es muss ein Player installiert sein.
sudo usermod -aG audio fhem
Nach dieser Änderung muss sich der Benutzer neu anmelden! Ein Neustart von FHEM oder dem System ist notwendig!
Test2Speech wurde ursprünglich für mplayer entwickelt:
sudo apt-get install mplayer
Damit mplayer ohne sudo aufgerufen wird muss das Attribute TTS_MplayerCall
gesetzt werden. Wird das weggelassen muss fhem sudo Berechtigung bekommen.
define MyTTS Text2Speech hw=0.0
attr MyTTS TTS_MplayerCall /usr/bin/mplayer
Das Programm mplayer hat auf einigen Systemen sehr große Verzögerungen beim Start, als Alternative ist z.B. play verwendbar
sudo apt-get install sox libsox-fmt-all
Die Definition muss in der Bezeichnung das Audiogerätes und im Attribute TTS_MplayerCall
so aussehen (Mindestens Version 19378 2019-05-12 erforderlich).
define MyTTS Text2Speech hw:0,0
attr MyTTS TTS_MplayerCall AUDIODEV={device} /usr/bin/play -q -v $(({volume}*{volumeadjust}/10000)).$(({volume}*{volumeadjust}%10000)) {file}
Bei wiederholten Sprachbausteinen wird durch die Verwendung von MP3Wrap eine deutlich flüssigere Sprachausgabe erreicht. Für die Verwendung von Kombinationen aus fertigen mp3 Files und Texten in der Art "Text:bing.mp3:Text" ist dies zwingend notwendig.
sudo apt-get install mp3wrap
Als Ergänzung die Definition ein Attribute TTS_UseMP3Wrap
:
attr MyTTS TTS_UseMP3Wrap 1
attr MyTTS verbose 4
Ein erster Test kann wie folgt durchgeführt werden (als Einzeiler, ohne Zeilenumbruch einzugeben):
set MyTTS tts Das ist ein Test. Jetzt prüfen wir, ob wir etwas aus dem angeschlossenen Lautsprecher hören. Beim ersten Mal haben wir allerdings noch Sprechpausen. Spätestens beim zweiten Durchlauf ist der Textfluss flüssiger.
Hört man etwas aus dem Lautsprecher, so führen wir das Kommando ein zweites Mal aus. Jetzt sollte es sich besser anhören. Bleiben die Lautsprecher stumm, so ist das FHEM-Log zu kontrollieren. Gegebenenfalls ist das verbose-Level auf 5 zu stellen.
War der Test erfolgreich, kann das verbose-Attribut wieder gelöscht werden.
Definition Client-Server Architektur
Es gibt Installationen, bei denen der FHEM-Server z.B. im Keller steht, die Sprachausgabe soll aber räumlich entfernt stattfinden, z.B. im Wohnzimmer. Hierzu ist am Zielort eine FHEM-Instanz anzulegen, z.B. über einen Raspberry Pi, IP: 192.168.178.10. Auf dem FHEM-Server ist Text2Speech als Remote zu definieren:
define MyTTS Text2Speech 192.168.178.10:7072 <Passwort>; attr Text2Speech room Text2Speech;
Am Zielort ist Text2Speech auf dem Raspi wie folgt zu definieren:
define MyTTS Text2Speech hw=0.0; attr MyTTS room Text2Speech; attr MyTTS TTS_UseMP3Wrap 1; attr MyTTS verbose 4;
Der Passwort Zugang ist entsprechend der commandref/allowed zu definieren. Bitte die Installation von Mplayer und Mp3Wrap nicht vergessen! Danach der Test wie oben angegeben.
Sprachausgabe per Bluetooth-Lautsprecher unter Raspbian Jessie
Für die Sprachausgabe über Bluetooth bieten sich verschiedene Lautsprecher an. Wichtig ist jedoch, dass diese entweder gar nicht in einen Standby Modus wechseln oder aber über Bluetooth aus dem Standby aufgeweckt werden können. Folgende Lautsprecher sollen laut Internetrecherche funktionieren:
- Creative D80/D100/D200
- Sony Soundbar HT-XT3
- Panasonic SC-ALL6EG-W / SC-NE1
- Bose Soundtouch 10
- Bose Soundlink Mini II
- B&O Beoplay S3
- JBL Charge 2+/3
- LG Art 51
- UE Roll
- Energy PowerBar Elite
- Teufel Cinebar 11
Die folgenden Schritte müssen nacheinander durchgeführt werden, um auf einem aktuellen Jessie System Audio Inhalte über Bluetooth zu streamen:
1. USB-Bluetooth-Stick verbinden und per lsusb prüfen, ob der Stick erkannt wurde.
2. System aktualisieren und notwendige Pakete installieren
sudo apt-get update sudo apt-get upgrade sudo apt-get install alsa-utils bluez bluez-tools pulseaudio-module-bluetooth python-gobject python-gobject-2 sudo reboot
3. Benutzer pi zur PulseAudio Gruppe hinzufügen
sudo usermod -a -G lp pi sudo usermod -a -G pulse-access,audio root sudo adduser pi pulse-access
4. Datei daemon.conf von PulseAudio anpassen
sudo nano /etc/pulse/daemon.conf
Nach folgender Zeile suchen
; resample-method = speex-float-1
und wie folgt erweitern
; resample-method = speex-float-1 resample-method = trivial
und
; system-instance = no system-instance = yes
speichern und schliessen
5. In PulseAudio müssen jetzt zusätzliche Module geladen werden
sudo nano /etc/pulse/system.pa
am Ende der Datei folgendes hinzufügen
.ifexists module-bluetooth-policy.so load-module module-bluetooth-policy .endif .ifexists module-bluetooth-discover.so load-module module-bluetooth-discover .endif
speichern und schliessen
6. Jetzt müssen wir dafür sorgen, dass PulseAudio automatisch geladen wird
sudo nano /etc/systemd/system/pulseaudio.service
und folgenden Inhalt einfügen
[Unit] Description=PulseAudio Sound System Before=sound.target [Service] BusName=org.pulseaudio.Server ExecStart=/usr/bin/pulseaudio Restart=always [Install] WantedBy=multi-user.target
speichern und schliessen
7. Danach müssen wir PulseAudio neu starten
sudo systemctl daemon-reload sudo systemctl enable pulseaudio.service sudo systemctl start pulseaudio.service
8. Prüfen ob PulseAudio läuft
systemctl status pulseaudio
9. Jetzt den Audio Output einstellen: X entweder mit 0 (auto), 1 (3,5mm Klinke) oder 2 (HDMI) ersetzen.
sudo amixer cset numid=3 X
10. Die Lautstärke kann auf 100% gesetzt werden mit
sudo amixer set Master 100% sudo pacmd set-sink-volume 0 65535
11. Soundausgabe z.B. über Kopfhörer prüfen
paplay /usr/share/sounds/alsa/Front_Left.wav
12. Jetzt können wir mit der Einrichtung von Bluetooth beginnen
sudo nano /etc/bluetooth/audio.conf
und folgendes einfügen
[General] Enable=Source,Sink,Headset,Gateway,Control,Media,Socket HFP=true Class=0x20041C
speichern und schliessen
sudo nano /etc/bluetooth/main.conf
unter [General] folgendes einfügen
Name = RaspStream Class = 0x20041C
speichern und schliessen
sudo hciconfig -a
eingeben und die MAC Adresse des Bluetooth Dongles aufschreiben
Jetzt müssen die Bluetooth Settings angepasst werden (XX:XX:XX:XX:XX:XX steht für die MAC Adresse des Bluetooth Dongles)
sudo nano /var/lib/bluetooth/XX:XX:XX:XX:XX:XX/settings
einngeben und folgendes einfügen
[General] Discoverable=true Alias=RaspStream Class=0x20041C
speichern und schliessen
Jetzt muss der Raspberry wieder neu gestartet werden
sudo reboot
13. Jetzt können Bluetooth Dongle und Bluetooth Lautsprecher gepaired werden
bluetoothctl
und folgende Befehle nacheinander eingeben
agent on default-agent discoverable on scan on
der Bluetooth Lautsprecher sollte jetzt irgendwann aufgelistet werden und kann dann gepaired werden mit
pair XX:XX:XX:XX:XX:XX trust XX:XX:XX:XX:XX:XX
Bluetooth console verlassen mit
quit
Damit sollte die Einrichtung abgeschlossen sein und wir können überprüfen, ob wir etwas über Bluetooth ausgeben können
mplayer -ao pulse http://stream01.iloveradio.de/iloveradio1.mp3
14. Das Modul Text2Speech sollte dann mit 'default' angelegt werden
define TTS Text2Speech default
Sprachausgabe per Bluetooth-Lautsprecher
Es ist ebenfalls möglich die Sprachausgabe nicht über einen direkt per Kabel angeschlossenen Lautsprecher auszugeben, sondern per Bluetooth an einen oder mehrere Bluetooth-Lautsprecher. Der Test2Speech-Author verwendet einen CreativeD80. Dabei ist auf dem Client mit der lokal eingerichteten Text2Speech-Instanz folgendes vorzunehmen:
1. USB-Bluetooth-Stick verbinden per lsusb prüfen, ob der Stick erkannt wurde.
2. Bluetooth Bibliotheken installieren
sudo apt-get install bluez bluez-alsa mplayer
3. Bluetooth für eine AudioVerbindung konfigurieren Dazu in /etc/bluetooth/audio.conf in der General section folgendes einfügen:
Enable=Source,Sink,Headset,Gateway,Control,Socket,Media
4. den Rechner neu starten
sudo reboot
5. Den Bluetooth-Lautsprecher lokalisieren Den Lautsprecher in den Pairing-Modus versetzen. Erst Dadurch wird er im Scanning sichtbar
hcitool scan
Folgendes Ergebnis sollte kommen:
Scanning ... 11:22:33:44:55:66 device 1 12:34:56:78:90:12 device 2
6. eine RFComm Connection vorbereiten Dazu /etc/bluetooth/rfcomm.conf editieren und folgendes eintragen (Mac-Adresse anpassen!)
rfcomm0 { # Automatically bind the device at startup bind no; # Bluetooth address of the device device 11:22:33:44:55:66; # RFCOMM channel for the connection channel 3; # Description of the connection comment "This is Device 1's serial port."; }
7. rebooten
sudo reboot
8. Pairing-Key vergeben Die meisten Bluetoothgeräte verlangen einen Schlüssel während des Pairings. Der Creative-D80 erwartet den Schlüssel 0000
bluetooth-agent 0000 &
9. Das eigentliche Pairing Den Lautsprecher in den Pairing-Modus versetzen. Danach:
sudo rfcomm connect rfcomm0
Jetzt sollte keine Fehlermeldung mehr kommen....
10. Alsa konfigurieren Der Bluetooth-Lautsprecher muss nun noch als Alsa-Audiodevice bekannt gemacht werden. Dazu muss /etc/asound.conf erstellt werden. MAC anpassen!
pcm.bluetooth { type bluetooth device 11:22:33:44:55:66 profile "auto" }
Danach Alsa restarten:
/etc/init.d/alsasound restart
11. Testen der Verbindung
mplayer -ao alsa:device=bluetooth http://1live-diggi.akacast.akamaistream.net/7/965/119435/v1/gnl.akacast.akamaistream.net/1live-diggi
mplayer -ao alsa:device=hw=0.0 -nolirc -noconsolecontrols -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=Das ist ein Test.";
Problembehandlung
Beim abspielen via Bluetooth "stottert" die Wiedergabe
Das Problem tritt im Zusammenhang mit der verwendeten Abspielsoftware ab. Aus nicht nachvollziehbaren Gründen harmoniert die Kombination Bluetooth und Mplayer nicht immer perfekt. Lösung hierfür ist, anstelle mit Mplayer mit VLC zu arbeiten.
Hierfür legt man ein Skript z.B. mit dem Namen /opt/bin/vlc-wrapper.sh an mit folgendem Inhalt:
#!/bin/bash cvlc -A alsa --alsa-audio-device bluealsa --quiet --no-interact --play-and-exit $1
Der Teil
-A alsa --alsa-audio-device bluealsa
kann ggf. weggelassen werden, wenn die Ausgabe nicht gezielt auf einem bestimmten Audiogerät erfolgen soll. Anschließend muss die Ausgabe von Text2Speech noch auf das Skript umgeleitet werden mit folgendem Befehl in FHEM:
attr myTTS TTS_MplayerCall /opt/bin/vlc-wrapper.sh
MickyMaus-artiger Sound
Das Problem tritt auf, wenn man per mp3wrap mehrere mp3 Files zusammenzieht die eine unterschiedliche Auflösung haben.
Links
- Vorstellung und Diskussion des Moduls im FHEM Forum
- Code Snippets: Wetter vorlesen lassen
- weitere Guideline für Bluetooth per Rasperry Pi
- Liste von Bluetooth Lautsprechern
- Bluetooth einrichten mit Raspbian Jessie