Zeitansage (Standard Std:Min und Umgangssprachlich)

    • Offizieller Beitrag

    Hi,
    auch von mir eine kleine Spielerei mit TextToSpeech - eine Zeitansage.
    Voraussetzung ist also ein installiertes TextToSpeech mit deutschem Sprachpaket.
    Die Zeit wird standardmäßig angegeben in der Form: "12 Uhr und 15 Minuten"
    In der Slang-Variante heißt dieselbe Zeit dann: "Viertel 1" :D
    Ich habe in der Slang-Variante die in unserer Region üblichen Zeitregeln verwendet:
    1 - 14 min = Minuten nach Stunde
    15 = Viertel der Folgestunde
    16 - 29 = Minuten bis Halb der Folgestunde (z.B. "10 Minuten vor Halb 1")
    30 = Halb der Folgestunde
    31 - 44 = Minuten nach Halb der Folgestunde (z.B. "5 Minuten nach Halb 3")
    45 = DreiViertel der Folgestunde
    46 - 59 = Minuten bis zur Folgestunde
    Das könnt ihr ja bei Bedarf eurem Regionalen Gusto anpassen. :D

    _SpeakingClock
    [autoit]

    _SpeakingClock()
    ;~ _SpeakingClock(1)

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name...: _SpeakingClock
    ; Description.....: Ansage der aktuellen Zeit in Stunde:Minute (Standard) od. Slang
    ; Parameter(s)....: $fSlang 0-Aus (Standard), Umgangssprachliche Zeitansage, regional jedoch sehr verschieden
    ; Requirements....: TextToSpeech muß installiert sein mit einer deutschen Stimme
    ; Return Value(s).: Erfolg 1 (und Zeitansage)
    ; Fehler 0 und @error
    ; Author(s).......: BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _SpeakingClock($fSlang=0)
    Local $hour = @HOUR, $min = @MIN, $time, $speak1 = '', $speak2 = ' Minuten'
    Local $oTalk = ObjCreate('SAPI.SpVoice')
    If @error Then Return SetError(@error,0,0)
    If Not $fSlang Then
    If StringLeft($hour,1) = '0' Then $hour = StringTrimLeft($hour,1)
    Select
    Case $min = '00'
    $speak2 = ''
    Case StringLeft($min,1) = '0'
    $min = StringTrimLeft($min,1)
    If $min = 1 Then
    $speak1 = 'und Eine'
    $speak2 = ' Minute'
    Else
    $speak1 = 'und ' & $min
    EndIf
    Case Else
    $speak1 = 'und ' & $min
    EndSelect
    $time = $hour & ' Uhr ' & $speak1 & $speak2
    Else
    ; Stundenwert verweist auf nächste Stunde, da fast alle Zeitansagen dieses verwenden
    $hour += 1
    If $hour > 12 Then $hour -= 12
    Switch $min
    Case 46 To 59
    $min = 60 - $min
    $speak1 = $min
    $speak2 = ' vor ' & $hour
    Case 45
    $speak1 = -1
    $speak2 = 'Drei Viertel ' & $hour
    Case 31 To 44
    $min = $min -30
    $speak1 = $min
    $speak2 = ' nach Halb ' & $hour
    Case 30
    $speak1 = -1
    $speak2 = 'Halb ' & $hour
    Case 16 To 29
    $min = 30 - $min
    $speak1 = $min
    $speak2 = ' vor Halb ' & $hour
    Case 15
    $speak1 = -1
    $speak2 = 'Viertel ' & $hour
    Case 1 To 14
    $hour -= 1 ; hier wieder Bezug zur tatsächlichen Stunde
    If $hour = -1 then $hour = 12
    $speak1 = $min
    $speak2 = ' nach ' & $hour
    Case 0
    $hour -= 1 ; hier wieder Bezug zur tatsächlichen Stunde
    If $hour = -1 Then $hour = 12
    $speak1 = -1
    $speak2 = $hour & ' Uhr'
    EndSwitch
    Switch $speak1
    Case -1
    $speak1 = ''
    Case 1
    $speak1 = 'Eine Minute'
    Case Else
    $speak1 &= ' Minuten'
    EndSwitch
    $time = $speak1 & $speak2
    EndIf
    $oTalk.Speak('Die Zeit: ' & $time)
    Return 1
    EndFunc ;==>_SpeakingClock

    [/autoit]
    • Offizieller Beitrag

    Nettes Script BugFix , bei mit wird aber immer die Englische Stimme verwendet.
    Habe es mal ein bischen angepaßt, es kann nun Anna und Stefan in Deutsch verwendet werden.
    Ob es bei jedem funzt weiß ich nicht, muß also getestet werden. :thumbup:

    Spoiler anzeigen
    [autoit]

    _SpeakingClock(0,0)
    _SpeakingClock(0,1)

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name...: _SpeakingClock
    ; Description.....: Ansage der aktuellen Zeit in Stunde:Minute (Standard) od. Slang
    ; Parameter(s)....: $fSlang 0-Aus (Standard), Umgangssprachliche Zeitansage, regional jedoch sehr verschieden
    ; $Speaker 0 = Anna (Standard) 1 = Stefan
    ; Requirements....: TextToSpeech muß installiert sein mit einer deutschen Stimme
    ; Return Value(s).: Erfolg 1 (und Zeitansage)
    ; Fehler 0 und @error
    ; Author(s).......: BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _SpeakingClock($fSlang=0,$Speaker = "Anna")
    Local $hour = @HOUR, $min = @MIN, $time, $speak1 = '', $speak2 = ' Minuten'
    Local $oTalk = ObjCreate('SAPI.SpVoice')
    If @error Then Return SetError(@error,0,0)
    Switch $Speaker
    Case "Anna",0
    $oTalk.voice = $oTalk.GetVoices("Name=LH Anna", "Language=407" ).Item(0)
    Case "Stefan",1
    $oTalk.voice = $oTalk.GetVoices("Name=LH Stefan", "Language=407" ).Item(0)
    EndSwitch
    If Not $fSlang Then
    If StringLeft($hour,1) = '0' Then $hour = StringTrimLeft($hour,1)
    Select
    Case $min = '00'
    $speak2 = ''
    Case StringLeft($min,1) = '0'
    $min = StringTrimLeft($min,1)
    If $min = 1 Then
    $speak1 = 'und Eine'
    $speak2 = ' Minute'
    Else
    $speak1 = 'und ' & $min
    EndIf
    Case Else
    $speak1 = 'und ' & $min
    EndSelect
    $time = $hour & ' Uhr ' & $speak1 & $speak2
    Else
    ; Stundenwert verweist auf nächste Stunde, da fast alle Zeitansagen dieses verwenden
    $hour += 1
    If $hour > 12 Then $hour -= 12
    Switch $min
    Case 46 To 59
    $min = 60 - $min
    $speak1 = $min
    $speak2 = ' vor ' & $hour
    Case 45
    $speak1 = -1
    $speak2 = 'Drei Viertel ' & $hour
    Case 31 To 44
    $min = $min -30
    $speak1 = $min
    $speak2 = ' nach Halb ' & $hour
    Case 30
    $speak1 = -1
    $speak2 = 'Halb ' & $hour
    Case 16 To 29
    $min = 30 - $min
    $speak1 = $min
    $speak2 = ' vor Halb ' & $hour
    Case 15
    $speak1 = -1
    $speak2 = 'Viertel ' & $hour
    Case 1 To 14
    $hour -= 1 ; hier wieder Bezug zur tatsächlichen Stunde
    If $hour = -1 then $hour = 12
    $speak1 = $min
    $speak2 = ' nach ' & $hour
    Case 0
    $hour -= 1 ; hier wieder Bezug zur tatsächlichen Stunde
    If $hour = -1 Then $hour = 12
    $speak1 = -1
    $speak2 = $hour & ' Uhr'
    EndSwitch
    Switch $speak1
    Case -1
    $speak1 = ''
    Case 1
    $speak1 = 'Eine Minute'
    Case Else
    $speak1 &= ' Minuten'
    EndSwitch
    $time = $speak1 & $speak2
    EndIf
    $oTalk.Speak('Die Zeit: ' & $time)
    Return 1
    EndFunc ;==>_SpeakingClock

    [/autoit]
  • Super. Übrigens muss die deutsche Sprache nicht als Standard gewählt sein. Die deutsche Stimme kannst du so aussuchen:

    Spoiler anzeigen
    [autoit]

    ; _SPAPI_SelectGermanVoice sucht eine deutsche Stimme und wählt sie aus, falls eine gefunden wurde
    Func _SPAPI_SelectGermanVoice($oTalk)
    ; ProgAndy
    If Not IsObj($oTalk) Then Return SetError(1,0,False)
    If StringRight($oTalk.Voice.GetAttribute("language"), 2) <> "07" Then
    ; Suche deutsche Sprache
    Local $oLangs = ObjCreate("Scripting.Dictionary")
    $oLangs.CompareMode = 1
    For $oLang In $oTalk.GetVoices
    If StringRight($oLang.GetAttribute("language"), 2) = "07" Then
    $oLangs.Add($oLang.GetDescription(), $oLang)
    EndIf
    Next
    ; Zuerst die ScanSoft-Sprache probieren, ist die beste
    If $oLangs.Exists('ScanSoft Steffi_Dri40_16kHz') Then
    $oTalk.Voice = $oLangs('ScanSoft Steffi_Dri40_16kHz')
    ElseIf $oLangs.Exists('LH Anna') Then ; Dann die weibliche Microsoft-Stimme
    $oTalk.Voice = $oLangs('LH Anna')
    ElseIf $oLangs.Exists('LH Stefan') Then ; dann die männliche
    $oTalk.Voice = $oLangs('LH Stefan')
    ElseIf $oLangs.Count > 0 Then ; Falls eine andere deutsche Stimme installiert ist
    Local $aKeys = $oLangs.Keys( )
    $oTalk.Voice = $oLangs($aKeys[0]) ; nimm die erste gefundene
    Else
    Return False
    EndIf
    EndIf
    Return True
    EndFunc

    [/autoit]
  • Übrigens habe ich noch keine kostenlose deutsche x64-Stimme gefunden, also muss das Skript im 32bit-Modus gestartet werden.

  • Hallo BugFix,

    schöne Spielerei da das Makro @min eine führende 0 mit zurückgibt solltest du diese weg-"Trimmen" wie du es bei den Stunden auch schon machst,

    mfg autoBert

  • Leider funktioniert das Script bei mir nicht.

    Spoiler anzeigen

    C:\Users\Fabian\Desktop\AutoIt v3 Script (neu).au3 (20) : ==> The requested action with this object has failed.:
    $oTalk.voice = $oTalk.GetVoices("Name=LH Anna", "Language=407" ).Item(0)
    $oTalk.voice = $oTalk.GetVoices("Name=LH Anna", "Language=407" ).Item(0)^ ERROR

    Betriebssystem: Windows Vista x86

  • Kann man die Zeitansage parallel zur Laufzeit des Skript durchführen? Z.B. soll mein Skript weiterlaufen und nicht pausieren, wenn die Zeit angesagt wird!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    Eigentlich sollen es klappen wenn du in der Zeile

    [autoit]

    $oTalk.Speak('Die Zeit: ' & $time)

    [/autoit]


    eine 1 als Parameter benutzt.
    Also so:

    [autoit]

    $oTalk.Speak('Die Zeit: ' & $time,1)

    [/autoit]


    Damit wird der Text in die Warteschlange eingereiht und das Script sollte weiterlaufen.

  • Ja, die automatische Erweiterung der Sprachauswahl ist supi.
    Ich verwende auch "Scansoft Steffi" - die ist so.... erotisch. :rofl:


    Ich möchte das Thema gerne aufgreifen und mit Eurer Hilfe aktualisieren in Bezug auf Windows 8 / 64, da auf dieses Thema im 2017er Beitrag " Interaktiver Bildschirm kranke Mutter Demenz" verwiesen wurde.

    Das Uhrzeit-Script aus Post 1 funktioniert auch unter Windows 8 / 64.

    Es wird die MS Stimme "Microsoft Hedda Desktop - German" verwendet.

    Wie schaffe ich es, auf die mit Dragon NaturallySpeaking installierte "Steffi" Stimme umzuschalten? Mit Dragon kann ich Texte in der "Steffi" Stimme vorlesen lassen. AutoIt greift auf die "Microsoft Hedda Desktop - German" zurück.

    Wie kann ich prüfen, ob die mit Dragon NaturallySpeaking installierte "Steffi" Stimme eine SAPI Stimme ist, die ich mit AutoIt verwenden kann?

    Übrigens muss die deutsche Sprache nicht als Standard gewählt sein. Die deutsche Stimme kannst du so aussuchen:

    Wie muss man dieses Script aus Post 3 anpassen, damit man zwischen
    "Microsoft Hedda Desktop - German"
    und
    Dragon NaturallySpeaking - Steffi
    umschalten kann?

    Die dort genannten LH-Stimmen sind hier nicht installiert.

    Wo sieht man unter Windows alle installierten (SAPI ?) Stimmen auf einen Blick?

    Im Gerätemanager konnte ich nichts finden und in der Systemsteuerung fand ich unter der Sprachsteuerung nur die "Microsoft Hedda Desktop - German" (sowie das Pendant in englisch).

    Wenn man kommerzielle Stimmen erwerben würde, wie kann man die dann mit AutoIt verwenden?
    Wo würden die unter Windows aufgelistet sein?

    Wie zeigt man mit AutoIt alle installierten (SAPI) Stimmen an?

    Im Uhrenscript steht:

    Local $oTalk = ObjCreate('SAPI.SpVoice')

    Laut Hilfe:
    ObjCreate
    Erzeugt eine Referenz auf ein COM-Object von dem angegebenen Klassennamen.
    Erfolg: Gibt ein Objekt zurück.

    Obwohl das Script funktioniert, ist die Variable "$oTalk" leer - warum?

    ConsoleWrite (@ScriptLineNumber & @TAB & "$oTalk = " & $oTalk & @CRLF)

    Das Thema rund um die Sprachausgabe ist spannend.

    Gerade als Hilfe für erkrankte Menschen. Daher möchte ich mit Eurer Hilfe versuchen, dem Windows-PC die bessere "Steffi" Stimme zu entlocken und tiefer in die Materie einsteigen.

    Danke und eine erfolgreiche Woche.

  • Wo sieht man unter Windows alle installierten (SAPI ?) Stimmen auf einen Blick?

    Die TTS (Text-To-Speech) UDF oder die https://www.autoitscript.com/forum/topic/10…-to-speech-udf/ haben entsprechende Funktionen um die installierten Stimmen anzuzeigen.

    Ich habe allerdings keine Ahnung inwiefern dein Sprachprogramm mit der SAPI kompatibel ist bzw. ob überhaupt eine Kompatibilität besteht.
    Eventuell haben die eine ganz eigene Schnittstelle? Frag am besten den Hersteller, der wird dir am besten helfen können.

    • Offizieller Beitrag

    Obwohl das Script funktioniert, ist die Variable "$oTalk" leer - warum?

    ConsoleWrite (@ScriptLineNumber & @TAB & "$oTalk = " & $oTalk & @CRLF)

    Weil man ein Objekt nicht ausgeben kann. Ein Objekt hat Eigenschaften und Methoden mit denen man arbeitet.
    Ob das Objekt existiert kann getestet werden mit If IsObj($oTalk) Then ConsoleWrite('SAPI.SpVoice - Objekt erstellt.' & @CRLF)

    Zu den anderen Fragen kann ich im Moment nichts beitragen.

  • Vielen Dank Euch zwei. Ich haben inzwischen herausgefunden, dass die Stimme "Steffi" die Bugfix in Post 4 nannte, eine andere Stimme ist, als die "Steffi", die mit Dragon NaturallySpeaking mitgeliefert wird.

    Während die erstgenannte Steffi eine SAPI 4 Stimme ist (langgezogen klingend ;) ... ist die gleichnamige Steffi aus Dragon scheinbar keine SAPI Stimme und somit auch nicht über AutoIt ansprechbar.

    Bei der Auflistung über ein externes Programm wird sie nicht gelistet, ggf. ist sie nur in Dragon NaturallySpeaking verfügbar.