-
Notifications
You must be signed in to change notification settings - Fork 0
/
frmSpRecognizer.frm
292 lines (259 loc) · 8.34 KB
/
frmSpRecognizer.frm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
'#Region "Form"
#if defined(__FB_MAIN__) AndAlso Not defined(__MAIN_FILE__)
#define __MAIN_FILE__
#ifdef __FB_WIN32__
#cmdline "frmSpRecognizer.rc"
#endif
Const _MAIN_FILE_ = __FILE__
#endif
#include once "mff/Form.bi"
#include once "mff/ComboBoxEdit.bi"
#include once "mff/CommandButton.bi"
#include once "mff/TextBox.bi"
#include once "mff/Label.bi"
#include once "Speech.bi"
Using My.Sys.Forms
Using Speech
Type frmSpRecognizerType Extends Form
ClassID As GUID
RIid As GUID
pSpRecognizer As ISpRecognizer Ptr
pSpRecoContext As ISpRecoContext Ptr
pSpRecoGrammar As ISpRecoGrammar Ptr
pWaveFormat As WaveFormatEx Ptr = Allocate(SizeOf(WaveFormatEx))
mCancel As Boolean
Declare Sub ProcessRecognition()
Declare Sub Form_Create(ByRef Sender As Control)
Declare Sub Form_Close(ByRef Sender As Form, ByRef Action As Integer)
Declare Sub CommandButton_Click(ByRef Sender As Control)
Declare Constructor
Dim As ComboBoxEdit ComboBoxEdit1, ComboBoxEdit2
Dim As CommandButton CommandButton1, CommandButton2
Dim As TextBox TextBox1
Dim As Label Label1, Label2, Label3
End Type
Constructor frmSpRecognizerType
#if _MAIN_FILE_ = __FILE__
With App
.CurLanguagePath = ExePath & "/Languages/"
.CurLanguage = .Language
End With
#endif
' frmSpRecognizer
With This
.Name = "frmSpRecognizer"
.Text = "SAPI Speech-Recognizer"
.Designer = @This
.OnCreate = Cast(Sub(ByRef Designer As My.Sys.Object, ByRef Sender As Control), @Form_Create)
.OnClose = Cast(Sub(ByRef Designer As My.Sys.Object, ByRef Sender As Form, ByRef Action As Integer), @Form_Close)
.Caption = "SAPI Speech-Recognizer"
.StartPosition = FormStartPosition.CenterScreen
.BorderStyle = FormBorderStyle.FixedSingle
.MaximizeBox = False
.SetBounds 0, 0, 420, 290
End With
' Label1
With Label1
.Name = "Label1"
.Text = "Audio input device"
.TabIndex = 0
.Caption = "Audio input device"
.SetBounds 10, 10, 180, 20
.Designer = @This
.Parent = @This
End With
' ComboBoxEdit1
With ComboBoxEdit1
.Name = "ComboBoxEdit1"
.Text = "ComboBoxEdit1"
.TabIndex = 1
.Style = ComboBoxEditStyle.cbDropDown
.SetBounds 10, 30, 390, 21
.Designer = @This
.Parent = @This
End With
' Label2
With Label2
.Name = "Label2"
.Text = "Voice select"
.TabIndex = 2
.Caption = "Voice select"
.SetBounds 10, 60, 180, 20
.Designer = @This
.Parent = @This
End With
' ComboBoxEdit2
With ComboBoxEdit2
.Name = "ComboBoxEdit2"
.Text = "ComboBoxEdit2"
.TabIndex = 3
.Style = ComboBoxEditStyle.cbDropDown
.SetBounds 10, 80, 388, 21
.Designer = @This
.Parent = @This
End With
' Label3
With Label3
.Name = "Label3"
.Text = "Recognize result"
.TabIndex = 4
.Caption = "Recognize result"
.SetBounds 10, 130, 180, 20
.Designer = @This
.Parent = @This
End With
' CommandButton1
With CommandButton1
.Name = "CommandButton1"
.Text = "Start"
.TabIndex = 5
.Caption = "Start"
.SetBounds 190, 130, 100, 20
.Designer = @This
.OnClick = Cast(Sub(ByRef Designer As My.Sys.Object, ByRef Sender As Control), @CommandButton_Click)
.Parent = @This
End With
' CommandButton2
With CommandButton2
.Name = "CommandButton2"
.Text = "Stop"
.TabIndex = 6
.Caption = "Stop"
.Enabled = False
.SetBounds 300, 130, 100, 20
.Designer = @This
.OnClick = Cast(Sub(ByRef Designer As My.Sys.Object, ByRef Sender As Control), @CommandButton_Click)
.Parent = @This
End With
' TextBox1
With TextBox1
.Name = "TextBox1"
.Text = ""
.TabIndex = 7
.HideSelection = False
.Multiline = True
.ID = 1025
.ScrollBars = ScrollBarsType.Both
.SetBounds 10, 160, 390, 90
.Designer = @This
.Parent = @This
End With
End Constructor
Dim Shared frmSpRecognizer As frmSpRecognizerType
#if _MAIN_FILE_ = __FILE__
App.DarkMode = True
frmSpRecognizer.MainForm = True
frmSpRecognizer.Show
App.Run
#endif
'#End Region
Private Sub frmSpRecognizerType.ProcessRecognition()
Dim As SPEVENT sEvent
Dim As ULong fetched
If pSpRecoContext = NULL Then Exit Sub
Dim As HRESULT hr = pSpRecoContext->GetEvents(1, @sEvent, @fetched)
If (SUCCEEDED(hr)) Then
Select Case sEvent.eEventId
Case 0
Case SPEI_RECOGNITION
Dim As ISpRecoResult Ptr pSpRecoResult = Cast(UInteger, sEvent.lParam)
Debug.Print "pSpRecoResult " & pSpRecoResult
Dim As WString Ptr pwszText
pSpRecoResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, True, @pwszText, nullptr)
TextBox1.AddLine *pwszText
CoTaskMemFree(pwszText)
Case Else
Debug.Print sEvent.eEventId
End Select
End If
End Sub
Private Sub frmSpRecognizerType.Form_Create(ByRef Sender As Control)
Debug.Clear
'init COM lib
CoInitialize(NULL)
'init a recognizer list
TokenCategory2Cob(SPCAT_AUDIOIN, ComboBoxEdit1)
'init a input list
TokenCategory2Cob(SPCAT_RECOGNIZERS, ComboBoxEdit2)
End Sub
Private Sub frmSpRecognizerType.Form_Close(ByRef Sender As Form, ByRef Action As Integer)
'release recognizer
If pSpRecoGrammar Then pSpRecoGrammar->Release()
If pSpRecoContext Then pSpRecoContext->Release()
If pSpRecognizer Then pSpRecognizer->Release()
'release COM lib
CoUninitialize()
End Sub
Private Sub frmSpRecognizerType.CommandButton_Click(ByRef Sender As Control)
Debug.Print Sender.Name & ": Start"
Select Case Sender.Name
Case "CommandButton1"
mCancel = False
CommandButton1.Enabled = False
CommandButton2.Enabled = True
ComboBoxEdit1.Enabled = CommandButton1.Enabled
ComboBoxEdit2.Enabled = CommandButton1.Enabled
TextBox1.Clear
TextBox1.SetFocus
CLSIDFromString(CLSID_SpInprocRecognizer, @ClassID)
IIDFromString(IID_ISpRecognizer, @RIid)
Debug.Print "CoCreateInstance " & CoCreateInstance(@ClassID, NULL, CLSCTX_ALL, @RIid, @pSpRecognizer)
If pSpRecognizer Then
Debug.Print "SetRecoState " & pSpRecognizer->SetRecoState(SPRST_INACTIVE_WITH_PURGE)
Dim i As Integer
i = ComboBoxEdit1.ItemIndex
Debug.Print "ItemIndex " & i
Debug.Print "ItemData " & ComboBoxEdit1.ItemData(i)
Debug.Print "SetInput " & pSpRecognizer->SetInput(ComboBoxEdit1.ItemData(i), True)
i = ComboBoxEdit2.ItemIndex
Debug.Print "ItemIndex " & i
Debug.Print "ItemData " & ComboBoxEdit2.ItemData(i)
Debug.Print "SetRecognizer " & pSpRecognizer->SetRecognizer(ComboBoxEdit2.ItemData(i))
Debug.Print "SetRecoState " & pSpRecognizer->SetRecoState(SPRST_ACTIVE_ALWAYS)
Debug.Print "CreateRecoContext " & pSpRecognizer->CreateRecoContext(@pSpRecoContext)
IIDFromString(SPDFID_WaveFormatEx, @RIid)
Debug.Print "GetFormat " & pSpRecognizer->GetFormat(SPWAVEFORMATType.SPWF_INPUT, @RIid, @pWaveFormat)
Debug.Print "Audio Format:"
Debug.Print " Format Tag: " & pWaveFormat->wFormatTag
Debug.Print " Channels: " & pWaveFormat->nChannels
Debug.Print " Samples Per Second: " & pWaveFormat->nSamplesPerSec
Debug.Print " Bits Per Sample: " & pWaveFormat->wBitsPerSample
Debug.Print " Block Align: " & pWaveFormat->nBlockAlign
Debug.Print " Avg Bytes Per Second: " & pWaveFormat->nAvgBytesPerSec
Debug.Print " Extra Size: " & pWaveFormat->cbSize
End If
If pSpRecoContext Then
'设置识别模式为听写(Dictation)
Debug.Print "CreateGrammar " & pSpRecoContext->CreateGrammar(0, @pSpRecoGrammar)
Debug.Print "LoadDictation " & pSpRecoGrammar->LoadDictation(NULL, SPLO_STATIC)
'开始语音识别
Debug.Print "SetDictationState " & pSpRecoGrammar->SetDictationState(SPRS_ACTIVE)
Debug.Print "SetContextState " & pSpRecoContext->SetContextState(SPCS_ENABLED)
End If
Do
ProcessRecognition
App.DoEvents
Loop While mCancel = False
Case "CommandButton2"
mCancel = True
CommandButton1.Enabled = True
CommandButton2.Enabled = False
ComboBoxEdit1.Enabled = CommandButton1.Enabled
ComboBoxEdit2.Enabled = CommandButton1.Enabled
If pSpRecoGrammar Then
pSpRecoGrammar->Release()
pSpRecoGrammar = NULL
End If
If pSpRecoContext Then
pSpRecoContext->SetContextState(SPCS_DISABLED)
pSpRecoContext->Release()
pSpRecoContext = NULL
End If
If pSpRecognizer Then
pSpRecognizer->SetRecoState(SPRST_INACTIVE_WITH_PURGE)
pSpRecognizer->Release()
pSpRecognizer = NULL
End If
End Select
Debug.Print Sender.Name & ": End"
End Sub