TTS_Speak unter Windows7

Hallo,

geht denn jetzt eigentlich unter Windows 7 die TTS Speak Funktion, wenn man den IPS Dienst unter dem Benutzeraccount startet?

Bei mir kommt trotzdem der OLE80045063 ERROR?:confused:

Danke und Gruß,
Andreas

Hi,

ich gehe über den Umweg über TTS generate file und abspielen über den Mediaplayer… Das funktioniert seit Monaten unter XP und nun auch unter W7 stabil.

TTS out of the Box mit „Steffi“ läuft bei mir irgendwie auch nicht ist aber nur eine Randeffekt.

Gruss
B71

ich gehe über den Umweg über TTS generate file und abspielen über den Mediaplayer

Da müsste ich ganz schön viel ändern, da ich viel TTS verwendet habe.
Und zeitlich wird es vermutlich auch etwas verzögert ausgegeben.

Es gibt bestimmt irgendeine versteckte Registry Einstellung, um das rechtemässig mit dem TTS_Speak hinzubekommen…:o

Hallo Andreas,

Lösungsansätze gab es ja im Forum schon den manchen, doch bei den meisten funktioniert es nicht, so auch bei mir.

Ich erzeuge die Ausgaben auch mit TTS_Generate… und der Zeitversatz ist minimal und wahrscheinlich nicht mal auswertbar.

Apropo Zeitversatz. Sollte der Text immer der selbe sein mußt Du diesen ja nicht mit TTS_Generate… neu erzeugen sondern kannst ihn beliebig oft verwenden da er ja auch der Platte als WAV vorliegt. Einzig das erzeugen dauert ein paar Millisekunden.

Muss man denn den IPS Dienst unter dem Benutzeraccount starten, wenn man den Generate Befehl verwendet?

Nunja, da habe ich jetzt einiges an Arbeit vor mir, vielleicht lässt sich ja etwas über „Suchen/Ersetzen“ abwickeln…:wink:

Danke!

Denk dran noch die Id des Mediaplayers vorne im Script zu Beginn mit zu deklarieren…

Da hatte ich etwas gebraucht das so rauszudeuten…

Wenn Du die Ansage immer gleich ausgibst kannst Du nach einmaligem Durchlauf
2// vor das tts_generatefile packen und die Verzögerung ist unmerkbar.

Gruss
B71

Nein Andreas, der lauft mit dem normalen Systemaccount.

Bzgl. Suchen/Ersetzen würde ich dies mit einem externen Editor machen. Vorschläge waren bereits im Forum.

Danke schonmal für die Infos.

Bzgl. Suchen/Ersetzen würde ich dies mit einem externen Editor machen. Vorschläge waren bereits im Forum.

Hast du zufällig einen Link, ich bin selbst nicht fündig geworden?

Moin Andreas,

Ich nutze Notepad++, reicht für meine Bedürfnisse aus.

Moin Werner,

Ich nutze Notepad++,

Gibt es da einen Trick, wie man die ganze Zeile automatisiert ersetzen kann, da man ja am Anfang UND am Ende etwas ändern muß, z.B. mittels Wildcards? (Suchen/Ersetzen alleine nach „true);“ wird nicht hinhauen.)

also aus:
TTS_Speak(54417 ,„Test“, true);

muß
TTS_GenerateFile(54417 ,„Test“, „d: est.wav“, 19);
WAC_PlayFile(46969,„d: est.wav“);

werden.

Probier es doch mal genau so in den Suchen/Ersetzen-Dialog einzusetzen. Die finale Variante solltest Du halt in eine Zeile setzten, das Semikolon setzt ja die Trennung korrekt, muss halt später nur nachformatiert werden.

muss halt später nur nachformatiert werden.

Ja, ganz automatisch wirds wohl nicht gehen.

Ich habe gerade festgestellt, daß meine TTS Ausgabe mit überlagertem Sound nun nicht mehr funktioniert. Jetzt wird mit dem WAC_Play_File erst der eine Sound, und dann der generierte Text ausgegeben. Der 1. Sound ist dann nicht mehr zu hören.

Mit Anlage einer zweiten Mdeiaplayer Instanz hat sich das jedoch lösen lassen.:slight_smile:

