Page 3 sur 6

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

Publié : dim. 14/déc./2014 9:58
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)

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

Publié : dim. 14/déc./2014 10:05
par klystron
merci , je note tout ça .

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

Publié : dim. 14/déc./2014 10:40
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.

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

Publié : dim. 14/déc./2014 11:14
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:

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

Publié : dim. 14/déc./2014 11:24
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.

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

Publié : dim. 14/déc./2014 15:36
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 :)

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

Publié : dim. 14/déc./2014 15:43
par falsam
@klystron : Tu as quelle version de Windows ?

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

Publié : dim. 14/déc./2014 15:44
par klystron
bonjour Falsam, je suis sous Windows 7 pro 64 bits

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

Publié : dim. 14/déc./2014 15:47
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")

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

Publié : dim. 14/déc./2014 15:57
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 ?

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

Publié : dim. 14/déc./2014 16:03
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.....

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

Publié : dim. 14/déc./2014 16:10
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 ?

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

Publié : dim. 14/déc./2014 16:16
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.

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

Publié : dim. 14/déc./2014 16:17
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 ?

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

Publié : dim. 14/déc./2014 16:39
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.