peut-on lire a haute voix un texte en Français d'un fichier

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par Marc56 »

(suite de l'explication)

Code : Tout sélectionner

Debug ReadString(#fichier)      ; Affiche ligne par ligne le contenu du fichier
Debug est une commande qui se contente d'afficher un message, mais ne fait rien.
(En réalité, on peut lui faire faire des choses, mais il faut bien penser que si ensuite on compile sans l'option Debug, toutes les lignes qui suivent un mot clé Debug sont ignorée)

Il faut donc lire le fichier et "accumuler" (concaténation) son contenu dans une variable texte

En Basic "classique" on écrirait

Code : Tout sélectionner

LigneLue$ =  ReadString(#fichier)
TexteComplet$ = TexteComplet$ + LigneLue$
ou plus court:

Code : Tout sélectionner

TexteComplet$ = TexteComplet$ + ReadString(#fichier)
En PureBasic on peut encore simplifier (comme pour une incrémentation, type i++ en langage C)

Code : Tout sélectionner

TexteComplet$ + ReadString(#fichier)
Comme on a activé au début du code EnableExplicite, on est donc obligé de déclarer le type avant

Code : Tout sélectionner

Define TexteComplet$ ou Define TextComplet.s 
(Je préfère la première forme ($) plus facile à gérer ensuite)

Une fois que ta variable est lue, il suffit de la passer à la procédure (et non pas passer le fichier)

SAPISpeechtext(TexteComplet$, -5)
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par klystron »

merci , je note tout ça .
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par klystron »

Oui c'est ok, cela fonctionne bien, mais il ne faut pas mettre le fichier texte dans un répertoire.
(mettre le code pb , ou son code compilé , dans le meme répertoire que le fichier texte.)
je ferais un essai avec la voix Française plus tard.
voici le code modifé:

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$

  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$, -5)            ; Lire le contenu de la variable (-5 correspond a la vitesse. )



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

  
merci Marc56.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par Marc56 »

klystron a écrit :Oui c'est ok, cela fonctionne bien, mais il ne faut pas mettre le fichier texte dans un répertoire.
On peut le mettre où on veut, mais alors il faut ajouter le chemin complet

Une bonne méthode de programmation (quelque soit le langage):
- Créer un nouveau sous-répertoire par programme (tu verra qu'ensuite c'est commode pour utiliser le mode projet)
- Enregistrer le fichier source dès la première ligne (tu met les commentaires de description du fichier)
- Mettre les fichier annexes dans ce même répertoire (txt, ini, icones etc)

- Dans les préférences de PB, Cocher
--- Préférence > Éditeur > [X] Enregistrer automatiquement avant de compiler/exécuter (en cas de plantage à l'exécution)
--- Préférence > Compilateur > [X] Créer l'exécutable temporaire dans le répertoire des sources

En ayant paramétré ainsi, les commandes de lecture de fichier iront chercher les fichier txt dans le répertoire où se trouve ton .pb
tu n'as donc pas besoin de spécifier de chemin complet pour ton fichier txt.

Maintenant, la méthode propre est de mettre au début de ton source, tout ce qui peut être changé

Code : Tout sélectionner

; Mon super programme
; (C)Myself 14/12/14

EnableExplicit

Global Fichier_Chemin$ = "C:\Sources\PureBasic\"
Global Fichier_Nom$ = "textealire.txt"
; ... etc
; Idéalement on ne devrait trouver aucun texte dans le code source, tout devrait se trouve ici 
; de même que toutes les données numériques

; ... reste du programme

; Ensuite on utilise chemin+nom
Global Nom_Complet$ = Fichier_Chemin$ + Fichier_nom$

If ReadFile(#fichier, Nom_Complet$)
:wink:
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par klystron »

ok Marc56, je vais regardé tes infos à tete reposée :D
il est certain, qu'il y a pleins de possibilités , j'en suis juste au début . :lol:
merci pour tes explications.
je pense que les débutants, vont appréciez.
bon dimanche.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par falsam »

Marc56 a écrit :e séparateur de répertoire sous Windows et Dos est l'antislash (\) et pas le slash (/) (mais ça marche en PB)
C'est volontaire que je met un (/) et non pas un (\) par souci de compatibilité avec Linux.
Marc56 a écrit : ... et en plus, il en faut un à la racine (erreur classique de débutant en ligne de commandes) ... (oups, c'était pas toi, mais une faute de frappe dans l'exemple :oops: )
Mais heuuuuu ...... c'est qu'il se moque le manant :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par falsam »

@klystron : Tu as quelle version de Windows ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par klystron »

bonjour Falsam, je suis sous Windows 7 pro 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par falsam »

klystron a écrit :bonjour Falsam, je suis sous Windows 7 pro 64 bits
Exécute ce code et dit nous combien de voix sont installées sur ton ordinateur.

Code : Tout sélectionner

RunProgram("C:\Windows\SysWOW64\Speech\SpeechUX\sapi.cpl")
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par klystron »

j'en vois trois :

lh pierre
lh véronique
Microsoft anna

bien ce petit logiciel, je n'ai jamais regardé ce que j'avais ...

sur certains PDF on doit pouvoir lire un texte je crois ?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par falsam »

Etape par étape :)

- Télécharge la voix de virginie en français.
:arrow: http://s242132022.onlinehome.fr/Downloa ... rginie.zip (23Mo environ)

- Décompresse le fichier sur le bureau par exemple et exécute le programme d'installation RSSolo4FrenchVirginie.exe

- Quand l'installation sera terminée (C'est assez long) exécute à nouveau ce code

Code : Tout sélectionner

RunProgram("C:\Windows\SysWOW64\Speech\SpeechUX\sapi.cpl")
et vérifie que la voix française fonctionne bien.

La suite quand tu m'auras répondu.....
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par klystron »

oui ca fonctionne avec l'installation en 16khz, c'est plus nette je crois
je ferais un essai avec le code pb pour voir

je viens de faire un essai avec la voix de virginie mais il prends par defaut la voix anglaise.
comment faire pour mettre la voix de virginie fonctionnement ?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par falsam »

Ta démo

Code : Tout sélectionner

; Contributor : Traduction en Pure Basic du code de Sapero par Nico

;Installation de la voix française Virginie si celle d'origine ne fonctionne pas 
;http://s242132022.onlinehome.fr/Download/PureBasic/RSSolo4FrenchVirginie.zip
#CLSCTX_INPROC_SERVER=1

;/Valeur pour SpeechVoiceSpeakFlags
#SVSFDefault = 0
#SVSFlagsAsync = 1
#SVSFPurgeBeforeSpeak = 2
#SVSFIsFilename = 4
#SVSFIsXML = 8
#SVSFIsNotXML = 16
#SVSFPersistXML = 32
#SVSFNLPSpeakPunc = 64
#SVSFNLPMask = 64
#SVSFVoiceMask = 127
#SVSFUnusedFlags = -128

Interface ISpeechObjectToken Extends IDispatch
  get_Id( ObjectId)
  get_DataKey( ISpeechDataKey.l)
  get_Category( ISpeechObjectTokenCategory.l)
  GetDescription( Locale.l,Description)
  SetId( Id,CategoryID,CreateIfNotExist) 
  GetAttribute( AttributeName,*AttributeValue) 
  CreateInstance( pUnkOuter,SpeechTokenContext,Object)
  Remove( ObjectStorageCLSID)
  GetStorageFileName( ObjectStorageCLSID,KeyName,FileName,SpeechTokenShellFolder,*FilePath)
  RemoveStorageFileName( ObjectStorageCLSID,KeyName,DeleteFile)
  IsUISupported( TypeOfUI,*ExtraData,*Object,*Supported)
  DisplayUI( hWnd,Title,TypeOfUI,*ExtraData,*Object )
  MatchesAttributes( Attributes,*Matches)
EndInterface

Interface ISpeechObjectTokens Extends IDispatch
  get_Count(a.l)
  Item(Index.l,Token.ISpeechObjectToken)
  get__NewEnum(ppEnumVARIANT.IUnknown )
EndInterface

Interface ISpeechVoice Extends IDispatch
  get_Status(*ISpeechVoiceStatus .l)
  get_Voice(*ISpeechObjectToken)
  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

Texte1.s="SAPI.SpVoice"
*Tampon1=AllocateMemory((Len(Texte1)+1)*2)
PokeS(*Tampon1,Texte1,-1,#PB_Unicode)

Texte2.s="{269316D8-57BD-11D2-9EEE-00C04F797396}"
*Tampon2=AllocateMemory((Len(Texte2)+1)*2)
PokeS(*Tampon2,Texte2,-1,#PB_Unicode)

If CLSIDFromProgID_(*Tampon1, @Clsid.CLSID)=#S_OK
   
    If CLSIDFromString_(*Tampon2, @Refiid.CLSID)=#S_OK
       
        CoInitialize_(0)
       
        If  CoCreateInstance_(Clsid, #Null, #CLSCTX_INPROC_SERVER, Refiid, @SpeechVoice.ISpeechVoice)=#S_OK       
                        
            SpeechVoice\GetVoices(0, 0, @SpeechObjectTokens.ISpeechObjectTokens)
            SpeechObjectTokens\get_Count(@Count)
            
            ;Débug : Listing des voix installés
            ;For a= 0 To Count-1
            ;    SpeechObjectTokens\Item(a,@Token.ISpeechObjectToken)
            ;    Token\GetDescription(0, @Description)
            ;    Debug PeekS(Description,-1,#PB_Unicode)
            ;    Token\Release() 
            ;Next
            
            ;Sélection du numéro de la voix (0 voix par defaut configurer dans le panneau de configuration)
            SpeechObjectTokens\Item(0, @Token.ISpeechObjectToken)
            
            ;Vitesse d’exécution (0 Normal. Une valeur négative réduit la vitesse. Une valeur positive augmente la vitesse ) 
            speechvoice\put_Rate(0)
            
            ;Paramétrage du volume (0 à 100)
            speechvoice\put_Volume(50)
            
            ;Fin du paramétrage
            SpeechVoice\put_Voice(Token)   
            SpeechObjectTokens\Release()   
            
            ;Il est temps de dire quelques chose en français.
            Texte3.s="Bonjour, je m'appelle virginie. Que puis je faire pour vous ?"
                        
            *Tampon3=AllocateMemory((Len(Texte3)+1)*2)
            PokeS(*Tampon3,Texte3,-1,#PB_Unicode)
           
            temp=#SVSFDefault
            bstrText = SysAllocString_(*Tampon3)
            SpeechVoice\Speak(bstrText, 0, @temp)
            SysFreeString_(bstrText)
              
            FreeMemory(*Tampon3)
              
           SpeechVoice\Release() 
        EndIf
       
        CoUninitialize_()
    EndIf
  EndIf
  
  FreeMemory(*Tampon1)
  FreeMemory(*Tampon2)
End
Régle bien le numéro de la voix de virginie dans ce code.
Dernière modification par falsam le lun. 15/déc./2014 11:18, modifié 3 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par klystron »

je vais essayé
j'ai toujours la voix en anglais , pas celle en Français...
j'ai pourtant validé ?
impossible de changer de voix les boutons sont innibés ?...

par defaut c'est la voix en anglais

c'est w7 qui bloque ?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: peut-on lire a haute voix un texte en Français d'un fich

Message par falsam »

klystron a écrit :jpar defaut c'est la voix en anglais
Peux tu éxécuter ce code pour voir quelles sont les voix installées?

Code : Tout sélectionner

; Contributor : Traduction en Pure Basic du code de Sapero par Nico

;Installation de la voix française Virginie si celle d'origine ne fonctionne pas 
;http://s242132022.onlinehome.fr/Download/PureBasic/RSSolo4FrenchVirginie.zip
#CLSCTX_INPROC_SERVER=1

;/Valeur pour SpeechVoiceSpeakFlags
#SVSFDefault = 0
#SVSFlagsAsync = 1
#SVSFPurgeBeforeSpeak = 2
#SVSFIsFilename = 4
#SVSFIsXML = 8
#SVSFIsNotXML = 16
#SVSFPersistXML = 32
#SVSFNLPSpeakPunc = 64
#SVSFNLPMask = 64
#SVSFVoiceMask = 127
#SVSFUnusedFlags = -128

Interface ISpeechObjectToken Extends IDispatch
  get_Id( ObjectId)
  get_DataKey( ISpeechDataKey.l)
  get_Category( ISpeechObjectTokenCategory.l)
  GetDescription( Locale.l,Description)
  SetId( Id,CategoryID,CreateIfNotExist) 
  GetAttribute( AttributeName,*AttributeValue) 
  CreateInstance( pUnkOuter,SpeechTokenContext,Object)
  Remove( ObjectStorageCLSID)
  GetStorageFileName( ObjectStorageCLSID,KeyName,FileName,SpeechTokenShellFolder,*FilePath)
  RemoveStorageFileName( ObjectStorageCLSID,KeyName,DeleteFile)
  IsUISupported( TypeOfUI,*ExtraData,*Object,*Supported)
  DisplayUI( hWnd,Title,TypeOfUI,*ExtraData,*Object )
  MatchesAttributes( Attributes,*Matches)
EndInterface

Interface ISpeechObjectTokens Extends IDispatch
  get_Count(a.l)
  Item(Index.l,Token.ISpeechObjectToken)
  get__NewEnum(ppEnumVARIANT.IUnknown )
EndInterface

Interface ISpeechVoice Extends IDispatch
  get_Status(*ISpeechVoiceStatus .l)
  get_Voice(*ISpeechObjectToken)
  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

Texte1.s="SAPI.SpVoice"
*Tampon1=AllocateMemory((Len(Texte1)+1)*2)
PokeS(*Tampon1,Texte1,-1,#PB_Unicode)

Texte2.s="{269316D8-57BD-11D2-9EEE-00C04F797396}"
*Tampon2=AllocateMemory((Len(Texte2)+1)*2)
PokeS(*Tampon2,Texte2,-1,#PB_Unicode)

If CLSIDFromProgID_(*Tampon1, @Clsid.CLSID)=#S_OK
   
    If CLSIDFromString_(*Tampon2, @Refiid.CLSID)=#S_OK
       
        CoInitialize_(0)
       
        If  CoCreateInstance_(Clsid, #Null, #CLSCTX_INPROC_SERVER, Refiid, @SpeechVoice.ISpeechVoice)=#S_OK       
                        
            SpeechVoice\GetVoices(0, 0, @SpeechObjectTokens.ISpeechObjectTokens)
            SpeechObjectTokens\get_Count(@Count)
         
            For a= 0 To Count-1
                SpeechObjectTokens\Item(a,@Token.ISpeechObjectToken)
                Token\GetDescription(0, @Description)
                Debug PeekS(Description,-1,#PB_Unicode)
                Token\Release() 
            Next
                          
           SpeechVoice\Release() 
        EndIf
       
        CoUninitialize_()
    EndIf
  EndIf
  
  FreeMemory(*Tampon1)
  FreeMemory(*Tampon2)
End
Fait un copier coller du résultat.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre