Neues Modul: Text2Speech

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

Vorheriges Thema - Nächstes Thema

Otto123

Hallo Tobias,

ich habe heute ein System neu gemacht und habe die "neue" Funktion für MplayerCall genutzt. Dabei ist mir aufgefallen: Dein Beispiel in der deutschen commandref (nur dort vorhanden) ist, so wie es da steht, nicht einfach verwendbar. Da brüllt einen der Lautsprecher sehr verzerrt an!  :o
Der Grund ist simpel: Mplayer verwendet für Volume Prozent, play verwendet einen Faktor.
mplayer = 100 entspricht play = 1

Ich habe das mal so mit shell Mitteln umgesetzt, das funktioniert, quasi vor dem Komma und nach dem Komma getrennt  ;):
AUDIODEV={device} play -q -v $(({volume}*{volumeadjust}/10000)).$(({volume}*{volumeadjust}%10000)) {file}

Man kann in der Shell auch perl nehmen zum rechnen, das finde ich nicht schön: "aus perl heraus in die shell rein in perl und wieder in die shell" .
$(perl -e 'print {volume}*{volumeadjust} / 10000;')

Hast Du dazu einen besseren Einfall?

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

tagedieb


das system zeigt mir beim hochfahren an, das der Soundkartentreiber "gescheitert" ist
leider ich habe diesen Treiber bisher auch für win und mac gefunden


vg
FHEM 5.6 auf Cubitruck
CUL und Cul 868 und 2 HM LAN an Zbox
Remoteserver auf 2.Zboxi
HM-CC-RT-DN,HM-LC-Bl1PBU-FM,HM-LC-SW1-FM,HM-LC-SW4-PCB,HM-LC-Sw1PBU-FM,HM-PB-2-WM55,HM-PB-6-WM55,HM-SCI-3-FM,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SC-2,HM-SEC-TIS,HM-WDS10-TH-O u.viele mehr
diverse IT Empfänger und LW3

Tobias

#1067
@tagedieb, die Einstellungen im alsamixer kann man natürlich abspeichern: "alsactrl store" (oder so ähnlich...)

@Otto, mir fällt leider nix besseres ein da theoretisch jeder Tool andere Einstellungen hat. Dein erstes PlayBeispiel könntest du aber ins Wiki aufnehmen :)

@pah: Aufnahme der Ressource anstatt der Language ist eine gute idee :)
Eine extra Datenbankabhängigkeit ins Modul aufzunehmen finde ich nicht so doll. Rudimentär habe ich ja eine Verbindung /Logging in ein DBLog Instanz eingebaut. Darüber sollte genau das passieren, ist aber noch nicht bis zu ende umgesetzt da noch niemand nach diesem Use-Case wirklich geschrien hat ;)

Ich habe mal die 2 Änderungen in mein GIT gepushed, bitte mal checken/testen
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

Prof. Dr. Peter Henning

dblog ist viel zu mächtig dafür. Ich benutze drei Routinen, vorher muss mit

use DBI;

das Perl-Modul geladen werden, sowie die Datenbank mit

  sqlite3 tts.db "CREATE TABLE tts (key INTEGER PRIMARY KEY, count INT, time INT, content TEXT);"
  chown fhem:dialout tts.db

angelegt werden.

Die erste Routine wird mit dem Namenshash (=$key) und dem Text der Nachricht aufgerufen und liefert "1" zurück, wenn die Datei schon existiert, "0" wenn sie neu erzeugt werden muss.
Die zweite Routine kann den Inhalt der Datenbank anzeigen, die dritte Routine kann im ersten Argument das maximale Alter, im zweiten Argument die minimale Anzahl von Aufrufen und löscht alle anderen Einträge aus der Datenbank (aber bisher nicht als Datei).

sub tts_dblog($$){
  my ($key,$text) = @_;
  #--
  my $path = "/home/fhem";
  my $dbargs = {AutoCommit => 0, PrintError => 1};
  my $dbh = DBI->connect("dbi:SQLite:dbname=".$path."/tts.db", "", "", $dbargs);
 
  #-- check existence
  my ($res) = $dbh->selectrow_array("SELECT EXISTS ( SELECT 1 FROM tts WHERE key='".$key."')");
  #-- exists
  if( $res == 0 ){
    #-- insert a line
    $dbh->do("INSERT INTO tts (key,count,time,content) VALUES ('".$key."','1','".time()."','".$text."');");
    if ($dbh->err()) {
      Log 1,"[tts_dblog] $DBI::errstr";
    }
  #-- does not exist
  }else{
    #-- modify
    $dbh->do("UPDATE tts SET count = count + 1 WHERE key='".$key."';");
    if ($dbh->err()) {
      Log 1,"[tts_dblog] $DBI::errstr";
    }
  }
  $dbh->commit();
  $dbh->disconnect();
  return $res;
}

