Speech Recognition Dictation SAPI 5.1

Share your advanced PureBasic knowledge/code with the community.
Nico
Enthusiast
Enthusiast
Posts: 274
Joined: Sun Jan 11, 2004 11:34 am
Location: France

Speech Recognition Dictation SAPI 5.1

Post by Nico »

Translate code to PB from CHM of SDK SAPI 5.1

Code: Select all

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

Code: Select all

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)
            
            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
  Protected Audio$
  
  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)

Liqu
User
User
Posts: 77
Joined: Sun Apr 21, 2013 10:31 am

Re: Speech Recognition Dictation SAPI 5.1

Post by Liqu »

Hi Nico,

I tried on my pc W7 x64 and Using PB 5.20 LTS (x86 ) , but can't get it to work,
got this error :
"L'initialisation du moteur de la reconnaissance vocale à échoué!"

Please help, thank you :)
Mythros
Enthusiast
Enthusiast
Posts: 306
Joined: Mon Aug 19, 2013 3:28 pm

Re: Speech Recognition Dictation SAPI 5.1

Post by Mythros »

That is translated to:
MessageRequester("Error", "Initialization of motor speech recognition failed!"+Chr(10)+"Please install Microsoft SAPI 5.1 or plugin your microphone / webcam device!")
Liqu
User
User
Posts: 77
Joined: Sun Apr 21, 2013 10:31 am

Re: Speech Recognition Dictation SAPI 5.1

Post by Liqu »

Mythros wrote:That is translated to:
MessageRequester("Error", "Initialization of motor speech recognition failed!"+Chr(10)+"Please install Microsoft SAPI 5.1 or plugin your microphone / webcam device!")
Thank you for your help Mythros :D

hmm, i've already plug in my microphone, and my sound successfully go through W7 "Windows Speech Recognition".
When i googled Microsoft SAPI 5.1 for Windows 7, it said that Microsoft SAPI 5.1 is already a default application for Windows 7.

I'm confused now :?
Nico
Enthusiast
Enthusiast
Posts: 274
Joined: Sun Jan 11, 2004 11:34 am
Location: France

Re: Speech Recognition Dictation SAPI 5.1

Post by Nico »

If you have Window 64 bit, compile to x64 unicode, work here!
Liqu
User
User
Posts: 77
Joined: Sun Apr 21, 2013 10:31 am

Re: Speech Recognition Dictation SAPI 5.1

Post by Liqu »

"If you have Window 64 bit, compile to x64 unicode, work here!"

Yeah, it works great if i use 64bit complier :D

btw, how to make it works using 32bit compiler using 64bit OS?
since my other code might not 64bit ready :oops:
Nico
Enthusiast
Enthusiast
Posts: 274
Joined: Sun Jan 11, 2004 11:34 am
Location: France

Re: Speech Recognition Dictation SAPI 5.1

Post by Nico »

For an unknown reason, it does not work on 32 bit, I do not find a way out!
Zvire
New User
New User
Posts: 3
Joined: Sat Aug 29, 2015 2:56 pm

Re: Speech Recognition Dictation SAPI 5.1

Post by Zvire »

im geting syntax error of line 342

GUID(IID_ISpeechRecoGrammar, B6D6F79F, 2158, 4E50, B5, BC, 9A, 9C, CD, 85, 2A, 09)


please help
Nico
Enthusiast
Enthusiast
Posts: 274
Joined: Sun Jan 11, 2004 11:34 am
Location: France

Re: Speech Recognition Dictation SAPI 5.1

Post by Nico »

Your version of PureBasic?
Zvire
New User
New User
Posts: 3
Joined: Sat Aug 29, 2015 2:56 pm

Re: Speech Recognition Dictation SAPI 5.1

Post by Zvire »

5.31
sapi 5.1
windows xp
Nico
Enthusiast
Enthusiast
Posts: 274
Joined: Sun Jan 11, 2004 11:34 am
Location: France

Re: Speech Recognition Dictation SAPI 5.1

Post by Nico »

Only try my code, if you do not have an error (I do not have any error with this version of PureBasic); is that you introduced yourself a synthax error in this code or in your code added, sometimes the problem is not the line identified by the compiler.
Zvire
New User
New User
Posts: 3
Joined: Sat Aug 29, 2015 2:56 pm

Re: Speech Recognition Dictation SAPI 5.1

Post by Zvire »

i find solution , little strange, but work it ;-) i made SR modul in visual , and rest of aplication is in pure ;-)
little pity, but work it so i will survive :D
Post Reply