Fehler TTS_GenerateFile

Hallo an Alle,

ich habe seit der letzten Version den Fehler(Screenshot) bei dem folgenden Aufruf.
Nach dem Neustart von IPS geht es wieder eine Weile und dann nicht mehr.

$FileNameSpeech = IPS_GetKernelDir().$Sprachfile."_".$PlayFileCount.".wav";
TTS_GenerateFile($ID_TTS_Player ,$arraySpeech[$i][„TextToSpeech“]."…", $FileNameSpeech ,$Quality);

hat einer Ideen?

Ich kann doch nicht der Einzige mit diesem Fehler sein?

So nun habe ich mal von Ivona Marlene auf Hedda von Microsoft umgestellt und es ist das gleiche. Nach längerer zeit geht TTS_GenerateFile nicht mehr.
Neustart von IPS und alles ist wieder gut.
Ich habe auch eine Version von Anfang November probiert aber da ist es das gleiche.

Jetzt weiss ich nicht mehr weiter.
Hier nochmal der Fehler im Log.
Dateiname xxxxxxxxxxxxxxxxx C:\IP-Symcon\media\speech\sprache_71712.wav<br />
<b>Warning</b>: Speak gescheitert in <b>C:\IP-Symcon\scripts\17452.ips.php</b> on line <b>146</b><br />

Vielleicht kann das mal jemand in den allgemeinen Bereich verschieben. Kann ja sein das es eine Lösung gibt.

in vorherigen Versionen(Ich weiss nicht welche) hat es anstandslos funktioniert.

Ich kann den Fehler hier bisher nicht nachstellen. Ich habe zum nächsten Update aber mal ein paar mehr Debug-Informationen eingebaut, sobald der Fehler auftritt.

paresy

Das ist der Fehler der nun im Log steht.

<b>Warning</b>: Speak gescheitert (-2147467260) in <b>C:\IP-Symcon\scripts\17452.ips.php</b> on line <b>146</b><br />

Na was ist nun hier? Ich starte mein IPS täglich mehrmals neu.

Ich habe zum nächsten Update noch ein paar mehr Debug Informationen hinzugefügt. Ich kann das Problem bei mir leider nicht nachstellen. Egal wie viel Dateien ich generiere. Die halbe Platte war schon voll mit WAV Dateien :slight_smile:

paresy

Hier die neuste Meldung mit der V 1011

02.12.2016 21:09:57*| ScriptEngine*| Ergebnis für Ereignis 50887
<br />
<b>Warning</b>: Speak gescheitert (-2147467260) in <b>C:\IP-Symcon\scripts\17452.ips.php</b> on line <b>145</b><br />

OK. Danke. Ich werde dann mal auf die Suche gehen. Wundert mich nur ein wenig, dass es scheinbar keinen anderen betrifft.

paresy

Ich habe es jetzt mal analysiert. Ich kann Wave Dateien generieren wie ich will, das funktioniert. …mit einem Programm oder in der Weborberfläche mit einem Button der Sprachnachrichten ausgibt.ich bekomme den Fehler nicht manuell provoziert.
Das Problem tritt irgendwann, nach Stunden auf. Ich habe im Log nachgeschaut und nichts gefunden. Ich habe an dem Code dafür seit Jahren nichts geändert. Es hat immer funktioniert.

Guten Morgen zman0801!

Wir haben nun alles probiert um den Fehler zu provozieren und haben jetzt stundenlang TTS-Dateien generiert und abgespielt. Kein Ereignis.
Wäre es vielleicht doch möglich das gesamte Skript von dir zu erhalten um es damit zu testen?
Und die genaue Konfiguration wäre auch interessant.

Grüße
Pio

@IP-Symcon developer

