Comment utiliser le narrateur Windows ?

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Comment utiliser le narrateur Windows ?

Message par jak64 »

Bonjour,
J'avais réalisé des jeux en VBA en utilisant le narrateur (sous VBA Excel). J'utilisais le code que j'ai copié ci-dessous.
Question : comment utiliser cela en Purebasic V5.72, si c'est possible ?
Merci à vous

code VBA Excel

'----- Ouverture du narrateur
Set Osound = CreateObject("sapi.SPVoice")
'----- Mise en français de la voix du narrateur après téléchargement de RSSolo4FrenchVirginie.exe (seulement en 32 bits)
Osound.Voice.Category.Default = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\ScanSoftVirginie_Dri40_16kHz"
'----- Volume : maximum = 100
Osound.Volume = 100
'----- Vitesse
Osound.Rate = -1
'----- lecture par le narrateur
Osound.Speak "Bonjour, comment allez-vous ?"
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Comment utiliser le narrateur Windows ?

Message par kernadec »

bjr
Pour commencer, il te faut utiliser ce module pour une utilisation
de la commande activeScript "CreateObject()"
Cordialement

https://www.purebasic.fr/english/viewto ... 12&t=71399
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Comment utiliser le narrateur Windows ?

Message par Marc56 »

Un autre moyen de faire parler Windows

