Latenz von Text2Speech verbessern

Begonnen von kaihs, 10 August 2016, 20:06:53

Vorheriges Thema - Nächstes Thema

kaihs

Wenn fhem auf relativ schwachbrüstigen Systemen läuft ist die Latenz von Text2Speech, d.h. die Zeit die zwischen dem Absetzen des set tts und der Audioausgabe vergeht, relativ hoch.

Auf einem RPI1 ca. 5 Sekunden und auch auf einem BPi mehrere Sekunden. Auf meinem Entwicklungs-PC fällt das dagegen nicht auf.
Diese Latenz ist lästig, wenn die Sprachausgabe als Reaktion auf manuelle Aktionen erfolgt.

Die Ursache ist die Zeit die mplayer braucht um zu starten, das kann man auch bei einem manuellen Start in der Shell beobachten.
Nun ist mplayer ja auch eigentlich dafür gedacht Filme abzuspielen, ist also für reine Audioausgabe überdimensioniert.

Bei meiner Suche nach einem leichtgewichtigen MP3 Player bin ich auf sox und das dazugehörige play gestoßen.
Das lässt sich auf Debian basierten Systemen einfach mit

sudo apt-get install sox libsox-fmt-all

installieren.

play startet sofort mit dem Abspielen, keine merkbare Verzögerung auch auf einem RPI1.

Zum Test habe ich in 98_Text2Speech.pm die Zeile

  $cmd = $TTS_MplayerCall . " " . $mplayerAudioOpts . $AlsaDevice . " " .$NoDebug. " " . $mplayerOpts . " " . $file;


durch

 
$cmd = "play -q " . $file;


ersetzt.
Das behebt das Latenzproblem.
Da play auch mit einem Aufruf mehrere mp3 Dateien nacheinander abspielen kann, könnte man auch den MP3Wrap Schritt noch einsparen.

Die Anpassungen an die bisherigen mplayer Optionen muss ich noch vornehmen, aber auch play unterstützt die Ausgabe auf verschiedenen Devices und die Lautstärkeanpassung.

Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

PsychoD

Hi kaihs,

da ich mit mit dem aktuellen Text2speech einige Probleme habe, und nicht genau weiß wer der schuldige ist, finde ich deine Anpassung total interessant!!! Danke für den Eintrag hier im Forum. Ich teste das umgehend aus, wenn das Wetter etwas "rechnerfreundlicher" ist :-)

Gruß

Sunless

Danke für den Tipp.

Als Parameter für die Lautstärke habe ich noch folgendes hinzugefügt:
$cmd = "play -q -v0.".$hash->{VOLUME}." ".$file;

Damit setze ich die Lautstärke auf {Volume}/100 - gefühlt entspricht das bei mir in etwa den Lautstärken wie die bei der Benutzung vom MPlayer.
Zusätzlich noch sicherheitshalber ein kleines DOIF (Notify geht natürlich auch), welches die Lautstärke auf 99 setzt, wenn diese den Wert 100 erhalten sollte (0.99 ist näher an 1 und daher lauter als 0.100  ;) ).

FHEM-Master@Raspi2B (CUL433,etliche CUL_TCM97001-Sensoren, zig IT-Steckdosenschalter, Squeezelite)
FHEM-Slave@Raspi (via RFHEM,wired Bewegungsmelder, Sqeezelite)
DS212+ (LMS für Squeezelite-Clients, Surveillance, Mediaserver und Datengrab)
Billig-Tablets zum Steuern (TabletUI)

Otto123

Hallo Kaihs,

hast Du die Verzögerung mit wheezy oder mit jessie? Ich finde auf einem wheezy ist der Start von mplayer im Bereich 1 sec. Unter Jessie ist das ganze unerträglich.

Insofern eine sehr interessante Anregung, damit könnte ich endlich die Systeme mit Sprachausgabe auf Jessie heben.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

kaihs

Beide Systeme auf denen ich die Verzögerung beobachtet habe laufen mit Debian Jessie.

Mein Entwicklungsrechner mit OpenSuSe hat das Problem nicht.
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

Otto123

Ok. Ich glaube es liegt wirklich an mplayer und Jessie. Offenbar ist da die Entwicklung schief/auseinander gelaufen. mplayer für Jessie ist irgendein schlecht portierter Fork (mplayer2) vom Original - da rasselt es beim Aufruf nur so von Fehlermeldungen.
Ich habe den Raspi B und B+ mit wheezy und Jessie getestet, da ist ein Riesenunterschied. Ich habe für mich entschieden: mplayer wheezy ok - Jessie geht gar nicht.
Leider war ich da irgendwie bisher allein  :-X