hier das gewünschte Script.
Es wird alle 2 Sekunden ausgeführt lädt ein array und spiet alle darin enthaltenen Einträge ab.
Die IVONA (Marlene Stimme habe ich deinstalliert). wie gesagt es funktioniert eine Weile irgendwann spielt das System nur noch die Files davor und danach ab(Signaltöne). Die Sprachdatei wird nicht mehr erzeugt. Mein Windows 10 habe ich auch neu installiert.


<?
include(IPS_GetScriptIDByName("include_Player",49186 /*[Scripts\Multimedia]*/ ).".ips.php");
//include(IPS_GetScriptIDByName("include_HM_functions",58036 /*[Scripts\Allgemein]*/ ).".ips.php");
$ID_AMP_SCHALTEN = 37027 /*[Systeminstanzen\Multimedia\Video/Audio Matrix\AMP_EIN_AUS_SCHALTEN]*/ ;
$ID_Player = 13119 /*[Systeminstanzen\Multimedia\Mediaplayer\Player 1 - EG Eingang USB 3\MPlayer 1]*/;
$ID_WAV_Player = 29973 /*[Systeminstanzen\Multimedia\Mediaplayer\Player 1 - EG Eingang USB 3\MPlayer WAV 1]*/;
$ID_WAV_Player_Status = 36893 /*[Systeminstanzen\Multimedia\Mediaplayer\Player 1 - EG Eingang USB 3\MPlayer WAV 1\Status]*/ ;
$ID_Player_Status = 47113 /*[Systeminstanzen\Multimedia\Mediaplayer\Player 1 - EG Eingang USB 3\MPlayer 1\Status]*/;
$ID_Player_Volume = 33513 /*[Systeminstanzen\Multimedia\Mediaplayer\Player 1 - EG Eingang USB 3\MPlayer 1\Volume]*/;
$ID_Player_Volume_Save = 29081 /*[Systeminstanzen\Multimedia\Mediaplayer\Player 1 - EG Eingang USB 3\MPlayer 1\Volume_Save]*/ ;
$ID_TTS_Player = 23471 /*[Systeminstanzen\Multimedia\Mediaplayer\Player 1 - EG Eingang USB 3\TTS 1]*/;
$ID_Playing = 48642 /*[Systeminstanzen\Multimedia\Mediaplayer	ts_Playing]*/;
$ID_Volume = 33367 /*[Systeminstanzen\Variablen\Multimedia\Sprachausgabe\Volume]*/ ;
$ID_PlayFileCount = 56906 /*[Systeminstanzen\Variablen\Multimedia\Sprachausgabe\playFileCount]*/ ;
$ID_SprachnachrichtAlsText = 20641 /*[Systeminstanzen\Variablen\Multimedia\Sprachausgabe\Sprachnachricht als Text ausgeben]*/;
$ID_Webfront = 51869 /*[ZU-HOME]*/;
$FaktorVolume = 0.1;
$Quality = 38;
$Sprachfile = "media\speech\sprache";
$PlayVolume = 0;
$count = 0;
$maxcount = 500;
$PauseNachKanalumschaltung = 350;
$PauseVorKanalZurueckschalten = 2000;
$PauseNachAmpSchalten = 50;
$ZeitBisAmpFertig = 3000;
$EreignisID = 50887 /*[Zeitgesteuerte Scripts\Multimedia\Sprachausgabe\]*/;
$ID_Text_To_Speech = 31499 /*[Systeminstanzen\Variablen\Multimedia\Sprachausgabe\Text_to_Speech]*/ ;
$SemaPhoreTextToSpeech = "TextToSpeechLocked";
$SpeechRunning = "SpeechRunning";
//während der Sprachausgabe darf in der Funktion welche die Eingänge der AV matrix umschaltet
//kein Verstärker geschalten werden da das schon in der Play Funktion passiert
//setvalueBoolean(37027 /*[Systeminstanzen\Multimedia\Video/Audio Matrix\AMP_EIN_AUS_SCHALTEN]*/ ,false);
//if (Count($arraySpeech) > 0) {
if (getvalue($ID_Text_To_Speech) <> "") {
	if (IPS_SemaphoreEnter($SpeechRunning,200)) {
		IPS_SetEventActive($EreignisID, false);
		if($PlayVolume <= 0) {
			$PlayVolume = 20;
		} else {
			$PlayVolume = $PlayVolume * $FaktorVolume;
		}
		//Verhindern das die Amps durch die Funktionen der AV Matrix geschaltet werden
		setvalueBoolean($ID_AMP_SCHALTEN,false);
		// Player SET Variable Setzen damit dieser gespielt wird 0 bedeutet alle spielen
		$AMP_set = false;
		// alle notwendigen Verstärker einschalten
		//echo "jetzt gehts los";
		for($i = 1; $i <= count($MPlayer); $i++ ) {
		  	if ($MPlayer[$i]["ID_AMP_STATUS"] > 0)
				$MPlayer[$i]["AMP_STATUS_SAVE"] = getvalueboolean($MPlayer[$i]["ID_AMP_STATUS"]);
			//wenn Verstärker aus ist -> einschalten und 200 ms warten
			if ($MPlayer[$i]["ID_AMP_STATUS"] > 0){
				//echo " ID ".$MPlayer[$i]["ID_AMP_STATUS"]. " Amp ".$i." ".$MPlayer[$i]["AMP_STATUS_SAVE"]." ";
				if ($AMP_set == false) $AMP_set = true;
				if ($MPlayer[$i]["ID_AMP"] > 0) {
					HM_WriteBoolean($MPlayer[$i]["ID_AMP"],"STATE", getvalueBoolean($MPlayer[$i]["ID_SPEECH_ENABLED"]));
					//WriteBoolean_HM($MPlayer[$i]["ID_AMP"], true);
	            ips_sleep($PauseNachAmpSchalten);
		     	}
		   }
		}
		for($i = 1; $i <= count($MPlayer); $i++ ) {
	 		if ($MPlayer[$i]["ID_AV_EINGANG"] > 0) {
				$MPlayer[$i]["AV_EINGANG_SAVE"] = getvalueinteger($MPlayer[$i]["ID_AV_EINGANG"]);
		     	//print_r ("save ".$MPlayer[$i]["AV_EINGANG_SAVE"]."- ID: ".$MPlayer[$i]["ID_AV_EINGANG"]."
");
		     	if (getvalueBoolean($MPlayer[$i]["ID_SPEECH_ENABLED"])) {
					setvalueInteger($MPlayer[$i]["ID_AV_EINGANG"],1);
					if ($PauseNachKanalumschaltung > 0) IPS_sleep($PauseNachKanalumschaltung);
				}
			}
	  	}
	 	// wenn ein Verstärker eingeschaltet wurde dann warten bis er bereit ist
		//if ($Hintergrundtitel<>"") {
		//	  WAC_PlayFile($ID_Player,$Hintergrundtitel);
		//}
		if ($AMP_set == true) {
			IPS_Sleep($ZeitBisAmpFertig);
		} else {
			ips_sleep(500);
		}
		$MusicPlayer_Status = getValueInteger($ID_Player_Status);
	   	$MusicPlayer_Volume = getValueInteger($ID_Player_Volume);
		if ($MusicPlayer_Status == 1) {
			WAC_SetVolume($ID_Player,(int)($MusicPlayer_Volume * 0.3));
			IPS_Sleep(300);
			WAC_SetVolume($ID_WAV_Player,$PlayVolume);
		}
		WAC_ClearPlaylist($ID_WAV_Player);
		while (getvalue($ID_Text_To_Speech) <> "") {
	    	if (IPS_SemaphoreEnter($SemaPhoreTextToSpeech,200)) {
				$arraySpeech = array();
				$text = getvalue($ID_Text_To_Speech);
				setvalue($ID_Text_To_Speech,"");
				$arraySpeech = unserialize($text);
				ips_sleep(300);
				//print_r ($arraySpeech);
				IPS_SemaphoreLeave($SemaPhoreTextToSpeech);
				$PauseNachSprachausgabe = 0;
				//$FilesToPlay = array();
				WAC_SetRepeat($ID_WAV_Player, false);
				for ($i = 0; $i < (count($arraySpeech)); $i++ ) {
					switch ($arraySpeech[$i]["ID_SignalTon"]) {
	     				case 0:	$StartSound = "";
		 						$EndSound = "";
		 						break;
		 				case 1:	$StartSound = "c:\IP-Symcon\sounds\start.mp3";
		 						$EndSound = "c:\IP-Symcon\sounds\Ende.mp3";
		 						break;
		 				case 2:	$StartSound = "c:\IP-Symcon\sounds\Notify1.wav";
		 						$EndSound = "";
		 						break;
		 				case 3:	$StartSound = "c:\IP-Symcon\sounds\Doppelgong.mp3";
		 						$EndSound = "";
		 						break;
		 				case 4:	$StartSound = "c:\IP-Symcon\sounds\DoppelgongHoch.mp3";
		 						$EndSound = "";
		 						break;
		 				case 5:	$StartSound = "c:\IP-Symcon\sounds\Microsong.mp3";
		 						$EndSound = "";
		 						break;
						case 6:	$StartSound = "c:\IP-Symcon\sounds\awareness.mp3";
		 						$EndSound = "";
		 						break;
		 			}
			      	//print_r( $arraytext);
			      	//print_r ($arraySpeech[$i]);
			      	//$PauseNachSprachausgabe = $PauseNachSprachausgabe + ((int) strlen($arraySpeech[$i]["TextToSpeech"]) / 10 * 1000);
			      	//Prüfen ob Signalton gespielt wird
					if (($arraySpeech[$i]["SignalTonOnOff"]) and ($StartSound <> "")) {
						WAC_AddFile($ID_WAV_Player,$StartSound);
						//ips_sleep(200);
			   		}
					if ($arraySpeech[$i]["Volume"] > 0) {
		            	$PlayVolume = $arraySpeech[$i]["Volume"] * $FaktorVolume;
					} else {
						$PlayVolume = getvalueInteger($ID_Volume) * $FaktorVolume;
					}
	            	WAC_SetVolume($ID_WAV_Player,$PlayVolume);
		  			if ($arraySpeech[$i]["TextToSpeech"] <> "") {
						//WAC_SetVolume($ID_WAV_Player,$PlayVolume);
	 					//ips_sleep(200);
	 					$PlayFileCount = getvalueInteger($ID_PlayFileCount);
	 					setvalueInteger($ID_PlayFileCount,$PlayFileCount + 1);
	 					$FileNameSpeech = IPS_GetKernelDir().$Sprachfile."_".$PlayFileCount.".wav";
	 					//print_r ("Dateiname xxxxxxxxxxxxxxxxx ". $FileNameSpeech);
		    			TTS_GenerateFile($ID_TTS_Player ,$arraySpeech[$i]["TextToSpeech"]."......", $FileNameSpeech ,$Quality);
		    			//copy($FileNameSpeech, IPS_GetKernelDir()."media/saveSpeech/".time().".wav");
		    			//ips_sleep(800);
		    			$FilesToPlay[] = $FileNameSpeech;
						WAC_AddFile($ID_WAV_Player,$FileNameSpeech);
						ips_sleep(200);
         			}
		 			if (($arraySpeech[$i]["SignalTonOnOff"]) and ($EndSound <>"")) {
	     				WAC_AddFile($ID_WAV_Player,$EndSound);
	     	        }
					if (($arraySpeech[$i]["SendMessage"]) and (getvalueBoolean($ID_SprachnachrichtAlsText))) {
						WFC_SendNotification($ID_Webfront , "Hinweis", $arraySpeech[$i]["TextToSpeech"] , 'Information', 0);
					}
		   		}
		   		//ips_sleep(1000);
				 
		   		WAC_Play($ID_WAV_Player);
		   		ips_sleep(2000);
		   		$PlayerStatus = getvalueInteger($ID_WAV_Player_Status);
		   		while ($PlayerStatus == 1) {
		   	   		ips_sleep(1000);
		   	   		$PlayerStatus = getvalueInteger($ID_WAV_Player_Status);
		   		}
		   		ips_sleep(1000);
		   		//WAC_ClearPlaylist($ID_WAV_Player);
	      		//IPS_Sleep($PauseNachSprachausgabe);
	     	} else {
			   IPS_SetEventActive($EreignisID, true);
			   break;
			}
		}
		WAC_SetVolume($ID_Player, $MusicPlayer_Volume);
		IPS_Sleep($PauseVorKanalZurueckschalten);
	 	//AV MAtrix wieder in der Originalmodus schalten
		for($i = 1; $i <= count($MPlayer); $i++ ) {
			if ($MPlayer[$i]["ID_AV_EINGANG"] > 0) {
				setvalueInteger($MPlayer[$i]["ID_AV_EINGANG"],$MPlayer[$i]["AV_EINGANG_SAVE"]);
				ips_sleep(200);
			}
		}
		//ips_sleep(1000);
		//Verstärker wieder in den Originalmode schalten
		for($i = 1; $i <= count($MPlayer); $i++ ) {
			if (($MPlayer[$i]["ID_AMP"] > 0) and ($MPlayer[$i]["ID_AMP_STATUS"] > 0)) {
				HM_WriteBoolean($MPlayer[$i]["ID_AMP"], "STATE", $MPlayer[$i]["AMP_STATUS_SAVE"]);
				ips_sleep($PauseNachAmpSchalten);
			}
		}
		//print_r ($FilesToPlay);
	   	for($s = 0; $s < count($FilesToPlay); $s++ ) {
	   	   unlink($FilesToPlay[$s]);
	   	}
	   	$Medienobjekte = IPS_GetMediaList();
	   	foreach ($Medienobjekte as $Mob) {
	      	if ($Mob > 0) {
	      		$OInfo = IPS_GetMedia($Mob);
	      		if (!$OInfo['MediaIsAvailable']) IPS_DeleteMedia($Mob, true); 
	      	}
	   	}
		setvalueBoolean($ID_AMP_SCHALTEN,true);
		IPS_SetEventActive($EreignisID, true);
		IPS_SemaphoreLeave($SpeechRunning);
	}
}
?>

