TTS (Text-To-Speech) UDF

  • Im lauf eines meiner Projekte brauchte ich TTS, weshalb diese kleine UDF entstanden ist.
    Ich hoffe, jemand kann sie gebrauchen :)
    Viel Spaß damit.Da das meine erste UDF ist freue ich mich schon auf Verbesserungsvorschläge ^^


    Version 1.01

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.10.2
    Author: Kanashius
    Rights: Open Source UDF
    Script Function:
    UDF zum wiedergeben von Text mittels Text-To-Speech
    #ce ----------------------------------------------------------------------------
    #include <WinAPI.au3>

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

    ; #CURRENT# =====================================================================================================================
    ; _SpeechObject_Create
    ; _SpeechObject_Say
    ; _SpeechObject_setRate
    ; _SpeechObject_SetVolume
    ; _SpeechObject_SetVoice
    ; _SpeechObject_SetOutput
    ; _SpeechObject_Pause
    ; _SpeechObject_Resume
    ; _SpeechObject_Stop
    ; _SpeechObject_isReady
    ; _SpeechObject_getOutputsName
    ; _SpeechObject_getVoicesName
    ; ===============================================================================================================================

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_Create()
    ; Description: Create TTS-Object
    ; Parameter(s): none.
    ; Requirement(s): none.
    ; Return Value(s): Returns an Object
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_Create()
    $oSpeech=ObjCreate('SAPI.SpVoice')
    if @error then
    return -1
    endif
    $oSpeech.Rate = 1
    $oSpeech.Volume = 100
    return $oSpeech
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_Say()
    ; Description: Read a text.
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; $sText - String to read
    ; Requirement(s): none.
    ; Return Value(s): none.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_Say($oSpeech,$sText)
    _SpeechObject_Stop($oSpeech)
    $oSpeech.Speak($sText,1)
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_setRate()
    ; Description: Set Rate of an Speech-Object (reading-speed)
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; $iRate - Int Between -10 and 10
    ; Requirement(s): none.
    ; Return Value(s): none.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_SetRate($oSpeech,$iRate)
    $oSpeech.Rate=$iRate
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_SetVolume()
    ; Description: Set the Volume of the Speech-Object
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; $iVolume - int between 0 and 100
    ; Requirement(s): none.
    ; Return Value(s): none.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_SetVolume($oSpeech,$iVolume)
    $oSpeech.Volume=$iVolume
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_SetVoice()
    ; Description: Set the voice of the Speech-Object.
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; $sName - Name (String) of an Voice as returned by _SpeechObject_getVoicesName()
    ; Requirement(s): none.
    ; Return Value(s): none.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_SetVoice($oSpeech,$sName)
    Dim $SOTokens = $oSpeech.GetVoices('', '')
    For $Token In $SOTokens
    if $Token.GetDescription=$sName then
    $oSpeech.Voice=$Token
    endif
    Next
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_SetOutput()
    ; Description: Set the Output of the Speech-Object.
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; $sName - Name (String) of an Outputdevice as returned by _SpeechObject_getOutputsName()
    ; Requirement(s): none.
    ; Return Value(s): none.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_SetOutput($oSpeech,$sName)
    Dim $SOTokens = $oSpeech.GetAudioOutputs('','')
    For $Token In $SOTokens
    if $Token.GetDescription=$sName then
    $oSpeech.AudioOutput=$Token
    endif
    Next
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_Pause()
    ; Description: Pauses the Speech-Object while reading.
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; Requirement(s): none.
    ; Return Value(s): none.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_Pause($oSpeech)
    $oSpeech.Pause()
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_Resume()
    ; Description: Resumes the Speech-Object when it is paused.
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; Requirement(s): none.
    ; Return Value(s): none.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_Resume($oSpeech)
    $oSpeech.Resume()
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_Stop()
    ; Description: Stops an Speech-Obekt while reading
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; Requirement(s): none.
    ; Return Value(s): none.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_Stop($oSpeech)
    $Output=$oSpeech.AudioOutput
    $Voice=$oSpeech.Voice
    $Rate=$oSpeech.Rate
    $Volume=$oSpeech.Volume
    $oSpeech = ObjCreate("SAPI.SpVoice")
    $oSpeech.AudioOutput=$oSpeech
    $oSpeech.Voice=$oSpeech
    $oSpeech.Rate = $Rate
    $oSpeech.Volume = $Volume
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_isReady()
    ; Description: Check if the Speech-Object is ready.
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; Requirement(s): none.
    ; Return Value(s): true - if Speech-Object is ready
    ; false - if Speech-Object is reading
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_isReady($oSpeech)
    if _WinAPI_WaitForSingleObject($oSpeech.SpeakCompleteEvent,0)<>258 then
    return true
    endif
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_getOutputsName()
    ; Description: Return the Names of all avaible AudioOutput-Devices
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; $bAsArray - true if names have to be returned as an Array
    ; Requirement(s): none.
    ; Return Value(s): String where the Devicenames are seperated with a "|"
    ; or Array with Names.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_getOutputsName($oSpeech,$bAsArray=false)
    Dim $SOTokens = $oSpeech.GetAudioOutputs('','')
    $sString=""
    For $Token In $SOTokens
    $sString&="|"&$Token.GetDescription
    Next
    $sString=StringTrimLeft($sString,1)
    if $bAsArray then
    return StringSplit($sString,"|",2)
    else
    return $sString
    endif
    EndFunc

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

    ;===============================================================================
    ;
    ; Function Name: _SpeechObject_getVoicesName()
    ; Description: Return the Names of all avaible Voices
    ; Parameter(s): $oSpeech - SpeechObejct as returned by _SpeechObject_Create()
    ; $bAsArray - true if names have to be returned as an Array
    ; Requirement(s): none.
    ; Return Value(s): String where the Voicenames are seperated with a "|"
    ; or Array with Names.
    ; Author(s): Kanashius
    ;
    ;===============================================================================
    Func _SpeechObject_getVoicesName($oSpeech,$bAsArray=false)
    Dim $SOTokens = $oSpeech.GetVoices('', '')
    $sString=""
    For $Token In $SOTokens
    $sString&="|"&$Token.GetDescription
    Next
    $sString=StringTrimLeft($sString,1)
    if $bAsArray then
    return StringSplit($sString,"|",2)
    else
    return $sString
    endif
    EndFunc

    [/autoit]
  • Sieht schon mal super aus, funktioniert bei mit leider nicht ;(

    Hier mein Beispiel Script

    [autoit]


    #include <TTS UDF.au3>

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

    $object = _SpeachObject_Create()

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

    _SpeachObject_SetOutput($object,"Lautsprecher (High Definition Audio-Gerät)")
    _SpeachObject_Say($object,"Hallooooooooooooooooooooooooooo")

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

    _SpeachObject_Stop($object)

    [/autoit]

    Das Objekt wird erstellt da gibt es keine Fehler. Ich höre aber nichts.
    Ein Vorschlag von mir die Funktion getOutputsNames sollte lieber ein Array zurückliefern.

    :thumbup:

  • Mal ein wenig OT, aber es heisst doch(Text to) Speech, oder?

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

    • Offizieller Beitrag

    Überprüfe mal, ob bei dir TTS überhaupt installiert ist. Ausserdem solltest du auch mal einen Ansager (_SpeachObject_SetVoice)wählen.

  • bobekos:
    Es Funktioniert alles. Du solltest nur nicht stoppen, sobald du gestartet hast. In <1ms kann man nicht wirklich viel lesen :D
    So könnte man es lösen:

    Spoiler anzeigen
    [autoit]

    #include <TTS UDF.au3>

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

    $object = _SpeachObject_Create()

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

    _SpeachObject_SetOutput($object,"Lautsprecher (High Definition Audio-Gerät)")
    _SpeachObject_Say($object,"Hallooooooooooooooooooooooooooo")

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

    While Not _SpeachObject_isReady($object)
    sleep(100)
    WEnd

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

    _SpeachObject_Stop($object)

    [/autoit]

    Beim TTS gibt es mehrere Modes. Ich benutze den Modus, dass das Script weiterläuft. Deshalb muss abgefragt werden, wann er fertig ist. (ansonsten "hängt" dein script, bis er fertig gelesen hat.)

    PainTain:
    Hast recht. War gestern abend nicht so auf der Höhe :D
    ich werds ändern und dabei auch gleich das mit dem Array hinzufügen ;)

    Raupi :
    Es muss keine Stimme oder kein Audioausgang gewählt werden. Es wird der als Standard eingestellte verwendet. Nur wenn man die Stimme oder den Audioausgang ändern möchte muss man die Funktionen benutzen :)

  • So. Jetzt kann man angeben, ob die Namen als Array zurückgegeben werden sollen.Ich hatte es erst als String mit "|", da ich den String dann direkt in eine Combobox packen konnte, wo ich dann bei Guictrlsetonevent() den Output/die Stimme geändert habe.

    Das mit Speach und Speech ist echt peinlich. Grad bei meiner ersten UDF :S ;( . Habs mal schnell geändert ;)