Text2Speech: Unterschied zwischen den Versionen

Aus FHEMWiki
(→‎Definition Lokale Architektur: Hinweise ergänzt, umstrukturiert)
K (Vorlage Link2CmdRef)
Zeile 72: Zeile 72:
  attr MyTTS TTS_UseMP3Wrap 1;
  attr MyTTS TTS_UseMP3Wrap 1;
  attr MyTTS verbose 4;
  attr MyTTS verbose 4;
Der Passwort Zugang ist entsprechend der commandref zu definieren, siehe dort allowed.  
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.

Version vom 31. Januar 2018, 14:15 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.

Definition Lokale Architektur

Voraussetzung ist ein installierter Mplayer:

sudo apt-get install mplayer
X mark.svgVariante a und b sind Alternativen! Es ist nicht sinnvoll beides zu verwenden

Danach den Mplayer für alle aufrufbar machen

a) per GruppenRechte

sudo usermod -aG audio fhem

Hat man Mplayer per Gruppenrechte verfügbar gemacht, muss später folgendes Attribut gesetzt sein. Damit wird verhindert, dass Mplayer mit dem defaultmäßig eingestellten "sudo" aufgerufen wird, welches für b) per sudoers gebraucht wird.

attr MyTTS TTS_MplayerCall /usr/bin/mplayer

b) per SUDOERS

 EDITOR=nano
 visudo

Dort an letzter Stelle eintragen:

ALL ALL = NOPASSWD: /usr/bin/mplayer

Allgemein

Empfohlen wird die Nutzung von MP3Wrap. Dadurch wird bei wiederholten Sprachbausteinen 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

per aplay -l erhält man eine Liste der möglichen Audio Ausgabedevices. Von dem gewünschten Ausgabedevice ermittelt man nun die Kartennummer und das Subdevice. Mit diesen Daten kann man nun das Modul Text2Speech definieren:

 define MyTTS Text2Speech hw=0.0;
 attr MyTTS room Text2Speech;
 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.

Abhängigkeiten der lokalen Sprachengines

Für beide lokale Engines ist lame für die Umwandlung von .wav in .mp3 notwendig:

sudo apt-get install lame
Espeak
sudo apt-get install espeak
SVOX-pico
sudo apt-get install 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

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

Info green.pngDieser 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. 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:

X mark.svgAktuell bei wheezy /etc/init.d/alsa-utils restart
/etc/init.d/alsasound restart

11. Testen der Verbindung

X mark.svgDieses Beispiel geht allein wegen der ständigen Änderung bei Google nicht. Auch stimmt das Ausgabe Gerät nicht. Man könnte so testen :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


Links