sub tts_dbshow(){
  #--
  my $path   = "/home/fhem";
  my $dbargs = {AutoCommit => 0, PrintError => 1};
  my $dbh    = DBI->connect("dbi:SQLite:dbname=".$path."/tts.db", "", "", $dbargs);
  my $ret    = "";

  #-- print rows
  my $res = $dbh->selectall_arrayref("SELECT key,count,time,content FROM tts;");
  foreach my $row (@$res) {
    my ($keyr,$countr,$timer,$textr) = @$row;
    $ret .= sprintf("%s %d %d %s",$keyr,$countr,$timer,$textr);
  }
  $dbh->disconnect();
  return $ret;
}

sub tts_dbpurge($$){
  my ($deltime,$mincount) = @_;
  #--
  my $path   = "/home/fhem";
  my $dbargs = {AutoCommit => 0, PrintError => 1};
  my $dbh    = DBI->connect("dbi:SQLite:dbname=".$path."/tts.db", "", "", $dbargs);

  if( defined($deltime) && $deltime > 0){
    my $earliest = time() - 86400*$deltime;
    $dbh->do("DELETE from tts where time < ".$earliest.";");
    if ($dbh->err()) {
      Log 1,"[tts_dblog] $DBI::errstr";
    }
  }elsif( defined($mincount) && $mincount > 0){
    $dbh->do("DELETE from tts where count < ".$mincount.";");
    if ($dbh->err()) {
      Log 1,"[tts_dblog] $DBI::errstr";
    }
  }
  $dbh->disconnect();
}



LG

pah

Billy

Hallo, bin heute von Wheezy auf Stretch umgezogen. alles läuft bis auf Text2Speech. :'(
Ein
defmod myTTS Text2Speech hw=0.0
Bringt --> Cannot load module Text2Speech
Im Log sieht das so aus!
2019.07.13 19:25:12.023 1: reload: Error:Modul 98_Text2Speech deactivated:
Can't locate URI/Escape.pm in @INC (you may need to install the URI::Escape module) (@INC contains: . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.24.1 /usr/local/share/perl/5.24.1 /usr/lib/arm-linux-gnueabihf/perl5/5.24 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.24 /usr/share/perl/5.24 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base /data/fhem//FHEM /data/fhem//FHEM/lib) at /data/fhem//FHEM/98_Text2Speech.pm line 27.
BEGIN failed--compilation aborted at /data/fhem//FHEM/98_Text2Speech.pm line 27.

2019.07.13 19:25:12.023 0: Can't locate URI/Escape.pm in @INC (you may need to install the URI::Escape module) (@INC contains: . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.24.1 /usr/local/share/perl/5.24.1 /usr/lib/arm-linux-gnueabihf/perl5/5.24 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.24 /usr/share/perl/5.24 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base /data/fhem//FHEM /data/fhem//FHEM/lib) at /data/fhem//FHEM/98_Text2Speech.pm line 27.
BEGIN failed--compilation aborted at /data/fhem//FHEM/98_Text2Speech.pm line 27.


Ein
apt-get install -y libav-tools und cpan install URI::Escape::XS
habe ich durchgeführt.

Was fehlt da? Wie gesagt in Wheezy gings mit den gleichen Einstellungen!

Billy

FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

Otto123

Hi,

also ich denke Du brauchst liburi-perl
und
laut meinen Notizen mplayer libdigest-sha-perl mp3wrap

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

Billy

Zitat von: Otto123 am 13 Juli 2019, 19:44:24
Hi,

also ich denke Du brauchst liburi-perl
und
laut meinen Notizen mplayer libdigest-sha-perl mp3wrap

Gruß Otto

Danke, liburi-perl war's, die anderen hatte ich!

Gruß Billy
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

Otto123

Zitat von: Tobias am 11 Juli 2019, 07:30:31
@Otto, mir fällt leider nix besseres ein da theoretisch jeder Tool andere Einstellungen hat. Dein erstes PlayBeispiel könntest du aber ins Wiki aufnehmen :)
Da steht es nun :)
Ich habe den Anfang im Wikiartikel etwas umgestellt und das Thema sudoers ausgelagert. So kann man das an andere Stelle einfach mal verlinken.
Vielleicht schaut es sich der Eine oder Andere mal an und sagt wenn was nicht ok ist.
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

Schlimbo

Hallo Tobias,
werden die untenstehenden Abhängigkeit im aktuellen Modul noch benötigt? Wenn ja sollte das auch noch im Wiki ergänzt werden:
Zitat von: Tobias am 03 Mai 2019, 09:30:42
Das Wiki ist noch nicht komplett ergänzt.
Es wird Text::Iconv sowie in der nächsten Version Encode::Guess benötigt.
Wenn du die neue Amazon Polly Engine nutzen willst, kommt noch Paws und File::Homedir dazu

Bitte nachinstallieren
File::Homedir müsste jedoch File::HomeDir sein.

Zitat von: mumpitzstuff am 26 April 2019, 22:07:42
Im Wiki steht drin, dass man:

cpan paws

starten soll. Es muss aber Paws sein!
Gruß schlimbo

Tobias

Habe im Wiki die Abhängigkeiten jetzt genauer beschrieben
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

Otto123

#1075
Hallo Tobias,

Dein neuer Abschnitt im Wiki Abhängigkeiten Installationspakete hat  mich etwas verwundert, da
- mir diese Abhängigkeiten neu waren
- ich keinerlei Logeinträge dazu habe
- alles funktioniert ohne das ich eins von diesen Modulen wissentlich installiert habe.

