NEWS
Textlänge für Sprachausgaben (TTS) über SayIt
-
Guten Abend,
ich wundere mich immer, wie manche ganze "Romane" über Sayit ausgeben lassen ohne dass diese offenbar abgeschnitten / abgehackt sind. Die Textlänge (ich verwende Ivona) ist ja begrenzt. Wie lässt sich sowas bewerkstelligen?
Gerne hätte ich am Morgen einen kurzen Bericht mit aktuellen Wetterdaten, doch das ist alles "zu lang".
Ich überlege mir eventuell ein Sonos zuzulegen. Doch wenn hier nur "Kurzmeldungen" möglich wären ist dies auch nicht das Wahre. Kostet ja n' bisschen was.
Für Tipps, Ratschläge und sonstiges bin ich sehr dank bar.
Gruß
Thomas
-
Guten Abend,
ich wundere mich immer, wie manche ganze "Romane" über Sayit ausgeben lassen ohne dass diese offenbar abgeschnitten / abgehackt sind. Die Textlänge (ich verwende Ivona) ist ja begrenzt. Wie lässt sich sowas bewerkstelligen?
Gerne hätte ich am Morgen einen kurzen Bericht mit aktuellen Wetterdaten, doch das ist alles "zu lang".
Ich überlege mir eventuell ein Sonos zuzulegen. Doch wenn hier nur "Kurzmeldungen" möglich wären ist dies auch nicht das Wahre. Kostet ja n' bisschen was.
Für Tipps, Ratschläge und sonstiges bin ich sehr dank bar.
Gruß
Thomas `
Benutze Ivona. -
Hi Bluefox,
ja habe ich inzwischen im Einsatz. Das Skript läuft soweit auch.
Jetzt hapert es nur noch daran, das ich nicht weiß wie man das Skript triggert um es auszulösen.
Welchen Befehl muss ich wohin schreiben damit dies funktioniert.
Ich konnte dazu im Forum leider nichts finden was mir weiter helfen konnte.
Gruß Thomas
-
Hi Bluefox,
ja habe ich inzwischen im Einsatz. Das Skript läuft soweit auch.
Jetzt hapert es nur noch daran, das ich nicht weiß wie man das Skript triggert um es auszulösen.
Welchen Befehl muss ich wohin schreiben damit dies funktioniert.
Ich konnte dazu im Forum leider nichts finden was mir weiter helfen konnte.
Gruß Thomas `
Wie sieht dein Skript aus? -
Das Skript ist hier aus dem Forum und wurde von mir etwas angepasst.
!
//sayyit adapter var idSayIt = "sayit.0.tts.text" /*Text to speech*/; ! //Wochentag ermitteln var d = new Date (); var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); var w = weekday[d.getDay()]; ! //Tagesdatum ermitteln var t = d.getDate(); ! //Monat ermitteln var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"); var m = month[d.getMonth()]; ! //Jahr ermitteln var j = d.getFullYear() ! //Stunde ermitteln h = d.getHours() ! //Minute ermitteln mi = d.getMinutes() ! // Die Außentemperatur ist xx. Das Wetter heute ist xx // Einfache Temperaturansage mit SayIt. // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht // "Es sind 18 Punkt 2 Grad " sagt. ! var Temperatursensor = getState("yr.0.forecast.day0.temperature_actual"); /*Temperatursensor:1.TEMPERATURE*/ var temperatur = Temperatursensor.val.toString(); var temp_array = []; ! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /*Forecast of temperature for today*/ var maxtemp = MaxTemperatur.val.toString(); var maxtemp_array = []; ! var witterung = getState("yr.0.forecast.day0.text").val ; /*Actual text*/ log('Wetter: ' + witterung); ! temp_array = temperatur.split("."); ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist. // Es wird dann nur "18" gelesen. if (!temp_array[1]) { temp_array[1] = "0"; log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt."); } ! maxtemp_array = maxtemp.split("."); ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist. // Es wird dann nur "18" gelesen. if (!maxtemp_array[1]) { maxtemp_array[1] = "0"; log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt."); } ! setState (idSayIt, "Guten Morgen. heute ist " + w + "der " + t + "te" + m + j + ", Es ist" + h + "Uhr und " + mi + "Minuten" + " , Die Temperatur ist " + temp_array[0] + "," + temp_array[1] + " Graad." + witterung + ". Maximal heute." + temp_array[0] + "," + temp_array[1] + "Graad"); !
Es läuft - solange es manuell gestartet wird. Das mit dem Trigger / schedule bekam ich nicht zum laufen.
-
Das muss auf irgendein Ereignisse gekoppelt werden. Wie willst du es Triggern?
Zeitlich oder zum Beispiel über Bewegungselber?
-
Das muss auf irgendein Ereignisse gekoppelt werden. Wie willst du es Triggern?
Zeitlich oder zum Beispiel über Bewegungselber? `
Zeitlich war ursprünglich angedacht.
Nicht uninteressant wäre auch über Bewegungsmelder - dann allerdings nur 1x (z.B. 1x zwischen 6 und 7 Uhr) und dann für den Rest des Tages nicht mehr.
OffTopic: Habe es eben nochmals von Hand gestartet. Ivona scheint auch ein "Längenproblem" zu haben. Der Satz wurde leicht abgeschnitten ("Maximal heute 9 komma…...)
-
Hallo,
ich würde es so machen:
!
//sayit adapter var idSayIt = "sayit.0.tts.text"; // Text to speech var heutenochansagen = true; // Flag für heutige Ansage ! function baueAnsage() { //Wochentag ermitteln var d = new Date (); var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); var w = weekday[d.getDay()]; ! //Tagesdatum ermitteln var t = d.getDate(); ! //Monat ermitteln var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"); var m = month[d.getMonth()]; ! //Jahr ermitteln var j = d.getFullYear() ! //Stunde ermitteln h = d.getHours() ! //Minute ermitteln mi = d.getMinutes() ! // Die Außentemperatur ist xx. Das Wetter heute ist xx // Einfache Temperaturansage mit SayIt. // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht // "Es sind 18 Punkt 2 Grad " sagt. ! var Temperatursensor = getState("yr.0.forecast.day0.temperature_actual"); /*Temperatursensor:1.TEMPERATURE*/ var temperatur = Temperatursensor.val.toString(); var temp_array = []; ! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /*Forecast of temperature for today*/ var maxtemp = MaxTemperatur.val.toString(); var maxtemp_array = []; ! var witterung = getState("yr.0.forecast.day0.text").val ; /*Actual text*/ log('Wetter: ' + witterung); ! temp_array = temperatur.split("."); ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist. // Es wird dann nur "18" gelesen. if (!temp_array[1]) { temp_array[1] = "0"; log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt."); } ! maxtemp_array = maxtemp.split("."); ! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist. // Es wird dann nur "18" gelesen. if (!maxtemp_array[1]) { maxtemp_array[1] = "0"; log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt."); } var ansage = "Guten Morgen. heute ist " + w + "der " + t + "te" + m + j + ", Es ist" + h + "Uhr und " + mi + "Minuten" + " , Die Temperatur ist " + temp_array[0] + "," + temp_array[1] + " Grad." + witterung + ". Maximal heute." + temp_array[0] + "," + temp_array[1] + "Grad"; ! setState (idSayIt, ansage); } ! var idMotion = "hm-rpc.0.XXX1234567.STATE" // ID des Bewegungsmelders on (idMotion, function (obj) { if (obj.state.val === true && heutenochansagen === true) { var jetzt = new Date(); var stunde = jetzt.getHours(); var wochentag = jetzt.getDay() // wenn werktags zwischen 6 und 7 Uhr oder am Wochenende zwischen 8 und 9 Uhr if ( ((stunde > 6 && stunde < 7) && (wochentag > 0 && wochentag < 6)) || ((stunde > 8 && stunde < 9) && (wochentag == 0 || wochentag == 6)) ) { baueAnsage(); heutenochansagen = false; log('Sayitausgabe Tagestemperatur durch Bewegungsmelder ausgelöst'); } } }); ! // bei Skriptstart immer ansagen baueAnsage(); log('Sayitausgabe Tagestemperatur durch Scriptstart ausgelöst'); // jeden Werktag um 6:00h schedule("0 6 * * 1-5", function() { if (heutenochansagen === true) { // wenn heute noch angesagt werden muss baueAnsage(); // Ansage bauen heutenochansagen = false; // flag für heutige Ansage auf false log('Sayitausgabe Tagestemperatur durch Schedule Werktag ausgelöst'); } }); // jeden Wochenendtag um 8:00h schedule("0 8 * * 6,7", function() { if (heutenochansagen === true) { baueAnsage(); heutenochansagen = false; log('Sayitausgabe Tagestemperatur durch Schedule Wochenende ausgelöst'); } }); // Flag für Ansage um Mitternacht zurücksetzen auf true schedule("0 0 * * *", function() { heutenochansagen = true; }); !
Beachte: Bei Skriptstart (also beim Ändern des Skriptes oder Javascript-Instanz-Neustart wird das Flag zur Ansage wieder auf true gesetzt.Es gibt im Forum eine Funktion isTimeInRange, die eigentlich für das Triggern innerhalb eines Zeitraums da ist. Lies dich mal ein. Habe das jetzt hier mal etwas einfacher gelöst.
Gruß
Pix
-
Vielen Dank Pix. Ich werde mich da mal einlesen.
Mein Problem ist einfach - bei son manchen Dingen - dass mir ein zum einlernen geeignetes Beispiel fehlt.
Wenn man erst mal eine funktionierende Sache hat, dann lässt sich darauf aufbauen (lernen).
Schönen Tag Dir noch.
Gruß
Thomas
-
Ich möchte noch schnell eine Rückmeldung geben.
Das mit den Skripten klappt soweit.
Einziges Problem welches zu beobachten ist. Ivona schneidet die Ansagen teilweise ab.
Beispiel: Ansage wäre "Alle Wetterwarnungen des Deutschen Wetterdienstes wurden aufgehoben"
Ansage war dann: "Alle Wetterwarnungen des Deutschen Wetterdienstes wurden au"
Woran kann das noch liegen? Ich hänge mal einen Screenshot der Adapter Javaskript und Sayit hier mit an. Ich kann an den Einstellungen nichts falsches sehen. Unklar ist mir nur die Zeile bei Javaskript mit den Modulen. Ob das im Zusammenhang steht?
Gruß
Thomas