Vieux code qui doit être sur le forum (pas de moi donc ne me demande pas d'explications :D
(Peut lire un fichier ou des chaines de caractères, je m'en sert pour l'horloge parlante)

Code : Tout sélectionner

EnableExplicit

Enumeration Fichier
    #Fichier
EndEnumeration

;************** VALEUR POUR "SpeechVoiceSpeakFlags".*****************

Enumeration
    #SVSFDefault            = 0
    #SVSFlagsAsync          = 1
    #SVSFPurgeBeforeSpeak   = 2
    #SVSFIsFilename         = 4
    #SVSFIsXML              = 8
    #SVSFIsNotXML           = 16
    #SVSFPersistXML         = 32
    #SVSFNLPSpeakPunc       = 64
    #SVSFNLPMask            = 64
    #SVSFVoiceMask          = 127
    #SVSFUnusedFlags        = -128
EndEnumeration
Enumeration
    #CLSCTX_INPROC_SERVER   = $1
    #CLSCTX_INPROC_HANDLER  = $2
    #CLSCTX_LOCAL_SERVER    = $4
    #CLSCTX_REMOTE_SERVER   = $10
    #CLSCTX_ALL             = (#CLSCTX_INPROC_SERVER | #CLSCTX_INPROC_HANDLER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER)
EndEnumeration

Interface ISpeechVoice Extends IDispatch
    get_Status(*ISpeechVoiceStatus .l)
    get_Voice(*ISpeechObjectToken.l)
    put_Voice(*ISpeechObjectToken.l)
    get_AudioOutput(*ISpeechObjectToken.l)
    put_AudioOutput(*ISpeechObjectToken.l)
    get_AudioOutputStream(*ISpeechBaseStream.l)
    put_AudioOutputStream(*ISpeechBaseStream.l)
    get_Rate(long.l)
    put_Rate(long.l)
    get_Volume(long.l)
    put_Volume(long.l)
    put_AllowAudioOutputFormatChangesOnNextSet(VARIANT_BOOL.l)
    get_AllowAudioOutputFormatChangesOnNextSet(VARIANT_BOOL.l)
    get_EventInterests(SpeechVoiceEvents .l)
    put_EventInterests(SpeechVoiceEvents .l)
    put_Priority(SpeechVoicePriority.l)
    get_Priority(SpeechVoicePriority.l)
    put_AlertBoundary(SpeechVoiceEvents.l)
    get_AlertBoundary(SpeechVoiceEvents.l)
    put_SynchronousSpeakTimeout(long.l)
    SynchronousSpeakTimeout(long.l)
    Speak(*Text, SpeechVoiceSpeakFlags.l, long.l)
    SpeakStream(*ISpeechBaseStream, SpeechVoiceSpeakFlags.l, long.l)
    Pause()
    Resume()
    Skip(*Type, NumItems.l, long.l)
    GetVoices(*RequiredAttributes.l, *OptionalAttributes, *ISpeechObjectTokens.l)
    GetAudioOutputs(*RequiredAttributes, *OptionalAttributes, *ISpeechObjectTokens.l)
    WaitUntilDone(msTimeout.l, VARIANT_BOOL.l)
    SpeakCompleteEvent(long.l)
    IsUISupported(*TypeOfUI, *ExtraData.VARIANT, VARIANT_BOOL.l)
    DisplayUI(hWndParent.l, *Title, *TypeOfUI, *ExtraData.VARIANT)
EndInterface


Procedure.b isSAPIInstalled()
    
    ; VERIFICATION DE L'INSTALLATION DE SAPI 4 OU 5.
    Define a.i
    Define bresult.b = #False
    
    CoInitialize_(0)
    If CoCreateInstance_(?CLSID_SpVoice, 0, #CLSCTX_ALL, ?IID_ISpVoice, @a) = 0
        bresult = #True
    Else
        If CoCreateInstance_(?CLSID_ITextToSpeech, 0, #CLSCTX_ALL, ?IID_ITextToSpeech, @a) = 0
            bresult = #True
        EndIf
    EndIf
    CoUninitialize_()
    ProcedureReturn bresult
    
EndProcedure


Procedure SAPISpeechtext(stext.s, speed = 0)
    
    Define.i itemp, bstrtext
    Define text1.s
    Define *buffer1, *buffer2, *buffer3
    Define clsid.CLSID, refiid.CLSID
    Define speechvoice.ISpeechVoice
    
    If isSAPIInstalled() = #True And stext <> #Null$
        text1 = "SAPI.SpVoice"
        *buffer1 = AllocateMemory((Len(text1) + 1) * 2)
        PokeS(*buffer1, text1, -1, #PB_Unicode)
        text1 = "{269316D8-57BD-11D2-9EEE-00C04F797396}"
        *buffer2 = AllocateMemory((Len(text1) + 1) * 2)
        PokeS(*buffer2, text1, -1, #PB_Unicode)
        If CLSIDFromProgID_(*buffer1, @Clsid.clsid)    = #S_OK
            If CLSIDFromString_(*buffer2, @Refiid.clsid) = #S_OK
                CoInitialize_(0)
                If  CoCreateInstance_(clsid, #Null, #CLSCTX_INPROC_SERVER, refiid, @speechvoice) = #S_OK
                    *buffer3 = AllocateMemory((Len(stext) + 1) * 2)
                    PokeS(*buffer3, stext, -1, #PB_Unicode)
                    itemp    = #SVSFDefault
                    bstrtext = SysAllocString_(*buffer3)
                    
                    
                    speechvoice\put_Rate(speed)
                    speechvoice\put_Volume(100)
                    
                    speechvoice\Speak(bstrtext, 0, @itemp)
                    SysFreeString_(bstrtext)
                    FreeMemory(*buffer3)
                    speechvoice\Release()
                EndIf
                CoUninitialize_()
            EndIf
        EndIf
        FreeMemory(*buffer1)
        FreeMemory(*buffer2)
        
    EndIf
    
    
EndProcedure

Define TexteComplet$ = "Bonjour, il est 15 heures"

;   If ReadFile(#fichier,"textealire.txt")
;     While Not Eof(#fichier)           
;     	TexteComplet$ + ReadString(#fichier)	; Concaténer tous les caractères lus dans une variable
;     Wend
;     CloseFile(#fichier)            
;   Else
;   	MessageRequester("Information","Impossible d'ouvrir le fichier!")
;   EndIf

SAPISpeechtext(TexteComplet$, 0)				; (-5) Lire le contenu de la variable 

End

DataSection
    CLSID_SpVoice:
    Data.l $96749377
    Data.w $3391,$11D2
    Data.b $9E,$E3,$00,$C0,$4F,$79,$73,$96
    IID_ISpVoice:
    Data.l $269316D8
    Data.w $57BD,$11D2
    Data.b $9E,$EE,$00,$C0,$4F,$79,$73,$96
    CLSID_ITextToSpeech:
    Data.l $EEE78591
    Data.w $FE22,$11D0
    Data.b $8B,$EF,$00,$60,$08,$18,$41,$DE
    IID_ITextToSpeech:
    Data.l $EEE78590
    Data.w $FE22,$11D0
    Data.b $8B,$EF,$00,$60,$08,$18,$41,$DE
EndDataSection
(Testé Windows 10 PB 5.72 LTS x64)

:wink:
Avatar de l’utilisateur
jak64
Messages : 85
Inscription : dim. 03/mai/2020 23:16

Re: Comment utiliser le narrateur Windows ?

Message par jak64 »

Super, ça fonctionne...
Merci beaucoup.

Je programme depuis plus de 40 ans (j'étais informaticien pour une banque, retraité depuis 5 ans), j'ai utilisé plein de langages, mais je trouve PureBasic vraiment très bien et complet
Répondre