https://forum.fhem.de/index.php/topic,50967.0/nowap.html


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

#6
Hallo,

da ich mein "Durchsagesystem" auch mal langsam neu machen/auf jessie umstellen will, habe ich mich nochmal mit dem Thema beschäftigt.
Die Sache mit mplayer scheint zwar irgendwie etwas besser geworden zu sein (keine Ahnung warum) aber obwohl der eigentliche Start von mplayer unter Jessie auf einem Pi2 sogar etwas schneller ist als auf einem Pi B+, ist die Soundausgabe um knapp 3 Sekunden verzögert.

Umgekehrt bringt der Einsatz vom sox play unter wheezy auf dem Pi B+ kaum Vorteile, die Ausgabe ist nur einen Tick schneller. Unter Jessie auf dem Pi B+ wäre das aber ein "must have"!

Um das Modul  nicht patchen zu müssen, habe ich mit meinen primitiven Linux Kenntnissen mal einen kleinen "Wrapper" gebaut.  8)
mplayer.sh nach /opt/fhem/ kopieren
#!/bin/sh
# zum Test ausgeben
# echo Parameteranzahl $# > /tmp/mplay.txt

# falls volume nicht vorhanden = 1
volume=1
# Dateinamen und Volume ermitteln
while [ $# -gt 0 ]
do
# echo $1 >> /tmp/mplay.txt
if [ $1 = -volume ]
then
shift
# echo $1 >> /tmp/mplay.txt
if [ $1 -lt 100 ]
then
volume=0.$(($1))
fi   
elif [ -e $1 ]
then
file=$1
fi
shift
done
# zum Test ausgeben
#echo $volume $file >> /tmp/mplay.txt
play -q -v $volume $file
exit 0

Berechtigung setzen
chmod +x /opt/fhem/mplayer.sh
chown fhem:dialout /opt/fhem/mplayer.sh
Und noch das Attribute für den Aufruf ändern
attr MyTTS TTS_MplayerCall /opt/fhem/mplayer.sh

Die Ausgabe erfolgt quasi ohne Verzögerung.
Es werden nur der Parameter für volume übernommen. Alsa habe ich nicht hinbekommen, das funktioniert bei meinem raspberry sowieso nicht so easy.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Hanjo

Hi,

genau das was ich gesucht hatte. Vielen Dank, Kai, für den Tipp mit sox und play.

Vielen Dank auch Otto für das Skript. Da ich eine externe Soundkarte verwende habe ich noch das Parsen des Devices mit eingebaut:
#!/bin/sh
# zum Test ausgeben
#echo Parameteranzahl $# > /tmp/mplay.txt;

# falls volume nicht vorhanden = 1
volume=1;
device=hw:0,0;
# Dateinamen und Volume ermitteln
while [ $# -gt 0 ]; do
#echo $1 >> /tmp/mplay.txt;
if [ $1 = -volume ]; then
shift;
#echo $1 >> /tmp/mplay.txt;
if [ $1 -lt 100 ]; then
volume=0.$(($1));
fi   
elif [ $1 = -ao ]; then
shift;
#-ao alsa:device=
#echo $1 >> /tmp/mplay.txt;
device=${1#*=};
elif [ -e $1 ]; then
file=$1;
fi
shift;
done
# zum Test ausgeben
#echo $device $volume $file >> /tmp/mplay.txt;
AUDIODEV=$device play -q -v $volume $file;
exit 0;


Das Device kann man dann im define ... angeben, wie normalerweise auch. Man muss halt nur die anderen Syntax (hw:1,0 anstatt hw=1.0) benutzen.

mp3wrap konnte ich so auch deaktivieren. Play spielt die Dateien so schnell hintereinander ab, dass es zu keiner merkbaren Verzögerung mehr kommt. So gibt es auch keine Probleme mit unterschiedlichen Formaten (z.B.44kHz und 22kHz).

Danke & Gruß
Hanjo

Tobias

Wenn mir einer einen Patch für das text2speech Modul bereitstellt um per attr auszuwählen ob man mplayer oder play haben will, checke ich das gerne ein.

Gesendet von meinem Leap 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

duke-f

Wollte das jetzt auch mal an meinem Cubie probieren. Da ist zwar normal bei Sprachausgabe keine merkliche Verzögerung, aber wenn die Ausgabe durch etwas anderes getriggert wird, dann habe ich mehrere Sekunden Verzögerung. Bin gerade am alle Möglichkeiten zu probieren - bisher erfolglos.

Hier klappt die Sprachausgabe auch nicht, im Log habe ich die Meldungen:

2018.03.22 19:35:51 4: MyTTS: Auflistung der Textbausteine nach Aufbereitung:
2018.03.22 19:35:51 4: MyTTS: 0 => Das ist ein Test
2018.03.22 19:35:52 4: Verwende TTS Spracheinstellung: Deutsch
2018.03.22 19:35:52 4: Text2Speech: Textbaustein ist keine direkte MP3 Datei, ermittle MD5 CacheNamen: 64c0961b1ec28274f0966ef2ddf8e510.mp3
2018.03.22 19:35:52 4: Text2Speech: Bearbeite jetzt den Text: Das ist ein Test
2018.03.22 19:35:52 4: Text2Speech: cache/64c0961b1ec28274f0966ef2ddf8e510.mp3 gefunden, kein Download
2018.03.22 19:35:52 4: Text2Speech_CalcMP3Duration: cache/64c0961b1ec28274f0966ef2ddf8e510.mp3 hat eine Länge von 2 Sekunden.
2018.03.22 19:35:52 4: Text2Speech:/opt/fhem/mplayer.sh -ao alsa:device=hw=0.0 -really-quiet -nolirc -noconsolecontrols cache/64c0961b1ec28274f0966ef2ddf8e510.mp3 >/dev/null
shared memfd open() failed: Function not implemented
Home directory not accessible: Permission denied
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM default
play FAIL formats: can't open output file `default': snd_pcm_open error: No such file or directory

Hingegen nach Aufruf im Terminal von:

/opt/fhem/mplayer.sh -ao alsa:device=hw=0.0 -really-quiet -nolirc -noconsolecontrols cache/64c0961b1ec28274f0966ef2ddf8e510.mp3 >/dev/null

funktioniert die Augabe perfekt - lediglich mit der Meldung:

shared memfd open() failed: Function not implemented

Eigentlich sind mir die Rechte-Angelegenheiten schon vertraut, aber der Hinweis "Permission denied" macht mich an dieser Stelle nachdenklich.
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

Navigator

Seit der Umstellung von Wheezy auf Stretch ist auch mein TTS arschlahm geworden. Und das auf einem Cubietruck. Wenn ich ein aplay -l  eingebe, erscheint meine externe Soundkarte als Device 2. Auch im TTS funktioniert dies als hw:2.0. Ein "set AUDIODEV=hw:2" und ein anschliessendes " play /mnt/sda2/log/cache/templates/test.mp3" bringt keinen Ton heraus. Der Player spielt es aber anscheinden ab. Hat jemand einen Tipp für mich?

duke-f

Ich meine mich dumpf daran zu erinnern, dass ich mal nach einem Kernelupdate auf einem meiner Geräte auch mplayer durch mplayer2 ersetzen musste. Ist lange her und ich kann auch nichts mehr genaueres dazu sagen, weil ich mich nicht mehr richtig erinnere, wann und wo das war.
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

Navigator

hallo duke-f  :)
also der mplayer geht ja... aber halt langsam. ich meinte eher dieses sox.

Otto123

Was heisst eigentlich Umstellung?
ZitatSeit der Umstellung von Wheezy auf Stretch
Neues Image installiert oder System zurecht gewurschtelt?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Navigator

#14
Zitat von: Otto123 am 12 April 2019, 21:20:47
Was heisst eigentlich Umstellung?
Neues Image installiert oder System zurecht gewurschtelt?

Komplett neu aufgesetzt mit "Armbian_5.75_Cubietruck_Debian_stretch_next_4.19.20".

Ein "aplay -l" ergibt... "card 2: MicroII [Audio Advantage MicroII], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0"

... daher ein "set AUDIODEV=hw:2"
... "play -v 10 /mnt/sda2/log/cache/templates/einleitung.mp3.mp3"
File Size: 42.5k     Bit Rate: 194k
  Encoding: MPEG audio
  Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
  Duration: 00:00:01.75

In:100%  00:00:01.75 [00:00:00.00] Out:77.2k [    -=|===-  ] Hd:0.0 Clip:52.8k
play WARN sox: `alsa' output clipped 17584 samples; decrease volume?
play WARN sox: `/mnt/sda2/log/cache/templates/einleitung.mp3' balancing clipped 35172 samples; decrease volume?
Done.


... der Lautsprecher bleibt stumm. FHEM mit TTS lässt ihn sofort brüllen.