Speech Recognition Dictation SAPI 5.1

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

Speech Recognition Dictation SAPI 5.1

Message par nico »

Voici un code de reconnaissance vocale qui écrit à l'écran tout ce que vous dites avec plus ou moins de succès.
Je crois que sous Window XP, il faut installer le SDK SAPI 5.1 pour que ça marche

C'est un code de base qui reprend celui présenté dans l'aide du CHM du SDK SAPI 5.1 dont voici le code:

Code : Tout sélectionner

Dim WithEvents RC As SpInProcRecoContext
Dim Recognizer As SpInprocRecognizer
Dim myGrammar As ISpeechRecoGrammar

Private Sub Form_Load()
    Set RC = New SpInProcRecoContext
    Set Recognizer = RC.Recognizer
    
    Set myGrammar = RC.CreateGrammar
    myGrammar.DictationSetState SGDSActive
    
    Dim Category As SpObjectTokenCategory
    Set Category = New SpObjectTokenCategory
    Category.SetId SpeechCategoryAudioIn

    Dim Token As SpObjectToken
    Set Token = New SpObjectToken
    Token.SetId Category.Default()
    Set Recognizer.AudioInput = Token
End Sub

Private Sub RC_Recognition(ByVal StreamNumber As Long, ByVal StreamPosition As Variant, ByVal RecognitionType As SpeechLib.SpeechRecognitionType, ByVal Result As SpeechLib.ISpeechRecoResult)
    Label1.Caption = Result.PhraseInfo.GetText
End Sub
Le code PureBasic nécessite les fichiers de ComatePlus pour fonctionner!
A ce propos, il y a une erreur dans le fichier COMatePLUS.pbi, il faut remplacer les Hresult par des Hresult.l car sinon ça entraine des erreurs si on compile en 64 bits


Il est évident que si vous n'avez jamais utiliser la reconnaissance vocale de votre ordi, ça ne va pas bien fonctionner!

Il faut dans un premier temps exécuter le module d'apprentissage de la voix de window et suivre les didacticiels, plus vous vous servirez de la reconnaissance vocale, mieux il interprétera votre voix.

Un code complet pour tester de suite (Amusez vous bien :) )
Si vous dites "Bonjour", un MessageBox apparaitra!

Code : Tout sélectionner

XIncludeFile "COMatePLUS.pbi"

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Text_Message
  #String
  #Text_2
  #Text_3
  #Editor
EndEnumeration
;}
;{ Fonts
Enumeration
  #Font_Text_Message
  #Font_String_1
EndEnumeration
;}
;}

Structure Parametres
  SpRecoContext.i
  SpRecoGrammar.i
EndStructure

