TTS Sprachausgabe einer Fliesskommazahl

machmal werden auch Fragen beantwortet, die noch nicht gestellt wurden…

Wie du bereits bemerkt hast, wird eine Fließkommazahl die nach String gecastet wurde ein wenig seltsam ausgesprochen. Das liegt am ‚.‘ für den Dezimaltrenner - ein ‚,‘ (Komma) ist für Sprache besser geeignet.

Desweiteren sollte man bei der Sprachausgabe auch die Anzahl der Nachkommastellen begrenzen damit man nicht zugetextet wird. Eine Nachkommastelle sollte meistens reichen.

Versuche es mal mit folgendem Skript:


<?
$Temp1 = 22.56729;
 
TTS_Speak(47899, "Es sind ".float2speech( $Temp1, 1)." °");
 
 
function float2speech( $v, $r=1)
{
 return (str_replace ( ".", ",", round($v,$r)));
}
?>

Die Funktion float2speech() rundet den Fliesskommawert auf eine definierbare Anzahl von Nachkommastellen (hier 1) und ersetzt den Punkt durch ein Komma.

Gruss,
Olli

Super Idee ! Schön wäre noch, das bei mehr Kommastellen, jeweils nach jeder Zahl eine Leerstelle eingefügt würde.

Bei z.B. 1024,123° sagt „Steffie“ sonst : „eintausendvierundzwanzig komm einhundertdreiundzwanzig Grad“

Ich finde persönlich schöner: 1024,1 2 3°

„eintausendvierundzwanzig komm eins zwei drei Grad“

Hättest du hierfür ein Scriptvorschlag (Erweiterung)?

Grüße, Obi


function float2speech4obicom( $v, $r=1)
{
   return( ($v<0?'-':'').intval(abs($v)).','.preg_replace('#.*\. #','',preg_replace('#(.)#','\\1 ',round($v-intval($v),$r))) );
}

Hallo Olli,

vielen Dank … du scheinst mir ja ein echter php „Freak“ … ich blick ja fast nichts in deiner „einen power Zeile“. respekt …

(oben war noch alles klar …)

Grüße, Obi

die zeile ist schrecklich… ich hätte lieber einen einzigen simplen regulären ausdruck. das funktionierte aber nicht so auf anhieb und ich hatte keine lust damit weiterzuexperimentieren :frowning:

wenn du wissen willst wie die zeile funktioniert musst du die einzelstrings auseinandernehmen und schauen was passiert.

ansonsten kann man das ganze natürlich auch mit den standard stringfunktionen lösen - wege gibt’s viele dabei :slight_smile:

@obicom

hier hast du eine bessere Variante:


function float2speech4obicom( $v, $r=1)
{
   $s = strval(round($v, $r));
   if( preg_match( '#(.*)\.(.*)#', $s, $m))
      $s = $m[1].','.preg_replace('#(.)#', '\\1 ', $m[2]);
   return( $s );
}

ich weiß … das ich nichts weiß … :confused:

viele Dank … ich kann ja nur lernen … :wink:

Danke, Olli
die Kristallkugel sagt es klar und deutlich :smiley:

Seit einiger Zeit läuft bei mir schon die Temperatur ansage per TTS. Aber erst heute fällt mir auf, das die Minus Werte gar nicht richtig gesprochen werden. Wie löst man den Temperaturwert auf damit das Minus gesprochen wird?
Die Antwort vielleicht gleich in >>>Anleitungen / Nützliche PHP Scripte / Tipps & Tricks<<< schreiben. Da habe ich leider nicht gefunden.

Hi Heidewinkler,

ich mach das so, das ich die Aussentemperatur vergleiche ob die unter 0°C ist, und falls ja, in der Sprachausgabe ein „minus“ davor schreibe. Bei positiven Temperaturen bleibt das „minus“ weg.

Gruß
Thomas

Hallo Forum,

ich muß dieses Thema nochmal aufgreifen. Gibt es für „minus“ keine andere Möglichkeit. Ich lasse mir mehr als 5 Temperaturen ansagen da wird die Sache mit dem minus davorschreiben ein wenig aufwendig.:frowning:
Für jeden Vorschlag bin ích dankbar.

Gruß
Christian

Wenn deine Engine das nicht unterstützt und du ihr nicht nachhelfen willst musst du halt ne andere verwenden. Ist doch nicht sooo weit hergeholt, oder?

Also Hersteller und/oder Stimme wechseln.

Gruß,

Toni

Schreibe dir doch eine Funktion ala Speak($data) welche du in einer include Datei unterbringst und dann überall in deine Skripte einbindest.

In der Funktion kannst du dann alles notwendige hineincoden damit deine Sprachausgaben für Zahlen oder anderen übergebene Daten genau deinen Wünschen entsprechen.

Gruß
Olli

Also bei mir geht das so

$temp = 'die aussentemperratur beträgt'<-(hier kein leerzeichen dann kein minus da Bindestrich)
.getvalue(20957/*[Garten\Temperatur-Balkon\TEMPERATURE]*/ )

$temp = 'die aussentemperratur beträgt '<-(hier leerzeichen dann minus)
.getvalue(20957/*[Garten\Temperatur-Balkon\TEMPERATURE]*/ )

Gruß
schmiddi

Danke Schmiddi, das war der entscheidene Hinweis.:slight_smile: