Einfache TTS PHP-Class über Google Translate

Hallo,

bin zufällig auf diese TTS-Klasse gestoßen. Sie benutzt die SPrachausgabe der Übersetzungsfunktion von google und speichert den Text als mp3.
Für andere Sprachen einfach die Domain-Endung anpassen.

Code stammt von dieser Seite: Google’s Text to Speech API : A PHP Wrapper Class | maSnun’s blog

<?php
// FileName: tts.php
/*
 *  A PHP Class that converts Text into Speech using Google's Text to Speech API
 *
 * Author:
 * Abu Ashraf Masnun
 * http://masnun.com
 *
 */

class TextToSpeech {
    public $mp3data;
    function __construct($text="") {
        $text = trim($text);
        if(!empty($text)) {
            $text = urlencode($text);
            $this->mp3data = file_get_contents("http://translate.google.de/translate_tts?q={$text}");
        }
    }

    function setText($text) {
        $text = trim($text);
        if(!empty($text)) {
            $text = urlencode($text);
            $this->mp3data = file_get_contents("http://translate.google.de/translate_tts?q={$text}");
            return $mp3data;
        } else { return false; }
    }

    function saveToFile($filename) {
        $filename = trim($filename);
        if(!empty($filename)) {
            return file_put_contents($filename,$this->mp3data);
        } else { return false; }
    }

}
?>

Hier ein Beispiel:

<?php
require "tts.php";

$path = IPS_GetKernelDir()."/media/";

$tts = new TextToSpeech("Hallo Welt!");
$tts->saveToFile($path."test_tts.mp3");
?>

Hallo hirschbrat,

funktioniert super und ist auch eine Lösung vor alle bei denen die Sprachpakete nicht funktionieren.

Die Sprache kannst Du auch mit einem angehängten Parameter ‚tl=en‘ für englisch oder ‚tl=de‘ für deutsch ändern.

http://translate.google.de/translate_tts?tl=en&q={$text}

Die Qualität der Stimme läßt sich auch sehen.

Nur aufpassen beim programmieren. Die API läßt nur max. 100 Zeichen zu.

Schöne Sache. Vielen Dank für den Hinweis.

Wie kann man da denn Umlaute darstellen. Da kommt bei mir nur Schrott raus.

Da sich die Stimme nochmals deutlich verbessert hat. Wäre es inzwischen vielleicht auch Interessant ob, bzw. wie man Umlaute ausgeben kann. Hat das jemand schon gelöst?

Versien inkl. Umlaute

Ungetestet:

<?php
// FileName: tts.php
/*
 *  A PHP Class that converts Text into Speech using Google's Text to Speech API
 *
 * Author:
 * Abu Ashraf Masnun
 * http://masnun.com
 *
 */

class TextToSpeech {
    public $mp3data;
    function __construct($text="") {
        $text = trim($text);
        if(!empty($text)) {
            $text = urlencode(utf8_encode($text));
            $this->mp3data = file_get_contents("http://translate.google.de/translate_tts?ie=UTF-8&q={$text}");
        }
    }

    function setText($text) {
        $text = trim($text);
        if(!empty($text)) {
            $text = urlencode(utf8_encode($text));
            $this->mp3data = file_get_contents("http://translate.google.de/translate_tts?ie=UTF-8&q={$text}");
            return $mp3data;
        } else { return false; }
    }

    function saveToFile($filename) {
        $filename = trim($filename);
        if(!empty($filename)) {
            return file_put_contents($filename,$this->mp3data);
        } else { return false; }
    }

}
?> 

ich bekommen folgende Fehlermeldung
Warning: file_get_contents(http://translate.google.de/translate_tts?tl=de&q=Hallo) [function.file-get-contents]: failed to open stream: Ein Systemaufruf ist wider Erwarten fehlgeschlagen.
in [SpeakGoogel] on line 20

Ist da vielleicht ein Schreibfehler drin?

SpeakGoogel-> SpeakGoogle

Gruß NBA

Ich denke das ist das selbe Problem wie derzeit überall bei G…gle. Sie andern die Aufrufparameter.

http://translate.google.de/translate_tts?ie=UTF-8&q=Hallo%20wie%20geht%20es%20dir

Geht, bei direkter Eingabe im Browser.

Ja :slight_smile: Aber das ist nicht das Problem, wenn man sich innerhalb von 2 Wochen das komplette Symcon reinzieht betitelt man schon mal ein Script schlampig…

Genau, bei direkter Eingabe in den Browser funktioniert es bei mir auch mit dem Link aus PHP, kann das jemand mal bei sich ausprobieren(also die Funktion über PHP!) damit ich mir sicher bin das es nicht an meiner Konfiguration liegt? (Welche Medien-Instanzen brauch ich?) In anderen Foren hab ich gelesen das „Google“ :slight_smile: evtl. den externen Zugriff über PHP sperrt

Geht hier einwandfrei. mp3 wird im media Ordner angelegt.

Probier das mal so aus, wenn es geht, stimmt bei dir mit dem Einbinden nicht.

<?

class TextToSpeech {
    public $mp3data;
    function __construct($text="") {
        $text = trim($text);
        if(!empty($text)) {
            $text = urlencode($text);
            $this->mp3data = file_get_contents("http://translate.google.de/translate_tts?q={$text}");
        }
    }

    function setText($text) {
        $text = trim($text);
        if(!empty($text)) {
            $text = urlencode($text);
            $this->mp3data = file_get_contents("http://translate.google.de/translate_tts?q={$text}");
            return $mp3data;
        } else { return false; }
    }

    function saveToFile($filename) {
        $filename = trim($filename);
        if(!empty($filename)) {
            return file_put_contents($filename,$this->mp3data);
        } else { return false; }
    }

}

$path = IPS_GetKernelDir()."/media/";

$tts = new TextToSpeech("Hallo Welt!");
$tts->saveToFile($path."test_tts.mp3");
?>

Warning: file_get_contents(http://translate.google.de/translate_tts?q=Hallo+Welt!) [function.file-get-contents]: failed to open stream: Ein Systemaufruf ist wider Erwarten fehlgeschlagen.
in [Speak] on line 18


was hab ich den für funktionsbedingungen dafür?
P.S. ich sehe gerade die .mp3 wird erstellt, hat aber 0 KB…

zum spass hab ich es mal mit einem bild versucht wie in der doku.
<?

$remoteImage = „http://www.ip-symcon.de/fileadmin/templates/img/ipSymconLogo.png“;
$localImage = IPS_GetKernelDir()."\media\bild.png";

//Downloaden
$content = @file_get_contents($remoteImage);

//Speichern
file_put_contents( $localImage, $content );

?>

auch dieses hat 0 kb… hier kommt keine fehlermeldung, firewall ist aus…

gar keine. Irgend eine Firewall die dir das blockt.

Ersetze mal zum Testen file_get_contents mit Sys_GetURLContent

aha… jetzt kommt:
Warning: Socket Error # 10107
in [Speak] on line 18

firewall ist aus…
PS. mp3.datei hat immer noch 0 KB
was mir grad noch einfällt, als ich die pop3 instanz ausprobiert hab kam glaub eine ähnliche meldung, hab mich damit aber nicht weiter beschäftigt, da ich es noch nicht wirklich brauche…
fakt ist jetzt:
alles was aus ips auf das inet zugreifen will geht nicht…
ich bin hier in frankreich, mein internet habe ich über wlan in einem hotelzimmer, quasi ein abieter wo ich zuerst auf der „offline“ seite verbinden klicken muss… zum zeitpunkt aller fehlermeldungen ob google-audio-problem, bild-download-problem oder pop3-verbindungsproblem bin ich aber mit dem internet verbunden…
ist es vielleicht ein grundsätzlicher bug?

Zuerst mal vielen dank für euer Engagement mir zu helfen, so schnell wurde mir noch nie in einem Forum geantwortet!!! DANKE!

WSASYSCALLFAILURE 10107 System call failure. (WS2)
hilft mir aber auch nicht wirklich als ansatz zur problemfindung weiter…

das hab ich auch schon gefunden, bringt mir aber auch nichts…

ich bin hier in frankreich, mein internet habe ich über wlan in einem hotelzimmer, quasi ein abieter wo ich zuerst auf der „offline“ seite verbinden klicken muss… zum zeitpunkt aller fehlermeldungen ob google-audio-problem, bild-download-problem oder pop3-verbindungsproblem bin ich aber mit dem internet verbunden…
Weist Du wie die Firewall Einstellung des Hotels ist, eher nicht. Bevor Du jetzt weiter Fehler suchst, die eventuell gar keine sind, würd ich erstmal probieren eine andere Zugangsmöglichkeit zufinden. Z.B. UMTS wo Du Herr des Zugangs bist. :wink:

$content = @file_get_contents($remoteImage);

Hier kommt keine Fehlermeldung, da Du sie mit dem @ unterdrückst.!

das kann ich dann leider erst nächste woche in deutschland, hier hab ich keine andere möglichkeit

wobei aber mein emailprogramm (thunderbird) auf den pop3 zugreifen kann, und die direkte browsereingabe bei dem bild als auch bei der audio übersetzung funktionieren, also sehe ich das problem eigentlich schon eher bei ips…

Ich nutze dies sicher schon seit über einem Jahr, doch seit Anfang der Woche ist die Abspiel-/Ausprache-geschwindigkeit extrem langsam.

Hat dies noch jemand beobachtet ?
Gibt es evtl. einen Speed switch ?

Werde auch mal recherieren …

Kann ich auch bestätigen. Bin bisher nur noch nicht dazu gekommen mich darum zu kümmern.