[Modul] TTS von VoiceRSS

Ich hatte schon vor einiger Zeit nach einem Online-TTS gesucht, welches ohne Google auskommt.

Gefunden habe ich dann http://www.voicerss.org .
Bei max. 350 Anfragen am Tag (jede Anfrage ist auf 100kB limitiert) ist der Dienst kostenfrei.
Registrierung ist aber Pflicht, da Ihr den API-Key benötigt.

Download & Doku :
Nall-chan/IPSVoiceRSS · GitHub

Einmal in den Einstellungen den API-Key eintragen, sowie Sprache, Codec und Samplerate auswählen und dann geht es los.


// Datei speichern unter Filename
TTSV_GenerateFile(interger $InstanceID, string $Text, string $Filename)

// Rohdaten laden (z.B. zum weiterverarbeiten mit IPS_SetMediaContent
$rawData = TTSV_GetDataContent(interger $InstanceID, string $Text)

// Vorhandenes MediaObject ($MediaID) mit den Daten befüllen oder MedieObject der Instanz nutzen ($MediaID = 0)
integer $MediaID = TTSV_GenerateMediaObject(integer InstanceID,string $Text, integer $MediaID)

//Folgende Funktionen nutzen nicht die Einstellungen aus der Instanz (außer dem Key)
//
// Erlaubte Werte siehe : http://www.voicerss.org/api/documentation.aspx
// $Format = f
// $Codec = c
// $Language = hl
//
// Datei speichern unter Filename
TTSV_GenerateFileEx(interger $InstanceID, string $Text, string $Filename, string $Format, string $Codec, string $Language)

// Rohdaten laden (z.B. zum weiterverarbeiten mit IPS_SetMediaContent
$rawData = TTSV_GetDataContentEx(interger $InstanceID, string $Text, string $Format, string $Codec, string $Language)

// Vorhandenes MediaObject ($MediaID) mit den Daten befüllen oder MedieObject der Instanz nutzen ($MediaID = 0)
integer $MediaID = TTSV_GenerateMediaObjectEx(integer InstanceID,string $Text, integer $MediaID, string $Format, string $Codec, string $Language)


Viel Spaß,
Michael

Hallo
Hab nur so eine eine Frage nebenbei.
Warum benutzt niemand ‚SAPI‘ von MS.
Hat das einen bestimmten Grund, dass alle eine Online-Loesung suchen ?

Ich vermute mal, dass es hauptsächlich die Raspberry/Linux Leute betrifft, denn da ist mir persönlich keine gute/einfache Offline-Variante bekannt. Internet hat jeder und da greift man schnell mal auf eine Online-API zurück :slight_smile: Diese ist, wie man sieht, sehr schnell und einfach eingebunden und klingt akzeptabel :slight_smile:

Wobei es für Windows auch nicht wirklich gute/tolle kostenlose Stimmen gibt. Meine Stimme für Windows hab ich aber für recht günstige 50€ bekommen und bin sehr zufrieden damit.

Grüße,
Chris

Geht das auch unter RPi, OSX, Ubuntu ?
(Ich habe von Sapi wirklich null Plan.)

Das hier ist ja für alle IPS4 und nicht nur für Windows.
Dort wird die alte IPS-Instanz mit Sapi wohl weiterhin funktionieren.
Und eine OS unabhängige Offline-TTS-Engine kenne ich nicht.
Michael

Ich benutze die Stimme die bei WIN7/8 dabei ist ueber SAPI. Bin damit zufrieden.

Bei mir funktioniert das leider nicht. Die Installation des Moduls funktionierte ohne probleme.
Sobald ich das folgende Script laufen lasse :
[PHP<?
$Filename = „Test“;
$Text = „This is a test“;
TTSV_GenerateFile($Text,$Filename);
?>]



erhalte ich diese Fehlermeldung :

Warning:  Missing argument 3 for TTSV_GenerateFile(), called in /usr/share/symcon/scripts/15704.ips.php on line 4 and defined in /usr/share/symcon/scripts/__generated.inc.php on line 10

Notice:  Undefined variable: Filename in /usr/share/symcon/scripts/__generated.inc.php on line 14

Warning:  Parameter type of InstanceID does not match in /etc/symcon/scripts/__ipsmodule.inc.php on line 196

Warning:  Parameter type of InstanceID does not match in /etc/symcon/scripts/__ipsmodule.inc.php on line 196

Warning:  Parameter type of InstanceID does not match in /etc/symcon/scripts/__ipsmodule.inc.php on line 196

Warning:  Parameter type of InstanceID does not match in /etc/symcon/scripts/__ipsmodule.inc.php on line 196

Warning:  fopen(): Filename cannot be empty in /usr/share/symcon/modules/IPSVoiceRSS/TTSVoiceRSS/module.php on line 96

Warning:  fwrite() expects parameter 1 to be resource, boolean given in /usr/share/symcon/modules/IPSVoiceRSS/TTSVoiceRSS/module.php on line 97

