Script für Text 2 Speech - Erzeugt WAV Dateien für ISDN Wiedergabe - Funktioniert!

Hallo zusammen,

war grad am basteln und wollte Euch mein kleines aber feines Script für die Wiedergabe von Text über IPS und ISDN nicht vorenthalten.
Es es gibt natürlich auch die eingebaute IPS-Funktion, allerdings funktioniert das hier auch und man kann ggf. noch etwas Einfluss nehmen.

Das Script erzeugt mit der Windows Text2Speech Engine wav-Dateien und legt diese in einem Ordner ab.
Für Anhand des MD5 Hashes werden die Dateien nur 1x erzeugt, beim wiederholten Aufruf wird nur der Dateiname zurückgegeben. (Force ist möglich).

Dazu ist es ggf. notwendig COM in der PHP INI zu aktivieren, wenn die Fehlermeldung kommt „COM Class not found“
extension=php_com_dotnet.dll
prüfen ob die dll im extension verzeichnis ist, falls nicht besorgen.

Klasse im Scriptordner ablegen, oder mit GUI Anlegen und korrekten Dateinamen vergeben!

<?
	/* cls_Text2wav.ips.php
		(c) 2012 by stele99 for ip-Symcon
  */
     class Text2Wav{
        /* Anleitung:
                - Datei aus web downloaden: RSSolo4GermanSteffiexe
                - Installieren
                -  Start ausführen (C:\Windows\SysWOW64\Speech\SpeechUX\sapi.cpl) nur bei 64Bit, sonst über Zwischenablage.
                - Steffi auswählen.
           */
         var $folder = "";
         var $voice  = "ScanSoft Steffi_Dri40_16kHz";
         var $rate = 0; // -10 to 10
         function __construct($lwavfolder = "") {
            if(!is_dir($lwavfolder)){
					 die('Folder does not exist.');
                return false;
              } else {
                if(substr($lwavfolder,-1) != "\\")$lwavfolder."\\";
                $this->folder = $lwavfolder;
              }
          }

          public function makeWav($stext = "", $force = false){
            if(!empty($stext )){
                   $filename = $this->folder.md5($stext).".wav";
                   if(@filesize($filename) == 0 || $force){
                      If(empty($Voice))$Voice = Null;
                      $speaker = new COM("SAPI.SpVoice");
                      $outputFile = new COM("SAPI.SpFileStream");
                      $format =  $outputFile->format;
                      $format->Type = 6;  // 8k Mono
                      $outputFile->Format = $format;
                      $outputFile->Open($filename, 3);
                      $speaker->AudioOutputStream = $outputFile;
                      $speaker->rate = -5;
                      // Speaker selektieren
							 $list = $speaker->GetVoices("Name=".$this->voice);
						    $speaker->Voice = $list->Item(0);
                      $speaker->speak($stext);
                      IPS_Sleep(500);
                    }
                      return $filename;
            } else {
              return false;
            }
          }
     }
?>

Hier mal ein Beispiel:


	require_once ("cls_Text2wav.ips.php");
	$sp = new Text2Wav(IPS_GetKernelDir()."/media/wavs/");
        $isdn_obj = 123324; // ISDN OBjekt

	$conn = ISDN_Connect($isdn_obj, "RUFNUMMER");

	do {
	    IPS_Sleep(500);
	    $callinfo = ISDN_GetConnectionInfo($isdn_obj, $conn);
	    
	} while ( ($callinfo["State"] != "4") || ($waitcount > $MaxWait)) ; // warten, bis abgenommen wurde

// Abgenommen
	    if ($callinfo["State"] == "4"){
	    	IPS_Sleep(500);
	    // Ansage abspielen
	    	$len = ISDN_PlayWave($isdn_obj, $conn, $sp->makeWav("Hallo automatische Ansage!")); // Spieldauer in ms
	    	IPS_Sleep($len+500); // warten bis abgespielt
	    	ISDN_StopPlay($isdn_obj, $conn);
	    	ISDN_Disconnect($isdn_obj, $conn);

Das ganze kann man natürlich vielfältigst verwenden.
In der Klasse kann man die Voice für die Sprachausgabe auswählen.
Damit Deutsch gut rüberkommt sollte die Stimme für Deutsche Sprache noch dazu installiert werden.
Funktioniert bei mir unter Windows Home Server 64Bit einwandfrei.

Viel Spass
Steffen

Da sucht man sich den Wolf und findet dann irgendwann:

TTS_GenerateFile - geht wohl auch einfacher :wink:
Allerdings funktioniert die o.g. Methode auch recht einfach.