Page 1 sur 1

[RESOLU] Speak()

Publié : mar. 10/mai/2011 11:42
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:

Re: Speak()

Publié : mar. 10/mai/2011 12:05
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)

Re: Speak()

Publié : mar. 10/mai/2011 19:50
par Anonyme 2
Ok merci pour les infos :)

Re: [RESOLU] Speak()

Publié : mer. 05/nov./2014 17:22
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

Re: [RESOLU] Speak()

Publié : mer. 05/nov./2014 21:05
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"

Re: [RESOLU] Speak()

Publié : jeu. 06/nov./2014 11:09
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

Re: [RESOLU] Speak()

Publié : jeu. 06/nov./2014 14:29
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)