Home | History | Annotate | Download | only in src
      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 
     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 
     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 
     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 
     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 
     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 
     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 
     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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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