Ich würde dir empfehlen ein zentrales Script für die Sprach/Audioausgabe zu benutzen.
Beispiele findest du hier: http://www.ip-symcon.de/forum/f53/komfortable-tts-ausgabe-funktion-6488/#post53395
Du wirst sonst wahrscheinlich Probleme bekommen wenn 2 Scripte gleichzeitig was abspielen wollen.

Ja, dieses Script vom Ferengi ist super.

Ich schreibe alles, was gesprochen werden soll immer in eine Variable, die dieses Script triggert.
Somit gibt es keine Probleme mit anderen Scripts.

Das Problem bei diesem Script war allerdings, das wenn mehrere Ansagen kommen, die vorhergehende abgebrochen wird und durch die neue ersetzt wurde.
Ich habe das dann so geändert, das die „Sprachvariable“ gequeued wird und immer nur dann die nächste Ansage ans Script weiterleitet, wenn die vorhergehende beendet ist.
Das funktioniert so super.

Baue das gerade für die Squeezebox um, hier hört sich die Sprachausgabe noch besser an.

Doc

Ich habe das dann so geändert, das die „Sprachvariable“ gequeued wird und immer nur dann die nächste Ansage ans Script weiterleitet, wenn die vorhergehende beendet ist.
Könntest du dein geändertes Skript hier posten?

Kann das Skript auch während der Sprachausgabe leise den Sound weiterspielen?

Danke vielmals!:slight_smile:

Ferengi hat da so einige Sachen mit eingebaut, ich habe das auf Faden stehen, dann wird die Musik langsam runter gefahren, die Sprachansage und dann die Musik wieder hochgeregelt.

Das Script ist ziemlich simpel, ich stelle das wenn ich an der Rechner komme mal hier rein.
Vllt. kann jemand das noch ein bisschen verfeinern.

Aber probier erstmal Ferengis Script so aus, wie es ist.

Grüße,
Doc

So,

ich habe mal das Script für die Sprachausgabevariable angefügt, kann mit Sicherheit noch verbessert werden.
Seitdem ich das benutze, wird aber alles ohne weitere Abbrüche gesprochen, auch wenn neu Meldungen wärend dessen hinzu kommen.
Ich benutze allerdings Vista, aber Verhalten sollte mit W7 identisch sein.

Vllt. hilft dir das weiter …

Grüße,
Doc

/*
Variable Speak wird gequeued und nacheinander in Speak_now geschrieben, wo sie dann
durch das Sprachscript Speak ausgegeben wird, bis die Queue leer ist.
*/

$Var_ID_Speak_new = 51916 /*[Programme\Sound\Speak SK1\Speak\Speak]*/;
$Var_ID_Speak_Queue = 17702 /*[Programme\Sound\Speak SK1\Speak\Speak_Queue]*/;
$Var_ID_Status_Instance = 55349 /*[Programme\Sound\Speak SK1\Media Player Speak SK1\Status]*/;
$Var_ID_Speak_Var = 33558 /*[Programme\Sound\Speak SK1\Speak\Speak_now]*/;

// Meldung hinzufügen
if ($IPS_SENDER == "Variable"){
   if ($IPS_VARIABLE == $Var_ID_Speak_new){
		$Speak_new = GetValueString($Var_ID_Speak_new);
		$Speak_to_add = $Speak_new."
";
		$Speak_Queue = GetValueString($Var_ID_Speak_Queue);
		$Speak_all = $Speak_Queue.$Speak_to_add;
		SetValueString($Var_ID_Speak_Queue, $Speak_all);
      IPS_SetScriptTimer($IPS_SELF, 1);
	}
}
//-----------------------------------------------------------------------

if ($IPS_SENDER == "TimerEvent"){

// Meldungen zählen
$Speak_all = GetValueString($Var_ID_Speak_Queue);
$Speak_chunk = explode("
", $Speak_all);
$amount_Speak = count($Speak_chunk) - 1;


$Status = GetValueInteger($Var_ID_Status_Instance);

if ($amount_Speak > 0) {
	if ($Status == 3){
		SetValueString($Var_ID_Speak_Var, $Speak_chunk[0]);
		unset ($Speak_chunk[0]);
		$Speak_all = array_merge($Speak_chunk);
		$Speak_all = implode("
", $Speak_all);
		SetValueString($Var_ID_Speak_Queue, $Speak_all);
	}else{
      IPS_SetScriptTimer($IPS_SELF, 2);
	}
}else{
   IPS_SetScriptTimer($IPS_SELF, 0);
	}
}