Neues Modul: Text2Speech

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

Vorheriges Thema - Nächstes Thema

Tobias

Hi,  super.  Aber bitte das diff hier auch anhängen.  Das merge ich dann mit dem svn

Gesendet von meinem ALCATEL ONE TOUCH 997D 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

TeeVau

Guten Morgen,

wie besprochen einmal das geänderte Modul und den dazugehörigen Patch. Das Modul kann direkt zum testen benutzt werden.
Habe über das Wochenende keine Probleme feststellen können :-)
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

TeeVau

Hallo, habe mich gerade mal versucht die Länge der TTS MP3 in ein Reading zu schreiben.
Das ermitteln, wie lang die Abspieldauer ist, war kein Problem. Da gab es ja ein Beispiel aus dem SONO Modul.
Habe gerade nur ein Problem die Information in das reading zu bekommen.

Da das ganze per BlockingCall ausgeführt wird komme ich mit $hash für die Funktion readingsSingleUpdate nicht weit, es wird nicht das reading im Hauptprozess beschrieben. Das readingsupdate muss jedoch dort stattfinden, in der "Done" Funktion von BlockingCall macht es keinen Sinn. Dort kann ich zwar das Reading beschrieben, weil $hash stimmt, abaer die Funktion wird erst nach dem Abspielen aufgerufen. Aber ich möchte ja vor dem Abspielen wissen, dass die Durchsage 23 Sekunden lang ist und nicht erst wenn die Durchsage fertig ist :-)

Mein Zugang zum Dev. Board ist nicht mehr da, deshalb kann ich das Problem gerade nicht posten. Mitgliedschaft ist aber wieder angefragt, dann frage ich mal ob jemand eine Idee hat :-)
Oder weiß hier jemand was?

sub Text2Speech_CalcMP3Duration($) {
  my $time;
  my ($file) = @_;
  eval {
    use MP3::Info;
    my $tag = get_mp3info($file);
    if ($tag) {
      $time = $tag->{SECS};
    }
  };

  if ($@) {
    Log 2, 'Bei der MP3-Längenermittlung ist ein Fehler aufgetreten: '.$@;
    return undef;
  }
  return $time;
}


Und in die Funktion Text2Speech_BuildMplayerCmdString kommt zusätzlich ab Zeile 505:
  my $mp3Duration =  Text2Speech_CalcMP3Duration($file);
  Log3 $hash, 4, "DEBUG2: MP3 Duration time = $mp3Duration";
  readingsSingleUpdate($hash, "duration", "$mp3Duration", 1);
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

Tobias

Rudi hatte ja die Info gegeben mit "BlockingCallInformParent"
Hoffe das hilft...
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

TeeVau

Nabend,

ja...es hat geholfen. Habe es mit einem wrapper gelöst.
Im Anhang ist der Patch für "Volume per REMOTE" und mit der MP3 Längenermittlung. Funktioniert natürlich nur mit google und es gibt eine Unschönheit. Wenn der Text nicht per MP3Wrap abgespielt wird, wird das reading mehrmals aktualisiert.

Beispiel im ersten Versuch:
set MyTTS tts Der erste Satz der abgespielt wird ist viel kürzer. Als der zweite.
Liefert 2 Events:
2015.01.15 21:00:30 4: Text2Speech_CalcMP3Duration: cache/0a7695edf070820829de4ccbf47d462e.mp3 hat eine Länge von 4 Sekunden.
2015.01.15 21:00:30 4: Text2Speech_readingsSingleUpdateByName: Dev:MyTTS Reading:duration Val:4

2015.01.15 21:00:36 4: Text2Speech_CalcMP3Duration: cache/f877ad0ed57716f7e855b27014228509.mp3 hat eine Länge von 1 Sekunden.
2015.01.15 21:00:36 4: Text2Speech_readingsSingleUpdateByName: Dev:MyTTS Reading:duration Val:1


Es müssen eben erst beide MP3 Files runtergeladen werden.

Beispiel im zweiten Versuch:
set MyTTS tts Der erste Satz der abgespielt wird ist viel kürzer. Als der zweite.
Liefert 1 Event:
2015.01.15 21:02:34 4: Text2Speech_CalcMP3Duration: cache/4644e8eeb3b1b5fb069fdf2f789f85bc_MP3WRAP.mp3 hat eine Länge von 5 Sekunden.
2015.01.15 21:02:34 4: Text2Speech_readingsSingleUpdateByName: Dev:MyTTS Reading:duration Val:5


Das war der Stand der Dinge für heute Abend. Patch im Anhang zur Info und das Modul zum testen (wer mag).
Möchte demnächst noch ein Reading einbauen was nicht nur die Länge in Sekunden ausgibt, sondern Uhrzeit wann das MP3 fertig abgespielt ist. Kann ggf. nützlich sein um direkt ein at zu erzeugen.

Schönes Wochenende, Tobias
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

Tobias

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

Christian S.

Hallo,

Ich möchte die Sprachausgabe per Bluetooth- Lautsprecher realisieren. Die Text2Spech Sprachausgabe über einen am Raspberry direkt angeschlossen Lautsprecher funktioniert schon. Leider funktioniert die Sprachausgabe über den Bluetooth- Lautsprecher nicht. Ich habe alle Einstellungen laut Wiki Beschreibung durchgeführt. Der Bluetooth Stick wird erkannt. Wenn ich lsusb eingebe erhalte ich folgendes:

Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 03eb:204b Atmel Corp. LUFA USB to Serial Adapter Project
Bus 001 Device 005: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

