[RESOLU] Speak()

Programmation d'applications complexes
Anonyme 2
Messages : 183
Inscription : ven. 18/mars/2011 11:53

[RESOLU] Speak()

Message par Anonyme 2 »

Yo,
J'aimerais des explications/informations sur ca en général car je ne comprends rien avec tous les topics éparpillés un peu partout, les liens morts, etc.. :cry:
Dernière modification par Anonyme 2 le jeu. 01/sept./2011 20:45, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Speak()

Message par Ar-S »

Pour résumer c'est une lib de Dobro utilisant les systèmes de voix de synthèse SAPI.
Donc soit tu télécharges la lib de Dobro, soit tu essayes de faire ta propre routine.

Pour tester tu peux essayer ce code de Nico (ne nécessite pas de lib)

Code : Tout sélectionner

; 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="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)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Anonyme 2
Messages : 183
Inscription : ven. 18/mars/2011 11:53

Re: Speak()

Message par Anonyme 2 »

Ok merci pour les infos :)
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: [RESOLU] Speak()

Message par david »

Bonjour,

je suis tombé par hasard sur ce topic que je trouve gigantissime
je félicite par la présente les auteur... et rend grâce à pureBasic qui permet de gérer tant de choses

par contre je n'arrive pas à le faire parler en français
j'utilise : PureBasic 5.22 LTS (Windows - x86) // windows 7 professionnel (sans droits admin)

j'ai vu dans le forum un lien pour enregistrer d'autres voix... qui ne sont peut-etre pas dans windows par défaut
n'ayant aucun droit admin, existe-t-il la possibilité de modifier le code pour pouvoir parler en francais, ou suis-je condamné à lui donner une chaine de carractere phonétique pour faire de l'a peu pres??

merci pour vos lumières

david t
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: [RESOLU] Speak()

Message par GallyHC »

Bonjour,

J'ai fait quelque recherche sur le sujet, déjà il te faudra des droits sur l'ordi que tu utilises car il faut installer la voix française (je l'ai mise ici > http://www.pbfrance.com/upload/sapi_frenchvirginie.exe).

Apres il faut executer "C:\Windows\SysWOW64\Speech\SpeechUX\sapi.cpl" et à "sélection de la voix" sélectionner "ScanSoft Virgine_Dri40_16kHz".

Enfin faire mumuse avec le code-source modifier que voici :

Code : Tout sélectionner

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

; ****************************************************************************
; ****************************************************************************

EnableExplicit

; ****************************************************************************
; ****************************************************************************

; VALMEUR 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
  EndIf
  If CoCreateInstance_(?CLSID_ITextToSpeech, 0,#CLSCTX_ALL, ?IID_ITextToSpeech, @a) = 0
    bresult = #True
  EndIf
  CoUninitialize_()
  ProcedureReturn bresult 
  
EndProcedure

; ****************************************************************************
; ****************************************************************************

Procedure SAPISpeechtext(stext.s)
;
  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)
          ;
          ; EXEMPLE DE QUELQUES PARAMATRES.
          ;
          speechvoice\put_Rate(-5)
          speechvoice\put_Volume(100)
          ;
          ; EXEMPLE DE QUELQUES PARAMATRES.
          ;
          speechvoice\Speak(bstrtext, 0, @itemp)
          SysFreeString_(bstrtext)
          FreeMemory(*buffer3)
          speechvoice\Release()
        EndIf
        CoUninitialize_()
      EndIf
    EndIf
    FreeMemory(*buffer1)
    FreeMemory(*buffer2)
    
  EndIf
  
EndProcedure

SAPISpeechtext("Voila cela doit être en français")

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
Bonne amusement maintenant ^^
Cordialement,
GallyHC

PS: code complet + info a l'adresse "http://www.pbfrance.com/?url=source&cmd=viewer&val=46"
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: [RESOLU] Speak()

Message par david »

je vais toujours l'essayer à la maison parce que je trouve ça super
c'est vraiment con qu'il faut avoir un code administrateur quand même, je voulais faire des blagues à mes collègues de boulot
et après comme on a accès a un disque dur réseau je voulais l'utiliser pour qu'on puisse faire comme un msn mais qui parle (genre le programme va voir toutes les 5 secondes s'il y a un fichier texte et le lis puis l'efface)
mais bon je sais qu'on ne me donnera pas de code admin donc je vais devoir laisser tomber

merci pour tout
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [RESOLU] Speak()

Message par Ar-S »

Je l'ai mis sur PBfrance aussi.
Modif de la routine SAPISpeechtext() pour gérer la vitesse d'élocution de la voix.

Code : Tout sélectionner

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)
          ;
          ; EXEMPLE DE QUELQUES PARAMATRES.
          ;
          speechvoice\put_Rate(Speed)
          speechvoice\put_Volume(100)
          ;
          ; EXEMPLE DE QUELQUES PARAMATRES.
          ;
          speechvoice\Speak(bstrtext, 0, @itemp)
          SysFreeString_(bstrtext)
          FreeMemory(*buffer3)
          speechvoice\Release()
        EndIf
        CoUninitialize_()
      EndIf
    EndIf
    FreeMemory(*buffer1)
    FreeMemory(*buffer2)
    
  EndIf
  
EndProcedure


; Pour tester
SAPISpeechtext("Je parle normalement.")
SAPISpeechtext("Je parle vite.",5)
SAPISpeechtext("Je parle lentement.",-5) 
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre