1 /*---------------------------------------------------------------------------*
2 * Recognizer.c *
3 * *
4 * Copyright 2007, 2008 Nuance Communciations, Inc. *
5 * *
6 * Licensed under the Apache License, Version 2.0 (the 'License'); *
7 * you may not use this file except in compliance with the License. *
8 * *
9 * You may obtain a copy of the License at *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, software *
13 * distributed under the License is distributed on an 'AS IS' BASIS, *
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15 * See the License for the specific language governing permissions and *
16 * limitations under the License. *
17 * *
18 *---------------------------------------------------------------------------*/
19
20 #include "SR_Recognizer.h"
21 #include "SR_RecognizerImpl.h"
22 #include "ESR_Session.h"
23 #include "plog.h"
24 #include "pmemory.h"
25
26 #define COUNT_INTERVAL 20
27
SR_RecognizerStart(SR_Recognizer * self)28 ESR_ReturnCode SR_RecognizerStart(SR_Recognizer* self)
29 {
30 if (self == NULL)
31 {
32 PLogError(L("ESR_INVALID_ARGUMENT"));
33 return ESR_INVALID_ARGUMENT;
34 }
35 #ifdef SREC_ENGINE_TRACK_RECOGNITION
36 PLogMessage ( "Entering Recognizer Start\n" );
37 #endif
38 return self->start(self);
39 }
40
SR_RecognizerStop(SR_Recognizer * self)41 ESR_ReturnCode SR_RecognizerStop(SR_Recognizer* self)
42 {
43 if (self == NULL)
44 {
45 PLogError(L("ESR_INVALID_ARGUMENT"));
46 return ESR_INVALID_ARGUMENT;
47 }
48 #ifdef SREC_ENGINE_TRACK_RECOGNITION
49 PLogMessage ( "Entering Recognizer Stop\n" );
50 #endif
51 return self->stop(self);
52 }
53
SR_RecognizerDestroy(SR_Recognizer * self)54 ESR_ReturnCode SR_RecognizerDestroy(SR_Recognizer* self)
55 {
56 if (self == NULL)
57 {
58 PLogError(L("ESR_INVALID_ARGUMENT"));
59 return ESR_INVALID_ARGUMENT;
60 }
61 return self->destroy(self);
62 }
63
SR_RecognizerSetup(SR_Recognizer * self)64 ESR_ReturnCode SR_RecognizerSetup(SR_Recognizer* self)
65 {
66 if (self == NULL)
67 {
68 PLogError(L("ESR_INVALID_ARGUMENT"));
69 return ESR_INVALID_ARGUMENT;
70 }
71 return self->setup(self);
72 }
73
SR_RecognizerUnsetup(SR_Recognizer * self)74 ESR_ReturnCode SR_RecognizerUnsetup(SR_Recognizer* self)
75 {
76 if (self == NULL)
77 {
78 PLogError(L("ESR_INVALID_ARGUMENT"));
79 return ESR_INVALID_ARGUMENT;
80 }
81 return self->unsetup(self);
82 }
83
SR_RecognizerIsSetup(SR_Recognizer * self,ESR_BOOL * isSetup)84 ESR_ReturnCode SR_RecognizerIsSetup(SR_Recognizer* self, ESR_BOOL* isSetup)
85 {
86 if (self == NULL)
87 {
88 PLogError(L("ESR_INVALID_ARGUMENT"));
89 return ESR_INVALID_ARGUMENT;
90 }
91 return self->isSetup(self, isSetup);
92 }
93
SR_RecognizerGetParameter(SR_Recognizer * self,const LCHAR * name,LCHAR * value,size_t * len)94 ESR_ReturnCode SR_RecognizerGetParameter(SR_Recognizer* self, const LCHAR* name, LCHAR* value, size_t* len)
95 {
96 if (self == NULL)
97 {
98 PLogError(L("ESR_INVALID_ARGUMENT"));
99 return ESR_INVALID_ARGUMENT;
100 }
101 return self->getParameter(self, name, value, len);
102 }
103
SR_RecognizerGetSize_tParameter(SR_Recognizer * self,const LCHAR * name,size_t * value)104 ESR_ReturnCode SR_RecognizerGetSize_tParameter(SR_Recognizer* self, const LCHAR* name, size_t* value)
105 {
106 if (self == NULL)
107 {
108 PLogError(L("ESR_INVALID_ARGUMENT"));
109 return ESR_INVALID_ARGUMENT;
110 }
111 return self->getSize_tParameter(self, name, value);
112 }
113
SR_RecognizerGetBoolParameter(SR_Recognizer * self,const LCHAR * name,ESR_BOOL * value)114 ESR_ReturnCode SR_RecognizerGetBoolParameter(SR_Recognizer* self, const LCHAR* name, ESR_BOOL* value)
115 {
116 if (self == NULL)
117 {
118 PLogError(L("ESR_INVALID_ARGUMENT"));
119 return ESR_INVALID_ARGUMENT;
120 }
121 return self->getBoolParameter(self, name, value);
122 }
123
SR_RecognizerSetParameter(SR_Recognizer * self,const LCHAR * name,LCHAR * value)124 ESR_ReturnCode SR_RecognizerSetParameter(SR_Recognizer* self, const LCHAR* name, LCHAR* value)
125 {
126 if (self == NULL)
127 {
128 PLogError(L("ESR_INVALID_ARGUMENT"));
129 return ESR_INVALID_ARGUMENT;
130 }
131 return self->setParameter(self, name, value);
132 }
133
SR_RecognizerSetSize_tParameter(SR_Recognizer * self,const LCHAR * name,size_t value)134 ESR_ReturnCode SR_RecognizerSetSize_tParameter(SR_Recognizer* self, const LCHAR* name, size_t value)
135 {
136 if (self == NULL)
137 {
138 PLogError(L("ESR_INVALID_ARGUMENT"));
139 return ESR_INVALID_ARGUMENT;
140 }
141 if ( LSTRCMP( L("CREC.Frontend.samplerate"), name ) == 0 )
142 return SR_Recognizer_Change_Sample_Rate ( self, value );
143 else
144 return self->setSize_tParameter(self, name, value);
145 }
146
SR_RecognizerSetBoolParameter(SR_Recognizer * self,const LCHAR * name,ESR_BOOL value)147 ESR_ReturnCode SR_RecognizerSetBoolParameter(SR_Recognizer* self, const LCHAR* name, ESR_BOOL value)
148 {
149 if (self == NULL)
150 {
151 PLogError(L("ESR_INVALID_ARGUMENT"));
152 return ESR_INVALID_ARGUMENT;
153 }
154 return self->setBoolParameter(self, name, value);
155 }
156
SR_RecognizerSetupRule(SR_Recognizer * self,SR_Grammar * grammar,const LCHAR * ruleName)157 ESR_ReturnCode SR_RecognizerSetupRule(SR_Recognizer* self, SR_Grammar* grammar,
158 const LCHAR* ruleName)
159 {
160 if (self == NULL)
161 {
162 PLogError(L("ESR_INVALID_ARGUMENT"));
163 return ESR_INVALID_ARGUMENT;
164 }
165 return self->setupRule(self, grammar, ruleName);
166 }
167
SR_RecognizerHasSetupRules(SR_Recognizer * self,ESR_BOOL * hasSetupRules)168 ESR_ReturnCode SR_RecognizerHasSetupRules(SR_Recognizer* self,
169 ESR_BOOL* hasSetupRules)
170 {
171 if (self == NULL)
172 {
173 PLogError(L("ESR_INVALID_ARGUMENT"));
174 return ESR_INVALID_ARGUMENT;
175 }
176 return self->hasSetupRules(self, hasSetupRules);
177 }
178
SR_RecognizerActivateRule(SR_Recognizer * self,SR_Grammar * grammar,const LCHAR * ruleName,unsigned int weight)179 ESR_ReturnCode SR_RecognizerActivateRule(SR_Recognizer* self, SR_Grammar* grammar,
180 const LCHAR* ruleName, unsigned int weight)
181 {
182 if (self == NULL)
183 {
184 PLogError(L("ESR_INVALID_ARGUMENT"));
185 return ESR_INVALID_ARGUMENT;
186 }
187 return self->activateRule(self, grammar, ruleName, weight);
188 }
189
SR_RecognizerDeactivateRule(SR_Recognizer * self,SR_Grammar * grammar,const LCHAR * ruleName)190 ESR_ReturnCode SR_RecognizerDeactivateRule(SR_Recognizer* self, SR_Grammar* grammar,
191 const LCHAR* ruleName)
192 {
193 if (self == NULL)
194 {
195 PLogError(L("ESR_INVALID_ARGUMENT"));
196 return ESR_INVALID_ARGUMENT;
197 }
198 return self->deactivateRule(self, grammar, ruleName);
199 }
200
SR_RecognizerDeactivateAllRules(SR_Recognizer * self)201 ESR_ReturnCode SR_RecognizerDeactivateAllRules(SR_Recognizer* self)
202 {
203 if (self == NULL)
204 {
205 PLogError(L("ESR_INVALID_ARGUMENT"));
206 return ESR_INVALID_ARGUMENT;
207 }
208 return self->deactivateAllRules(self);
209 }
210
SR_RecognizerIsActiveRule(SR_Recognizer * self,SR_Grammar * grammar,const LCHAR * ruleName,ESR_BOOL * isActiveRule)211 ESR_ReturnCode SR_RecognizerIsActiveRule(SR_Recognizer* self, SR_Grammar* grammar,
212 const LCHAR* ruleName, ESR_BOOL* isActiveRule)
213 {
214 if (self == NULL)
215 {
216 PLogError(L("ESR_INVALID_ARGUMENT"));
217 return ESR_INVALID_ARGUMENT;
218 }
219 return self->isActiveRule(self, grammar, ruleName, isActiveRule);
220 }
221
SR_RecognizerCheckGrammarConsistency(SR_Recognizer * self,SR_Grammar * grammar,ESR_BOOL * isConsistent)222 ESR_ReturnCode SR_RecognizerCheckGrammarConsistency(SR_Recognizer* self, SR_Grammar* grammar,
223 ESR_BOOL* isConsistent)
224 {
225 if (self == NULL)
226 {
227 PLogError(L("ESR_INVALID_ARGUMENT"));
228 return ESR_INVALID_ARGUMENT;
229 }
230 return self->checkGrammarConsistency(self, grammar, isConsistent);
231 }
232
SR_RecognizerGetModels(SR_Recognizer * self,SR_AcousticModels ** pmodels)233 ESR_ReturnCode SR_RecognizerGetModels(SR_Recognizer* self, SR_AcousticModels** pmodels)
234 {
235 if (self == NULL)
236 {
237 PLogError(L("ESR_INVALID_ARGUMENT"));
238 return ESR_INVALID_ARGUMENT;
239 }
240 return self->getModels(self, pmodels);
241 }
242
SR_RecognizerPutAudio(SR_Recognizer * self,asr_int16_t * buffer,size_t * bufferSize,ESR_BOOL isLast)243 ESR_ReturnCode SR_RecognizerPutAudio(SR_Recognizer* self, asr_int16_t* buffer, size_t* bufferSize,
244 ESR_BOOL isLast)
245 {
246 #ifdef SREC_ENGINE_TRACK_RECOGNITION
247 static int counter = 0;
248 #endif
249
250 if (self == NULL)
251 {
252 PLogError(L("ESR_INVALID_ARGUMENT"));
253 return ESR_INVALID_ARGUMENT;
254 }
255 #ifdef SREC_ENGINE_TRACK_RECOGNITION
256 if ( ( counter % COUNT_INTERVAL ) == 0 )
257 PLogMessage ( "Entering Recognizer Put Audio %d Times\n", counter );
258 counter++;
259 #endif
260 return self->putAudio(self, buffer, bufferSize, isLast);
261 }
262
SR_RecognizerAdvance(SR_Recognizer * self,SR_RecognizerStatus * status,SR_RecognizerResultType * type,SR_RecognizerResult ** result)263 ESR_ReturnCode SR_RecognizerAdvance(SR_Recognizer* self, SR_RecognizerStatus* status,
264 SR_RecognizerResultType* type,
265 SR_RecognizerResult** result)
266 {
267 #ifdef SREC_ENGINE_TRACK_RECOGNITION
268 static int counter = 0;
269 #endif
270
271 if (self == NULL)
272 {
273 PLogError(L("ESR_INVALID_ARGUMENT"));
274 return ESR_INVALID_ARGUMENT;
275 }
276 #ifdef SREC_ENGINE_TRACK_RECOGNITION
277 if ( ( counter % COUNT_INTERVAL ) == 0 )
278 PLogMessage ( "Entering Recognizer Advance %d Times\n", counter );
279 counter++;
280 #endif
281 return self->advance(self, status, type, result);
282 }
283
SR_RecognizerLoadUtterance(SR_Recognizer * self,const LCHAR * filename)284 ESR_ReturnCode SR_RecognizerLoadUtterance(SR_Recognizer* self, const LCHAR* filename)
285 {
286 if (self == NULL)
287 {
288 PLogError(L("ESR_INVALID_ARGUMENT"));
289 return ESR_INVALID_ARGUMENT;
290 }
291 return self->loadUtterance(self, filename);
292 }
293
SR_RecognizerLoadWaveFile(SR_Recognizer * self,const LCHAR * filename)294 ESR_ReturnCode SR_RecognizerLoadWaveFile(SR_Recognizer* self, const LCHAR* filename)
295 {
296 if (self == NULL)
297 {
298 PLogError(L("ESR_INVALID_ARGUMENT"));
299 return ESR_INVALID_ARGUMENT;
300 }
301 return self->loadWaveFile(self, filename);
302 }
303
SR_RecognizerLogEvent(SR_Recognizer * self,const LCHAR * event)304 ESR_ReturnCode SR_RecognizerLogEvent(SR_Recognizer* self, const LCHAR* event)
305 {
306 if (self == NULL)
307 {
308 PLogError(L("ESR_INVALID_ARGUMENT"));
309 return ESR_INVALID_ARGUMENT;
310 }
311 return self->logEvent(self, event);
312 }
313
SR_RecognizerLogToken(SR_Recognizer * self,const LCHAR * token,const LCHAR * value)314 ESR_ReturnCode SR_RecognizerLogToken(SR_Recognizer* self, const LCHAR* token, const LCHAR* value)
315 {
316 if (self == NULL)
317 {
318 PLogError(L("ESR_INVALID_ARGUMENT"));
319 return ESR_INVALID_ARGUMENT;
320 }
321 return self->logToken(self, token, value);
322 }
323
SR_RecognizerLogTokenInt(SR_Recognizer * self,const LCHAR * token,int value)324 ESR_ReturnCode SR_RecognizerLogTokenInt(SR_Recognizer* self, const LCHAR* token, int value)
325 {
326 if (self == NULL)
327 {
328 PLogError(L("ESR_INVALID_ARGUMENT"));
329 return ESR_INVALID_ARGUMENT;
330 }
331 return self->logTokenInt(self, token, value);
332 }
333
334
SR_RecognizerLogSessionStart(SR_Recognizer * self,const LCHAR * sessionName)335 ESR_ReturnCode SR_RecognizerLogSessionStart(SR_Recognizer* self, const LCHAR* sessionName)
336 {
337 if (self == NULL)
338 {
339 PLogError(L("ESR_INVALID_ARGUMENT"));
340 return ESR_INVALID_ARGUMENT;
341 }
342 return self->logSessionStart(self, sessionName);
343 }
344
345
SR_RecognizerLogSessionEnd(SR_Recognizer * self)346 ESR_ReturnCode SR_RecognizerLogSessionEnd(SR_Recognizer* self)
347 {
348 if (self == NULL)
349 {
350 PLogError(L("ESR_INVALID_ARGUMENT"));
351 return ESR_INVALID_ARGUMENT;
352 }
353 return self->logSessionEnd(self);
354 }
355
356
SR_RecognizerLogWaveformData(SR_Recognizer * self,const LCHAR * waveformFilename,const LCHAR * transcription,const double bos,const double eos,ESR_BOOL isInvocab)357 ESR_ReturnCode SR_RecognizerLogWaveformData(SR_Recognizer* self,
358 const LCHAR* waveformFilename,
359 const LCHAR* transcription,
360 const double bos,
361 const double eos,
362 ESR_BOOL isInvocab)
363 {
364 if (self == NULL)
365 {
366 PLogError(L("ESR_INVALID_ARGUMENT"));
367 return ESR_INVALID_ARGUMENT;
368 }
369 return self->logWaveformData(self, waveformFilename, transcription, bos, eos, isInvocab);
370 }
371
372
SR_RecognizerSetLockFunction(SR_Recognizer * self,SR_RecognizerLockFunction function,void * data)373 ESR_ReturnCode SR_RecognizerSetLockFunction(SR_Recognizer* self, SR_RecognizerLockFunction function, void* data)
374 {
375 if (self == NULL)
376 {
377 PLogError(L("ESR_INVALID_ARGUMENT"));
378 return ESR_INVALID_ARGUMENT;
379 }
380 return self->setLockFunction(self, function, data);
381 }
382
SR_RecognizerIsSignalClipping(SR_Recognizer * self,ESR_BOOL * isClipping)383 ESR_ReturnCode SR_RecognizerIsSignalClipping(SR_Recognizer* self, ESR_BOOL* isClipping)
384 {
385 if (self == NULL)
386 {
387 PLogError(L("ESR_INVALID_ARGUMENT"));
388 return ESR_INVALID_ARGUMENT;
389 }
390 return self->isSignalClipping(self, isClipping);
391 }
392
SR_RecognizerIsSignalDCOffset(SR_Recognizer * self,ESR_BOOL * isDCOffset)393 ESR_ReturnCode SR_RecognizerIsSignalDCOffset(SR_Recognizer* self, ESR_BOOL* isDCOffset)
394 {
395 if (self == NULL)
396 {
397 PLogError(L("ESR_INVALID_ARGUMENT"));
398 return ESR_INVALID_ARGUMENT;
399 }
400 return self->isSignalDCOffset(self, isDCOffset);
401 }
402
SR_RecognizerIsSignalNoisy(SR_Recognizer * self,ESR_BOOL * isNoisy)403 ESR_ReturnCode SR_RecognizerIsSignalNoisy(SR_Recognizer* self, ESR_BOOL* isNoisy)
404 {
405 if (self == NULL)
406 {
407 PLogError(L("ESR_INVALID_ARGUMENT"));
408 return ESR_INVALID_ARGUMENT;
409 }
410 return self->isSignalNoisy(self, isNoisy);
411 }
412
SR_RecognizerIsSignalTooQuiet(SR_Recognizer * self,ESR_BOOL * isTooQuiet)413 ESR_ReturnCode SR_RecognizerIsSignalTooQuiet(SR_Recognizer* self, ESR_BOOL* isTooQuiet)
414 {
415 if (self == NULL)
416 {
417 PLogError(L("ESR_INVALID_ARGUMENT"));
418 return ESR_INVALID_ARGUMENT;
419 }
420 return self->isSignalTooQuiet(self, isTooQuiet);
421 }
422
SR_RecognizerIsSignalTooFewSamples(SR_Recognizer * self,ESR_BOOL * isTooFewSamples)423 ESR_ReturnCode SR_RecognizerIsSignalTooFewSamples(SR_Recognizer* self, ESR_BOOL* isTooFewSamples)
424 {
425 if (self == NULL)
426 {
427 PLogError(L("ESR_INVALID_ARGUMENT"));
428 return ESR_INVALID_ARGUMENT;
429 }
430 return self->isSignalTooFewSamples(self, isTooFewSamples);
431 }
432
SR_RecognizerIsSignalTooManySamples(SR_Recognizer * self,ESR_BOOL * isTooManySamples)433 ESR_ReturnCode SR_RecognizerIsSignalTooManySamples(SR_Recognizer* self, ESR_BOOL* isTooManySamples)
434 {
435 if (self == NULL)
436 {
437 PLogError(L("ESR_INVALID_ARGUMENT"));
438 return ESR_INVALID_ARGUMENT;
439 }
440 return self->isSignalTooManySamples(self, isTooManySamples);
441 }
442
443
444
SR_Recognizer_Change_Sample_Rate(SR_Recognizer * recognizer,size_t new_sample_rate)445 ESR_ReturnCode SR_Recognizer_Change_Sample_Rate ( SR_Recognizer *recognizer, size_t new_sample_rate )
446 {
447 ESR_ReturnCode change_status;
448
449 if ( recognizer != NULL )
450 {
451 change_status = SR_Recognizer_Change_Sample_RateImpl ( recognizer, new_sample_rate );
452 }
453 else
454 {
455 change_status = ESR_INVALID_ARGUMENT;
456 PLogError ( L("ESR_INVALID_ARGUMENT") );
457 }
458 return ( change_status );
459 }
460
461
462