Den Bluetooth- Lausprecher konnte ich auch finden. Bei der Eingabe hcitool scan wird folgendes angezeigt:

8C:DE:52:75:78:A0       SRS-BTV5

Danach habe ich eine RFComm Connection vorbereitet und dazu /etc/bluetooth/rfcomm.conf editiert.

rfcomm0 {
  # Automatically bind the device at startup
  bind no;
  # Bluetooth address of the device
  device 8C:DE:52:75:78:A0;
  # RFCOMM channel for the connection
  channel 3;
  # Description of the connection
  comment "This is Device 1's serial port.";
}

Dann habe ich den Lautsprecher in den Pairing-Modus versetzt und mit "sudo rfcomm connect rfcomm0" gepaired.

Connected /dev/rfcomm0 to 8C:DE:52:75:78:A0 on channel 3
Press CTRL-C for hangup

Ich habe danach die /etc/asound.conf erstellt.

pcm.bluetooth {
  type bluetooth
  device 8C:DE:52:75:78:A0
  profile "auto"
}

Danach wollte ich Alsa restarten mit "/etc/init.d/alsasound restart" bekam aber folgende Fehlermeldung:

-bash: /etc/init.d/alsasound: No such file or directory

Habe ich etwas vergessen zu installieren?
FHEM auf NUC, CUL V3 868 MHz
DECT200 Steckdosen
MAX Heizungsthermostate, Wandthermostate, Fensterkontakte
Homematic
Netatmo

Tobias

ist denn "/etc/init.d/alsasound" vorhanden? geprüft? Etwas anderslautendes als "alsasound"

Funktioniert "aplay -l"?
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

Christian S.

"/etc/init.d/alsasound" ist nicht vorhanden. Ich habe etwas anders lautendes gefunden "alsa-utils".

Wenn ich "aplay -l" eingebe kommt folgendes:

/etc/init.d$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
FHEM auf NUC, CUL V3 868 MHz
DECT200 Steckdosen
MAX Heizungsthermostate, Wandthermostate, Fensterkontakte
Homematic
Netatmo

daschauher

Hallo,

ich würde gerne einen etwas viel längeren Text ausgeben.
Das Problem ist wenn ich in einem notify öfter direkt hintereinander tts aufrufe, werden zwischen aufrufe/texte verschluckt.
Als Notlösung habe ich versucht zuerst alles in eine Variable zu speichern und dann auszugeben. Das geht aber auch nur bis zu einer bestimmten Zeichen Zahl, keine Ahnung, ich sag mal gefühlte 256.
Im moment habe ich es mit dem sleep Befehl gelöst. Schön ist es nicht, da es eine reine Schätzung ist. Ändert sich was im Text entstehen Sprechlücken oder es wird wieder was abgeschnitten.

Weiß jemand ob es noch eine andere Lösung gibt?

Grüsse


fiedel

Hi,

hast du in der Commandref das hier gesehen?

ZitatTTS_Delemiter
Optional: Wird ein Delemiter angegeben, so wird der Sprachbaustein an dieser Stelle geteilt. Als Delemiter ist nur ein einzelnes Zeichen zulässig. Hintergrund ist die Tatsache, das die Google Sprachengine nur 100Zeichen zulässt.
Im Standard wird nach jedem Satzende geteilt. Ist ein einzelner Satz länger als 100 Zeichen, so wird zusätzlich nach Kommata, Semikolon und dem Verbindungswort und geteilt.
Achtung: Nur bei einem lokal definierter Text2Speech Instanz möglich und nur Nutzung der Google Sprachengine relevant!

Damit sollte sich das doch lösen lassen?

Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

daschauher

Danke, aber das bringt mich nicht wirklich weiter.
ein Beispiel:
fhem("set MyTTS tts Hallo,");;\
fhem("set MyTTS tts wie");;\
fhem("set MyTTS tts geht");;\
fhem("set MyTTS tts es");;\
fhem("set MyTTS tts dir");;\
fhem("set MyTTS tts heute");;\

ergiebt: "Hallo heute"

marvin78

Das konnte Text2Speech noch nie. Da TSS blockierend ist und nicht gerade performant, werden einzelne Befehle verschluckt. Selbst auf meinem richtig schnellen NUC mit i5 CPU funktioniert sowas nicht,. Wenn sich ein Text aus mehreren Teilen zusammensetzen soll, setzt man diesen am besten in einer eigenen Funktion zusammen und schickt ihn am Stück ab. Also sowas wie


sub myTTS () {
my $text1="Hallo,";
my $text2=" wie";
my $text3=" geht";
my $text4=" es";
my $text5=" dir";
my $text6=" heute";
fhem("set MyTTS tts ".$text1.$text2.$text3.$text4.$text5.$text6);
}

daschauher

Danke, so funktioniert es so wie es soll :-)
Grüsse

fiedel

Zitat von: daschauher am 18 Januar 2015, 10:22:23
Danke, aber das bringt mich nicht wirklich weiter.
ein Beispiel:
fhem("set MyTTS tts Hallo,");;\
fhem("set MyTTS tts wie");;\
fhem("set MyTTS tts geht");;\
fhem("set MyTTS tts es");;\
fhem("set MyTTS tts dir");;\
fhem("set MyTTS tts heute");;\

ergiebt: "Hallo heute"

Auf diese Idee wäre ich auch nicht gekommen.  ;) Das "Problem" (was ja keins ist) liegt übrigens nicht am Modul, sondern am mplayer, der keine queue vorgeschaltet hat. Er muss einen Befehl erst komplett abarbeiten, bevor er für den nächsten zur Verfügung steht.
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423