[Modul] TTS von VoiceRSS

SDK Version 2.2 Version 5.1
License Check Style Run Tests
Spenden

Symcon-Modul: VoiceRSS

Online-TTS Engine von VoiceRSS in IPS nutzen. Free bei max. 350 Anfragen pro Tag.

Dokumentation

Inhaltsverzeichnis

1. Funktionsumfang

Über die API von VoiceRSS wird ein Text in das gesprochene Wort überführt.

Dieses Modul ermöglicht es, die von VoiceRSS erzeugten Audio-Daten in verschiedener Art zu nutzen.
Es kann eine entsprechende Audio-Datei erzeugt werden, oder ein IPS-MedienObjekt verwendet werden.
Des weiteren können auch Roh-Daten erzeugt werden.

2. Voraussetzungen

3. Installation & Konfiguration

  • Installation in IPS 5.1
    Über den ‚Module-Store‘ in IPS.
  • Instanz erstellen
    Im Dialog Instanz hinzufügen, ist das Modul unter dem Hersteller VoiceRSS zu finden.
  • Konfiguration
    Der persönliche API-Key muss in der Instanz eingetragen werden.
    Die restlichen Einstellungen sind die Default-Werte für die Standard Funktionen.

Bei kommerzieller Nutzung (z.B. als Errichter oder Integrator) wenden Sie sich bitte an den Autor.

4. Funktionsreferenz

boolean TTSV_GenerateFile(integer $InstanceID, string $Text, string $Filename); boolean TTSV_GenerateFileEx(integer $InstanceID, string $Text, string $Filename, string $Format, string $Codec, string $Language, int $Speed, string $Voice)

Erzeugt eine Audiodatei.
Wird kein absoluter Pfad bei $Filename angegeben, so wird die Datei im Script-Ordner von IPS gespeichert. Wird keine korrekte Dateiendung übergeben, so wird Diese ergänzt. Die Funktionen liefern True bei Erfolg.


string TTSV_GetDataContent(integer $InstanceID, string $Text); string TTSV_GetDataContent(integer $InstanceID, string $Text, string $Format, string $Codec, string $Language, int $Speed, string $Voice)

Erzeugt Rohdaten zur weiterverarbeitung.
Im Fehlerfall wird false zurückgegeben. Beispiel: In ein Medienobjekt schreiben:

// Daten holen und in $data speichern. $data = @TTSV_GetDataContent(40811,„Hallo Welt.“); if ($data === false) die(„Konnte Daten nicht laden“); $MediaID =IPS_CreateMedia(2); IPS_SetMediaFile($MediaID, „Test.mp3“, false); // Inhalt von $data in das MedienObject schreiben. IPS_SetMediaContent($MediaID,base64_encode($data)); IPS_SetName($MediaID, „Test“);


integer TTSV_GenerateMediaObject(integer $InstanceID, string $Text, integer $MediaID); integer TTSV_GenerateMediaObjectEx(integer $InstanceID, string $Text, integer $MediaID, string $Format, string $Codec, string $Language, int $Speed, string $Voice)

Erzeugt/befüllt ein MedienObject im logischen Baum von IPS.

  • Wird als $MediaID eine ID eines vorhandenes MedienObject übergeben, so wird Dieses mit den Audiodaten gefüllt.
  • Wird als $MediaID eine 0 übergeben, so wird unterhalb der VoiceRSS-Instanz ein MedienObject verwendet.

Der Rückgabewert ist die ID des befüllten Media-Objektes.
Oder false im Fehlerfall.

5. Anhang

GUID:
{133A6F0D-464E-4FAD-8620-02DB0AB9BFD1}

Konfiguration:

Eigenschaft Typ Standardwert Funktion
Apikey string Api-Key von VoiceRSS
Language string de-de Sprache
Speed int 0 Geschwindigkeit -10 bis +10
Voice string Stimme
Codec string MP3 Audio-Format
Sample string 8khz_8bit_mono Samplerate

Erlaubte Parameter siehe: VoiceRSS API

Changelog:

Version 2.2:

  • Sprechgeschwindigkeit und Stimme in der Konfiguration ergänzt.
  • Alle —Ex Funktionen erwarten jetzt Speed und Voice als Parameter.

Version 2.1:

  • Fehler in der Fehlerbehandlung behoben.

Version 2.0:

  • Release für IPS 5.1 und den Module-Store

Version 1.01:

  • Doku ergänzt.

Version 1.0:

  • Erstes Release

6. Spenden

Die Library ist für die nicht kommerzielle Nutzung kostenlos, Schenkungen als Unterstützung für den Autor werden hier akzeptiert:

PayPal:

Wunschliste:
Wunschliste

7. Lizenz

CC BY-NC-SA 4.0

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