Nachtrag:

Hat es vielleicht irgendwas mit der Länge des Textes zu tun?

Mein Begrüßungstext ist etwas länger. Er sagt zum Beispiel die Tatorttermine aus dem Programm an.:slight_smile:

Neue Erkenntnis:
Wenn der Fehler kommt beim Generieren des Files kommt stelle ich in der Instanz des TTS Players auf die Microsoft Hedda um. Dann geht es wieder eine Weile bis auch bei der Hedda der Fehler kommt.

Moin zman!

Also ich hab jetzt zig Gigabyte und Tausende Soundfiles generiert… teils mit 40mb Größe.
Leider keine Fehler.

Wie oft generierst du eine Sprachdatei?
Kannst du mir den Text zukommen lassen mit dem du das TTS fütterst? (ruhig auch das serialized)
Wie serialized du die String Variable, aus der du die Sprache baust.
Wie ist dein Array genau aufgebaut?

Grüße
Pio

Gerne auch per Mail bzw. PN.

Ich befürchte, dass dieses Problem ein Vorläufer vom Absturz ist. Das TTS Modul verbraucht viel RAM. Somit ist es die erste Stelle an der es Hakt, wenn der Speicher für IPS knapp wird. Zumindest ist das die beste Theorie, welche ich bisher habe.

paresy

Um dieses Thema kurz abzuschließen: Es lag daran, das IP-Symcon zu wenig verfügbaren Arbeitsspeicher hatte.

paresy