Warning:  fclose() expects parameter 1 to be resource, boolean given in /usr/share/symcon/modules/IPSVoiceRSS/TTSVoiceRSS/module.php on line 105

Hast recht, die Beispiele da oben sind Falsch :slight_smile:

Der erste Parameter ist natürlich die InstanzID, der ‚Rest‘ rutsch somit ein nach hinten.
Ich ändere das sofort oben.

So sollte es gehen:


<?
$Filename = "Test";
$Text = "This is a test";
TTSV_GenerateFile(12345, $Text,$Filename);
?>

Michael

Danke für den schnellen Feedback. Jetzt funktioniert es :slight_smile:

OK das ist eine wirklich blöde Frage ich weiss aber ich finde die output Datei nicht. Wo muss ich nachschauen ?

<?
$Filename = „test“;
$Text = „This is a test“;
TTSV_GenerateFile(23077 /[TTS VoiceRSS]/,$Text,$Filename);
?>

Abend!

Hab es zwar selbst nicht im Einsatz, aber der Code liest sich so, als müsste man nicht nur den Filename, sondern kompletten Pfad + Filename angeben?!

Edit: Aber so wie ihr das schreibt, klappt es wohl auch nur mit einem Filename?! Und da im Code nichts steht, scheint es ein IPS-Default-Verzeichnis zu geben?! Das wird dann vmtl. „media“ sein.

Grüße,
Chris

Als Debian Laie musste ich mich erst mal an den syntax des „find“ utilities gewöhnen und siehe da :
das file liegt in :./usr/share/symcon/scripts/test

das heißt also auch das man unabhängig von der Einstellung in der Instanz welches Format man möchte (MP3 etc.) das Format im Datei Namen mit angeben muss : $Filename = „test.mp3“;

Super Sache mit dem TTS von VoiceRSS - vielen Dank, Michael. Ideal wäre es, wenn man dies irgendwie mit dem Sonos-Modul verknüpfen könnte, um dann Durchsagen über Sonos zu realisieren. Es gab ja schon mal eine Lösung auf Scriptbasis, aber als Erweiterung für das TTS- oder Sonos-Modul wäre dies vermutlich besser. Ggf. könnte man die TTS-Antworten von VoiceRSS auch lokal cachen, um die Anzahl der Requests zu begrenzen und die Reaktionszeit zu verringern.
Gruß
Peter

Ich kann das ja gerne ändern, dass das File je nach eingestellten Format automatisch die korrekte Endung bekommt.
Mit dem Ziel-Ordner hatte ich mir keine Gedanken gemacht, weil ich es gar nicht in einem IPS-Verzeichnis Speicher, sondern dort wo mein Logitech MediaServer es findet.
Alternativ den Filename mit IPS_GetKernelDir().‚media/‘ zusammenbauen.
Sonos habe ich zwar nicht im Einsatz, aber ich schaue es mir mal an wie es vielleicht funktionieren könnte.
Ich ergänze nachher auch noch mal die Beispiele. Man kann auch direkt in ein Media-Objekt speichern.
Michael

Das wäre aus meiner Sicht sinnvoll Danke

Die Sonos Funktion würde ich auch gerne nutzen wollen

So Dateiendung wird automatisch angehängt, wenn sie nicht übergeben wird bzw. falsch ist.

Das File wird, ohne absolute Pfadangabe im Scripts-Order gespeichert.
Es gibt jetzt auch TTSV_GenerateMediaObject


TTSV_GenerateMediaObject(integer InstanceID,string $Text, integer $MediaID)

$MediaID = TTSV_GenerateMediaObject(40811,'Hallo Symcon Welt!',16522);

$MediaID kann entweder ein vorhandenes Audio-Medienobjekt sein.
Oder 0, dann wird immer das gleich MedienObject unterhalb der Instanz verwendet, und die MedienID zurück gegeben.

Desweiteren wird in den MedienObjekten das Info Feld mit dem gesprochenen Text befüllt.

Michael

Sry da steh ich jetzt auf dem Schlauch. Einmal gibt die funktion eine MediaID zurück (kann ich verstehen wenn die Funktion eine Sound Media anlegt. Aber welche MediaID übergebe ich in der Funktion ?

Kannst doch in der Konsole oder auch per eigenen Script ein Mediaobject erzeugen.
Diese ID kannst du übergeben.
Der Inhalt des Objektes wird dann durch diese Funktion überschrieben.
Beispiel kann ich erst heute abend nach liefern.
Michael

OK versteh ich, Danke. Das Modul legt ohne Angabe eine ID im Aufruf bereits eine Media Datei an, allerdings mit Fehlermeldung das eine Variable nicht übergeben wurde.

Nicht übergeben geht nicht.
Dann einfach 0 übergeben und der Fehler sollte weg sein.
Michael

Danke, funktioniert problemlos