Ich habe nachgeforscht, ein paar dieser Module habe ich irgendwie drin, die debian Pakete habe ich alle nicht. TTS mit Tante Google in einer Basis Installation funktioniert trotzdem. :D
Meine Nachforschungen haben folgendes ergeben:
IO::File Perl Core
Digest::MD5 Perl Core
URI::Escape liburi-perl wird bei debian per default installiert
Text::Iconv libtext-iconv-perl wird bei debian per default installiert
Encode::Guess Perl Core
MP3::Info libmp3-info-perl
mp3wrap mp3wrap

Stimmt das so? Wenn ja:
Sind offenbar alle Module außer der beiden MP3 Module in jeder debian Standardinstallation enthalten? Die von Dir im Wiki aufgeführten Module libdigest-perl-md5-perl libany-uri-escape-perl libtext-iconv-perl libencode-perl tragen mMn keine Funktionalität bei.
Die beiden MP3 Module braucht man erst mit MP3 Wrap? Dann sollte man es so schreiben oder mp3wrap vorsichtshalber zum Standard erklären?

Ich bin für sparsame Installation :) ich will aber da jetzt nicht in deinem Text im Wiki gleich wieder ändern, sondern wirklich ermitteln wie es ist!

Ich habe mir im Modul die sub Text2Speech_loadmodules($$) angeschaut. Ich behaupte mal die tut nichts. :-\
In der Zeile fehlt ein ganzes Stück oder nur der "; am Ende:

    } or return "Paws Module not installed. Please install, goto https


Aber auch wenn ich versuche, die sub separat auszuführen, habe ich mit meinen bescheidenen Perl Kenntnissen keinen Erfolg.
Wenn ich separat sowas wie {eval {require File}} ausführe schon, da sehe ich dann auch, dass mir was fehlt ...

Vielleicht hast mal Zeit es Dir anzuschauen.

Edit: Entschuldigung -vergiss das mit der sub, Da hat mir die Ansicht im Browser wohl einen Streich gespielt.

In der sub Text2Speech_loadmodules wird mp3wrap nicht als Voraussetzung abgefragt.

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

Schlimbo

Zitat von: Tobias am 16 Juli 2019, 07:58:49
Habe im Wiki die Abhängigkeiten jetzt genauer beschrieben
Danke für die Anpassung.

Was mir noch aufgefallen ist:
Im Installationsbefehl zu den allgemeinen Abhängigkeiten hast du auch "libfile-homedir-perl" aufgenommen, weiter unten steht aber dass es nur für Amazon Polly benötigt wird, stattdessen fehlt "IO::File" im ersten Installationsbefehl.

Aus WIKI:
ZitatAbhä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

sudo apt-get install libfile-homedir-perl libdigest-perl-md5-perl libany-uri-escape-perl libtext-iconv-perl libencode-perl libmp3-info-perl mp3wrap

Tobias

ist angepasst.

mp3wrap habe ich erstmal als notwendigkeit eingetragen. Es wird aber nicht gemeckert falls es nicht installiert ist. Das Modul läuft erst dann auf einen Fehler wenn das mp3wrap Attribut gesetzt, das Tool aber nicht installiert ist. Deswegen hatte ich es nicht in die "loadmodules" mit aufgenommen.

Ich habe alle Abhängigkeiten aufgelistet, je nach Umgebung sind einige aber schon per Standard installiert. Das kommt auf das OS und Version drauf an. Deswegen habe ich sicherheitshalber (alle bis auf IO::File) in der "apt-get" Routine eingetragen.
IO::File müss überall vorhanden sein, sonst würde das fhem Log nicht funktionieren ;)
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

ich würde gerne von Text2Speech Neueinsteigern wissen, ob bei Erstdefinition in FHEM ggf. fehlende Abhängigkeiten sauber als FHEM Fehlermeldung im Frontend ausgegeben werden. Ich meine nicht das Logfile sondern direkt im Frontend. Fehlen Module so sollte das TTS Device nicht angelegt werden und stattdessen eine Meldung über das fehlende Modul erscheinen.
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

sn0000py

Hallo ich teste auch gerade mit dem TTS Modul, mein ziel ist es einen mp3 Datei zu erzeugen, da ich diese im Moment mit dem AVR ausgeben lasse.

Mein Problem ist, das zwar der TExt nun in Blöcke aufgeteilt wird und es werden so 8 mp3 Dateien im cache directory abgelegt, aber ich würde das ganze mp3 File im TTS_OutputFile benötigen.

Daher meine 2 Fragen.

Das Attribute TTS_OutputFile macht irgendwie gar nichts.
Wie kann ich ein gesamtes mp3 generieren?

defmod TTS Text2Speech none
attr TTS TTS_OutputFile /opt/fhem/icache/test.mp3
attr TTS room Status
attr TTS verbose 5

setstate TTS 2019-11-07 10:23:20 lastFilename cache/3e426ce1c4535b345c10019ddce0d6f6.mp3
setstate TTS 2019-11-07 10:23:20 playing 0