Procedure SpeechRecoContextEvents(event.COMateObject, event$, parameterCount)
  Protected iParam.iUnknown
  Protected SpeechRecoResult.COMateObject
  Protected SpeechPhraseInfo.COMateObject
  Protected Texte.s
  
  ;Debug("EVT " + Str(parameterCount) + " " + event$)
  
  Select event$
    Case "Recognition"
      Debug "-------------Recognition-----------------"
      iParam = event\GetObjectEventParam(4)
      If iParam
        SpeechRecoResult = COMate_WrapCOMObject(iParam)
        If SpeechRecoResult
          SpeechPhraseInfo = SpeechRecoResult\GetObjectProperty("PhraseInfo()")
          If SpeechPhraseInfo
            Texte = SpeechPhraseInfo\GetStringProperty("GetText(0, -1, 1)")
            
            SetGadgetText(#String, Texte)
            
            If FindString(LCase(Texte), "bonjour")
              MessageRequester("Info", "Vous avez dit le mot Bonjour!")
            EndIf
            
            SpeechPhraseInfo\Release()
          EndIf
          SpeechRecoResult\Release()
        EndIf
        iParam\Release()
      EndIf
      
    Case "Hypothesis"
      Debug "------------Hypothesis------------------"
      
      SetGadgetText(#Text_Message, "Enregistrement en cours...")
      
      iParam = event\GetObjectEventParam(3)
      If iParam
        SpeechRecoResult = COMate_WrapCOMObject(iParam)
        If SpeechRecoResult
          SpeechPhraseInfo = SpeechRecoResult\GetObjectProperty("PhraseInfo()")
          If SpeechPhraseInfo
            Texte = SpeechPhraseInfo\GetStringProperty("GetText(0, -1, 1)")
            
            SetGadgetText(#Editor, Texte + Chr(13) + GetGadgetText(#Editor))
            
            SpeechPhraseInfo\Release()
          EndIf
          SpeechRecoResult\Release()
        EndIf
        iParam\Release()
      EndIf
      
    Case "SoundStart"
      Debug "SoundStart"
      SetGadgetText(#String, "")
      
    Case "SoundEnd"
      Debug "SoundEnd"
      SetGadgetText(#Text_Message, "Parler")
      
    Case "StartStream"
      ; Debug "StartStream"
      
      
    Case "EndStream"
      ; Debug "EndStream"
      
  EndSelect
  
EndProcedure

Procedure Load_Speech_Recognition(*Speech_Recognition.Parametres)
  Protected SpRecoContext.COMateObject
  Protected SpRecoGrammar.COMateObject
  Protected SpRecognizer.COMateObject
  Protected SpeechRecognizer.COMateObject
  Protected SpObjectTokenCategory.COMateObject
  Protected SpObjectToken.COMateObject
  Protected Init_Recognition.l = 0
  
  SpRecoContext = COMate_CreateObject("SAPI.SpInProcRecoContext")
  If SpRecoContext = 0 : Goto Clean : EndIf
  
  
  SpRecoGrammar = SpRecoContext\GetObjectProperty("CreateGrammar(0)")
  If SpRecoGrammar = 0 : Goto Clean : EndIf
  
  
  SpRecognizer = SpRecoContext\GetObjectProperty("Recognizer()")
  If SpRecognizer = 0 : Goto Clean : EndIf
  
  
  Recognizer.idispatch = SpRecognizer\GetCOMObject()
  If Recognizer = 0 : Goto Clean : EndIf
  
  Recognizer\QueryInterface(?IID_SpeechRecognizer, @SpeechRecognizer_)
  If SpeechRecognizer_ = 0 : Goto Clean : EndIf
  
  SpeechRecognizer.COMateObject = COMate_WrapCOMObject(SpeechRecognizer_)
  If SpeechRecognizer = 0 : Goto Clean : EndIf
  
  #SPLO_STATIC = 0
  SpRecoGrammar\invoke("Dictationload('', " + Str(#SPLO_STATIC) + ")")
  
  
  SpObjectTokenCategory = COMate_CreateObject("SAPI.SpObjectTokenCategory")
  If SpObjectTokenCategory = 0 : Goto Clean : EndIf
  
  #SpeechCategoryAudioIn="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\AudioInput"
  If SpObjectTokenCategory\invoke("SetId('"+ #SpeechCategoryAudioIn +"', 0)") <> 0
    Debug comate_getlasterrordescription()
    Goto Clean
  EndIf
  
  SpObjectToken = COMate_CreateObject("SAPI.SpObjectToken")
  If SpObjectToken = 0 : Goto Clean : EndIf
  
  Audio$=SpObjectTokenCategory\GetStringProperty("Default()")
  Debug audio$
  If SpObjectToken\invoke("SetId('"+ Audio$ + "')") <> 0
    Goto Clean
  EndIf
  
  If SpeechRecognizer\Setpropertyref("AudioInput(" + Str(SpObjectToken) + " as COMateObject)") <> 0
    Goto Clean
  EndIf
  
  If SpRecoContext\SetEventHandler(#COMate_CatchAllEvents, @SpeechRecoContextEvents()) <> 0
    Goto Clean
  EndIf
  
  ; Lance le moteur de reconnaissance vocale
  #SGDSActive = 1
  If SpRecoGrammar\invoke("DictationSetState(" + Str(#SGDSActive) + ")") <> 0
    Goto Clean
  Else
    Init_Recognition = 1
  EndIf
  
  Clean:
  If SpRecognizer <> 0 : SpRecognizer\Release() : EndIf
  If SpeechRecognizer <> 0 : SpeechRecognizer\Release() : EndIf
  If SpObjectTokenCategory <> 0 : SpObjectTokenCategory\Release() : EndIf
  If SpObjectToken <> 0 : SpObjectToken\Release() : EndIf
  
  If Init_Recognition = 0
    If SpRecoContext <> 0 : SpRecoContext\Release() : EndIf
    If SpRecoGrammar <> 0 : SpRecoGrammar\Release() : EndIf
  Else
    *Speech_Recognition\SpRecoContext = SpRecoContext
    *Speech_Recognition\SpRecoGrammar = SpRecoGrammar
  EndIf
  
  ProcedureReturn Init_Recognition
EndProcedure

Procedure Finish_Speech_Recognition(*Speech_Recognition.Parametres)
  Protected SpRecoContext.COMateObject
  Protected SpRecoGrammar.COMateObject
  
  SpRecoContext = *Speech_Recognition\SpRecoContext
  SpRecoGrammar = *Speech_Recognition\SpRecoGrammar
  
  If SpRecoGrammar <> 0
    ; Arrête le moteur de reconnaissance vocale
    #SGDSInActive = 0
    SpRecoGrammar\invoke("DictationSetState(" + Str(#SGDSInActive) + ")")
    SpRecoGrammar\Release()
    Debug "ok"
  EndIf
  
  If SpRecoContext <> 0
    SpRecoContext\SetEventHandler(#COMate_CatchAllEvents, 0)
    SpRecoContext\Release()
  EndIf
  
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 0, 0, 400, 400, "Speech Recognition", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
    TextGadget(#Text_Message, 0, 0, 400, 50, "Parler et commencer par dire : Bonjour", #PB_Text_Center)
    StringGadget(#String, 0, 95, 400, 35, "")
    TextGadget(#Text_2, 0, 75, 400, 20, "  Phrase Reconnue:")
    TextGadget(#Text_3, 0, 160, 400, 20, "  Phrase décryptée au fur et à mesure de l'enregistrement:")
    EditorGadget(#Editor, 0, 180, 400, 220)
    ; Gadget Fonts
    SetGadgetFont(#Text_Message, LoadFont(#Font_Text_Message, "Microsoft Sans Serif", 12, 272))
    SetGadgetFont(#String, LoadFont(#Font_String_1, "Microsoft Sans Serif", 12, 16))
  EndIf
EndProcedure

CoInitialize_(0)

If Load_Speech_Recognition(@Speech_Recognition.Parametres) = 0
  MessageRequester("Erreur", "L'initialisation du moteur de la reconnaissance vocale à échoué!")
  End
EndIf

OpenWindow_Window_0()

;{- Event loop
Repeat
  Select WaitWindowEvent()
      ;/ //////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Text_Message
        Case #String
        Case #Text_2
        Case #Text_3
        Case #Editor
      EndSelect
      ;/ ///////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Finish_Speech_Recognition(@Speech_Recognition.Parametres)
          CoUninitialize_()
          Break
      EndSelect
  EndSelect
ForEver
;
;}


Macro GUID(iid, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, b0)
  DataSection
    IID:
    Data.l $a0
    Data.w $a1, $a2
    Data.b $a3, $a4, $a5, $a6, $a7, $a8, $a9, $b0
  EndDataSection
EndMacro

GUID(IID_SpeechRecognizer, 2D5F1C0C, BD75, 4B08, 94, 78, 3B, 11, FE, A2, 58, 6C)

Dernière modification par nico le mar. 12/juin/2012 12:11, modifié 3 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Speech Recognition (Reconnaissance vocale)

Message par falsam »

Bonjour : Phrase reconnue : Des sdf 900

Je crois que je vais m'entrainer :) Merci pour ce partage Nico.
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%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Speech Recognition (Reconnaissance vocale)

Message par Backup »

Nico , tu m'a mis sur le cul là ! 8O

ça marche niquel chez moi :)

( je venais de finir l’apprentissage de ma voix sur Seven :) )

bon , va falloir que je me casse la tete a essayer de comprendre ... :)

pour les agents, de mon coté j'ai avancé un petit peu , mais je redoute un truc

j'ai reussi a faire apparaitre le popup de la reconnaissance Vocale, qui dit que ça ne marche pas en anglais ...
je suppose que les agents ne reconnaissent QUE l'anglais , mais que mon Seven est en français , du coup conflit !

bon c'est pas grave , tu nous a carrement bien dépanné sur le coup ( comme a l'epoque la synthese Vocale d'ailleurs ;) .. et bien d'autres choses :) )

Merci pour ce boulot, je pense que meme les anglais vont etre sur le cul :)
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Speech Recognition (Reconnaissance vocale)

Message par venom »

arf... j'ai pas de micro sous la main mais l'idée est dément bravo nico :wink:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Speech Recognition (Reconnaissance vocale)

Message par nico »

J'ai mis le code à jour, il correspond maintenant exactement au code présenté dans l'aide de SAPI, dont j'ai mis le code; ça peut permettre à certains d'y voir un peu plus clair.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Speech Recognition (Reconnaissance vocale)

Message par Backup »

19 lignes contre ... pleins ...

le purebasic est vraiment un langage de base ... :)


Merci beaucoup .. vais m'amuser a ajouter de la reconnaissance vocale dans mes applis :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Speech Recognition (Reconnaissance vocale)

Message par nico »

Le code n'est pas très adapté pour des commandes car il ajoute souvent aux mots prononcés des déchets (ajout d'autres mots du à une mauvaise compréhension ou a du souffle)

Il y a pour cela un autre code qui utilise un dictionnaire (des mots que l'on met dans une liste), je posterais un code plus tard!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Speech Recognition (Reconnaissance vocale)

Message par Backup »

nico a écrit :Le code n'est pas très adapté pour des commandes car il ajoute souvent aux mots prononcés des déchets (ajout d'autres mots du à une mauvaise compréhension ou a du souffle)

Il y a pour cela un autre code qui utilise un dictionnaire (des mots que l'on met dans une liste), je posterais un code plus tard!

Miam ! :D je m'en régale d'avance :)

déja de pouvoir récupérer un ou 2 mots dans une phrases c'est géant !

pour un logiciel finalement l'essentiel est de récupérer justement que quelques mots , pour avoir idée de ce que désire l'utilisateur :)
par exemple dans cette phrase : ( un peu longue pour l'exemple )
"Bonjour , monsieur l'ordinateur , je désire Effacer , le fichier qui se nome Toto.txt , mais ne surtout pas toucher aux autres"

seul "effacer" et "Toto.txt" intéresse le logiciel .. le reste c'est de l'etat d'Ame de l'utilisateur qui nous raconte sa vie :)

Apres , bien sur , il faut adapter les mots clefs, en fonction du logiciel ---> Rajout pour Case : :) : ET DU CONTEXTE
Dernière modification par Backup le dim. 10/juin/2012 10:25, modifié 2 fois.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Speech Recognition (Reconnaissance vocale)

Message par case »

je schematise pas mal mais
l'interpretation est importante car un utilisateur peut dire

toto point txt
ou
toto txt

dans les deux cas il faut que le soft sache trouver toto.txt

de plus if faut pouvoir interpréter correctement les mots

toto txt pourrait être interprété par

toto t'es xt
ou
toto txt
ou
to to txt

ou d'autre mots avec la meme sonoritée

t'haie
t'ai
thé

...
c'est quand même pas évident
ImageImage
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Speech Recognition (Reconnaissance vocale)

Message par Backup »

case a écrit :je schematise pas mal mais
l'interpretation est importante car un utilisateur peut dire

toto point txt
ou
toto txt

dans les deux cas il faut que le soft sache trouver toto.txt

de plus if faut pouvoir interpréter correctement les mots

toto txt pourrait être interprété par

toto t'es xt
ou
toto txt
ou
to to txt

ou d'autre mots avec la meme sonoritée

t'haie
t'ai
thé

...
c'est quand même pas évident

:lol: tu me fais pensé a la parabol du simplet a qui on montre la lune, et qui regarde le doigt :roll:
venant de toi, ça me surprends quand meme ..... 8O

c'est un exemple , pour dire qu'a partir de quelque mots clef , et du CONTEXTE , on peut déduire la demande d'un utilisateur

par exemple le ".txt" tu peux t'en passer , s'il s'agit d'un logiciel qui ne fait que ce format ....

apparemment tu ne dois pas savoir , que pléthore de logiciels existent, basé sur ce principe
d'analyse de mots clefs ...

j'ai eu en exemple des listings d'analyse psychologique , ou le soft déduisait la personnalité de quelqu'un rien qu'en "lisant" quelques mots clef d'une phrase ..

par exemple , quelqu'un qui ecrit tres souvent , "Moi je" (bien a la mode des discours des d'jeunes dans les TV réalité) , est le signe certains d'un Égocentrisme affirmé

bon , c'etait un exemple de principe , mais je peux te dire, que la methode est tres connu , l'analyse de mot clef ( en fonction du contexte...bien sur )
peut façilement etre exploité pour en tirer une action ...
de plus dans le doute , rien n'empeche de proposer plusieurs choix par une boites de dialogue
... le moins possible, car ça deviens vite lourd a exploiter ...

je pense a un exemple concret , d'une personne handicapé du language (ou un enfant en bas age), qui arrive avec quelque mots (meme mal prononcés)
a ce faire comprendre , ( de ses parents.. pour l'enfant )
dans ce cas , l'enfant, c'est l'utilisateur , le parent , c'est le logiciel qui analyse :)
:)

ps : je ne dis pas que c'est simple a faire ... mais c'est faisable , avec des précautions pour ce qui concerne les actions qui toucherai a l'effacement, le formatage ect ..
ajouter des boite de confirmation .. ( enfin le formatage , faudrai p'tete eviter :lol: )
Dernière modification par Backup le dim. 10/juin/2012 10:32, modifié 1 fois.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Speech Recognition (Reconnaissance vocale)

Message par case »

content de t'avoir surpris :)

mais comme précisé je schématise pas mal. je ne fais que soulever les difficultés dans ce genre d'entreprise.

cependant c'est deja une belle avancée pour notre langage :)
ImageImage
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Speech Recognition (Reconnaissance vocale)

Message par Backup »

case a écrit :content de t'avoir surpris :)
:lol:


cependant c'est deja une belle avancée pour notre langage
et pour notre vie de Geek , enfin on peut parler a notre Ordi, et qu'il nous réponds :lol: on se sent moins seul dans nos LABO respectif :lol:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Speech Recognition (Reconnaissance vocale)

Message par nico »

Je m'en vais posté le code par dictionnaire, il est quasi identique au premier, il y a très peu de modification, tout se passe dans un fichier xml que je n'ai pas pris le temps de décortiquer, je pense que Dobro s'intéressant plus que moi à la reconnaissance vocale pourra peut être nous faire une mise au point sur la syntaxe de ce fichier.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: Speech Recognition Dictation SAPI 5.1

Message par Frenchy Pilou »

Peut-on envisager d'introduire un fichier mp3 à la place de la prise son direct par le micro ?
Est beau ce qui plaît sans concept :)
Speedy Galerie
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Speech Recognition Dictation SAPI 5.1

Message par nico »

Il semble qu'on puisse charger un fichier wav, ce serait quoi l'idée de faire ça?
Répondre