Faite parler votre ordinateur!

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Code : Tout sélectionner

; Une partie du code à été écrit par Sapero avec le language Aurora Compiler
; Traduit en Purebasic By Nico

#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)
            
            ;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
            
            ; Je choisit la voix 1, commence à 0
            SpeechObjectTokens\Item(1,@Token.ISpeechObjectToken)
            
            SpeechVoice\put_Voice(Token)
            
            SpeechObjectTokens\Release()   

                 
            Texte3.s="PureBasic! is very nice"
            *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 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Waou !! :D

excelent !!

a priori il ne met pas dans la liste toutes mes voix SAPI4 !!

par contre il reconnais Virginie et Sam (Sapi5)

Bravo Nico , tas fait fort encore la :D
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Code : Tout sélectionner

            Texte4.s="Language"
            *Tampon4=AllocateMemory((Len(Texte4)+1)*2)
            PokeS(*Tampon4,Texte4,-1,#PB_Unicode)
            bstrText = SysAllocString_(*Tampon4)

            ;Listing des voix installés
            For a= 0 To Count-1
                SpeechObjectTokens\Item(a,@Token.ISpeechObjectToken)
                Token\GetDescription(0,@Description)
                Token\GetAttribute( bstrText,@AttributeValue) 
                Debug PeekS(Description,-1,#PB_Unicode)
                
                ; retourne un code sous forme de chaine correpondant au language
                ; Apparemment 40C correspond au français
                Debug PeekS(AttributeValue,-1,#PB_Unicode)
                Token\Release() 
            Next
            
            SysFreeString_(bstrText)
Dobro si tu pouvais confirmer le code de langue que tu as?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Pardon pour le retard :D

alors ça me met

Virginie_dri40_16khz
40C <---------------------- a priori du français
Microsoft Sam
409;9 <---------------------- je sais pas a quoi ça correspond ça :)

voila :D
dit donc Nico, tu vas nous la faire toi cette Lib si tu continu sur ta lancé :D
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

excellent :lol: :lol: :lol:

pardon (je m'excuse d'avance) mais je me suis un peu amusé (pis il est tard).

( au passage profitez surtout de l'exemple pour voir comment faire la conversion ascii->unicode en redéclarant les membres de l'interface avec .p-bstr quand l'argument est de type bstr )

Code : Tout sélectionner

; Ce code à été écrit par Sapero avec le language Aurora Compiler
; Traduit en Purebasic By Nico

#CLSCTX_INPROC_SERVER = 1

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

Import "ole32.lib"
  CoInitialize(reserved.l = #Null)
  CoUninitialize()
  CLSIDFromProgID(ProgID.p-bstr, *clsid.CLSID)
  CLSIDFromString(String.p-bstr, *clsid.CLSID)
EndImport

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.p-bstr, 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
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.p-bstr, *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

Procedure.l Speak(*SpeechVoice.ISpeechVoice, *SpeechObjectTokens.ISpeechObjectTokens, Text.s, Rate.l = 0, Voice.l = 0)
  
  Protected flag.l = #SVSFDefault, Token.ISpeechObjectToken
  
  If *SpeechObjectTokens\Item(Voice, @Token) = #S_OK
    *SpeechVoice\put_Voice(Token)
    *SpeechVoice\put_Rate(Rate)
    *SpeechVoice\Speak(Text, 0, @flag)
  EndIf
  
EndProcedure

Procedure.l SpeakBase64(*SpeechVoice.ISpeechVoice, *SpeechObjectTokens.ISpeechObjectTokens, TextBase64.s, Rate.l = 0, Voice.l = 0)
  
  Protected Text.s = Space(Len(TextBase64))
  
  Speak(*SpeechVoice, *SpeechObjectTokens, Left(Text, Base64Decoder(@TextBase64, Len(TextBase64), @Text, Len(Text))), Rate, Voice)
  
EndProcedure

If CLSIDFromProgID("SAPI.SpVoice", @clsid.CLSID) = #S_OK
  
  If CLSIDFromString("{269316D8-57BD-11D2-9EEE-00C04F797396}", @Refiid.CLSID) = #S_OK
    
    CoInitialize()
    
    If  CoCreateInstance_(clsid, #Null, #CLSCTX_INPROC_SERVER, Refiid, @SpeechVoice.ISpeechVoice) = #S_OK       
      
      ; Listing des voix installés
      
      ; Voice[0] = Microsoft Sam, 409;9
      ; Voice[1] = LH Veronique, 40C
      ; Voice[2] = LH Pierre, 40C
      
      SpeechVoice\GetVoices(0, 0, @SpeechObjectTokens.ISpeechObjectTokens)
      SpeechObjectTokens\get_Count(@Count)
      
      VoiceList.s = ""
      
      For i = 0 To Count - 1
        SpeechObjectTokens\Item(i, @Token.ISpeechObjectToken)
        Token\GetDescription(0, @Description)
        Token\GetAttribute("Language", @AttributeValue)
        VoiceList + "Voice[" + Str(i) + "].Description = " + PeekS(Description, -1, #PB_Unicode) + #LF$
        VoiceList + "Voice[" + Str(i) + "].Language = " + PeekS(AttributeValue, -1, #PB_Unicode) + #LF$
        Token\Release()
      Next 
      
      MessageRequester("Information", VoiceList) 
      
      ; Joue quelques phrases
      
      Speak(SpeechVoice, SpeechObjectTokens, "Pardon pour ces quelques gros mots mais c'est trop rigolo !", 0, 2)
      SpeakBase64(SpeechVoice, SpeechObjectTokens, "VmEgdGUgZmFpcmUgZm91dHJlIGNvbm5hcmQsIGVzcOhjZSBkJ2VuY3Vs6SwgZ3JvcyBtZXJkZXV4LCBwYXV2cmUgY29uLCBncm9zIGTpYmlsZSwgYWJydXRpLCBncm9zIGN1bCBwbGVpbiBkZSBtZXJkZSAh", 1, 1)
      Speak(SpeechVoice, SpeechObjectTokens, "Ah ah ah ah ha t'es trop con!", 1, 1)
      
      ; Libération des ressources
      
      SpeechObjectTokens\Release()
      SpeechVoice\Release()
      
    EndIf
    
    CoUninitialize()
    
  EndIf
  
EndIf
Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

@Flype dans ton exempl on perd la faculter de changer la voix !!
moi j'ai virginie en voix 0 , ben c'est toujour Sam qui parle !!
alors que l'exemple a Nico fonctionne niquel ! :D


j'arrive pas a comprendre pourquoi avec la lib TTS on arrive a avoir toute les voix
c'est a dire Sapi4 et sapi5

alors que la a priori on ne dispose que des voix Sapi5
(Sam et Virginie pour moi) 8O
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est parce qu'il utilise deux interfaces, c'est d'ailleurs le seul code qu'il est posté, le problème est de connaitre les fonctions de cette deuxième interface:

Code : Tout sélectionner

  Enumeration
    #ST_DEFAULT = 0
    #ST_KEEPUNDO = 1
    #ST_SELECTION = 2
    #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
  CoInitialize_(0)
  If CoCreateInstance_(?CLSID_SpVoice, 0,#CLSCTX_ALL, ?IID_ISpVoice, @a)=0
    MessageRequester("Success!", "You have SAPI 5 installed!", #MB_OK|#MB_ICONINFORMATION)
  Else
    MessageRequester("Failure!", "You don't have SAPI 5 installed!", #MB_OK|#MB_ICONWARNING)
  EndIf
  If CoCreateInstance_(?CLSID_ITextToSpeech, 0,#CLSCTX_ALL, ?IID_ITextToSpeech, @b)=0
    MessageRequester("Success!", "You have SAPI 4 installed!", #MB_OK|#MB_ICONINFORMATION)
  Else
    MessageRequester("Failure!", "You don't have SAPI 4 installed!", #MB_OK|#MB_ICONWARNING)
  EndIf
  CoUninitialize_()
  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
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

il semble qu'ici il y a beaucoup de bonnes choses à voir concernant SAPI5 (en perl).

http://cpan.uwinnipeg.ca/htdocs/Win32-S ... I5.pm.html
Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voici les bons reglages pour le volume et la vitesse de diction en SAPI5
avec PureDISPHELPER installé ! :D

Code : Tout sélectionner

 ; by ts-soft


dhToggleExceptions( #True )
Define.l obj = dhCreateObject( "SAPI.SpVoice" )
If obj
    
    speed.s="<RATE SPEED="+Chr(34)+"-10"+Chr(34)+">" ; reglage de la vitesse de diction (de -10 a 10)
    volume.s="<VOLUME LEVEL="+Chr(34)+"80"+Chr(34)+">"  ; reglage du volume (de 0 a 100) 
    prepare.s=speed.s+volume.s 
    text.s=prepare.s+"PureBasic, parle bien " 
    dhCallMethod(obj, "Speak (%T,%i)" , @text.s , 0)
    dhReleaseObject(obj) : obj = 0
    
EndIf 
je me suis servi des infos ici presente :
http://delphipage.developpez.com/sapi/
Dernière modification par Backup le jeu. 19/juil./2007 18:27, modifié 2 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Tu peux faire la même chose avec:

Code : Tout sélectionner

  get_Rate(long.l)
  put_Rate(long.l)
  get_Volume(long.l)
  put_Volume(long.l) 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

arf !! Nico :D

mon exemple concerne
"avec PureDISPHELPER installé ! " :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

j'ai ecris ça sur le forum anglais
(avec une traduction surement comique de Google :lol: )

allez lire :D

http://www.purebasic.fr/english/viewtop ... 529#203529

ils me gonfle ces "anglais" a etre hautain et nous snober de la sorte !!
a une epoque on aurai reglé ça sur le pres a 5 heures du Mat :lol:

en esperant que cela suffise a faire bouger "votre altesse" (the Persuaders :D)
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

Dobro a écrit :voici les bons reglages pour le volume et la vitesse de diction en SAPI5
avec PureDISPHELPER installé ! :D

Code : Tout sélectionner

 ; by ts-soft


dhToggleExceptions( #True )
Define.l obj = dhCreateObject( "SAPI.SpVoice" )
If obj
    
    speed.s="<RATE SPEED="+Chr(34)+"-10"+Chr(34)+">" ; reglage de la vitesse de diction (de -10 a 10)
    volume.s="<VOLUME LEVEL="+Chr(34)+"80"+Chr(34)+">"  ; reglage du volume (de 0 a 100) 
    prepare.s=speed.s+volume.s 
    text.s=prepare.s+"PureBasic, parle bien " 
    dhCallMethod(obj, "Speak (%T,%i)" , @text.s , 0)
    dhReleaseObject(obj) : obj = 0
    
EndIf 
je me suis servi des infos ici presente :
http://delphipage.developpez.com/sapi/
Cool :D, merci de l'info, je me disais bien apres avoir vu le premier param possible de choix de la voix qu'il devait etre possible de specifier d'autres params, mais j'avais la fleme de chercher...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pour les chercheurs (Nico :D) une bonne info en français pour la reconnaissance vocale utilisant SAPI


http://lgmorand.developpez.com/dotnet/s ... vocale/#L2

:) (hum bon courage !) :lol:


il existe un autre parametre mais qui , apparemment ne fonctionne pas avec les voix SAPI5
(mais marche avec les Voix SAPI4 )

il sagit de PITCH MIDDLE qui regle le pitch c'est a dire une voix type "enfant" ou tres grave :) , avec une meme voix on pourrai
faire croire que plusieurs personne parle :D

Code : Tout sélectionner

 ; by ts-soft


dhToggleExceptions( #True )
Define.l voix = dhCreateObject( "SAPI.SpVoice" )
If voix  
    speed.s="<RATE SPEED="+Chr(34)+"-5"+Chr(34)+">" ; reglage de la vitesse de diction (de -10 a 10)
    volume.s="<VOLUME LEVEL="+Chr(34)+"80"+Chr(34)+">"  ; reglage du volume (de 0 a 100) 
    pitch.s="<PITCH MIDDLE="+Chr(34)+"10"+Chr(34)+">"; en principe reglage de la hauteur de la voix (aigue-grave)
    prepare.s=speed.s+volume.s 
    text.s=prepare.s+"PureBasic, parle bien " 
    dhCallMethod(voix, "Speak (%T,%i)" , @text.s , 0)
    dhReleaseObject(voix) : voix = 0
    
EndIf 

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Petit récapitulatif : :D


toujours en parallèle du travail de Nico
j'explore la Lib "DispHelper" de ts-soft

voici le changement de voix :D (il faut avoir Virginie et Sam d'installé)
Si Quelqu'un trouve comment activer et utiliser le Sapi 4 je dispose de plein de voix ,
je ferai un Pack complet reprenant un exemple clair comprenant

Le moteur Sapi4
Le Moteur Sapi5
les differentes voix Sapi 4 que je dispose
Virginie la voix SAPI5

et les exemples Utilisant ces Voix !!
Pour l'instant , nous en somme donc a 3 chemins possible pour faire Parler L'ordi !

1- utiliser la Librairie "PureTTS" (qui viens d'être mise a jour pour la V4.10 et dont l'auteur ne veux apparemment pas nous aider :? )
cette librairie est capable de gérer les voix SAPI 4 et 5

2-utiliser la librairie "DispHelper"
exclusivement pour les voix SAPI 5

dont je joins tout de suite un exemple avec changement de voix :D


  ; by ts-soft

dhToggleExceptions( #True )
Define.l voix = dhCreateObject( "SAPI.SpVoice" )
If voix
    speed.s= "<RATE SPEED=" + Chr (34)+ "0" + Chr (34)+ ">" ; reglage de la vitesse de diction (de -10 a 10)
    volume.s= "<VOLUME LEVEL=" + Chr (34)+ "80" + Chr (34)+ ">" ; reglage du volume (de 0 a 100)
    pitch.s= "<PITCH MIDDLE=" + Chr (34)+ "10" + Chr (34)+ ">" ; en principe reglage de la hauteur de la voix (aigue-grave)
    
     ; ************** Virginie parle ***************************************
    voice.s= "<voice required=" + Chr (34)+ "Name=ScanSoft Virginie_Dri40_16kHz" + Chr (34)+ "/>"
    prepare.s=speed.s+volume.s+voice
    text.s=prepare.s+ "PureBasic, parle bien "
    dhCallMethod(voix, "Speak (%T,%i)" , @text.s , 0)
     ; *********************************************************************
    
     ; ******************* Sam parle ****************************
    voice.s= "<voice required=" + Chr (34)+ "Name=microsoft Sam" + Chr (34)+ "/>"
    prepare.s=speed.s+volume.s+voice
    text.s=prepare.s+ "PureBasic, speak very well "
    dhCallMethod(voix, "Speak (%T,%i)" , @text.s , 0)
     ; **************************************************************
    
    
    
    dhReleaseObject(voix) : voix = 0
    
EndIf



3- utiliser le travail de Nico posté ci dessous , qui fonctionne avec les voix Sapi 5


; Ce code à été écrit par Sapero avec le language Aurora Compiler
; Traduit en Purebasic By Nico

#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 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

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
            
            Texte3.s= "<voice required=" + Chr (34)+ "Name=ScanSoft Virginie_Dri40_16kHz" + Chr (34)+ "/>" + "bonjour, Purebasic sait parler. "
            *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)



Voila a suivre !! :D
Répondre