1/*---------------------------------------------------------------------------* 2 * SRecTestAudio.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 21#ifdef _WIN32 22 #include <windows.h> 23 #include <mmsystem.h> 24 #include "signal.h" 25 #include "direct.h" 26#endif 27 28#include "passert.h" 29#include "ESR_CommandLine.h" 30#include "ESR_Session.h" 31#include "LCHAR.h" 32#include "PFile.h" 33#include "PFileSystem.h" 34#include "PANSIFileSystem.h" 35//#include "PMemoryFileSystem.h" 36#include "plog.h" 37#include "pmemory.h" 38#include "ptypes.h" 39#include "string.h" 40#include "stdio.h" 41#include "stdlib.h" 42#if defined(APP_ENABLE_TIMER) 43#include "ptimer.h" 44#endif 45#include "SR_Grammar.h" 46#include "SR_Recognizer.h" 47#include "SR_RecognizerResult.h" 48#include "SR_Session.h" 49#include "SR_Vocabulary.h" 50#include "SR_AcousticState.h" 51#include "SR_Nametag.h" 52#include "PStackSize.h" 53 54#ifdef ACCURACY_TESTING 55#include "SR_GrammarImpl.h" 56#include "SR_SemanticProcessorImpl.h" 57#endif 58 59#include "audioin.h" 60#include "srec_test_config.h" 61 62//Define this in makefile 63//#define _DEBUGHEAP 64 65 66#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 67#include <crtdbg.h> 68#endif 69 70 71#define SREC_TEST_DEFAULT_AUDIO_FREQUENCY 11025 72#define LOG_BUFFER_SIZE 512 73#define MAX_AUDIO_BUFFER_SIZE 2048 74#define DEFAULT_AUDIO_BUFFER_SIZE 256 75#define MAX_LINE_LENGTH 255 76#define TRANSCRIPTION_SIZE 512 77#define MAX_SCORE_LENGTH 5 78#define MAX_NUM_REC_CONTEXTS 4 79 80 81#ifdef PFILE_VIRTUAL_SUPPORT 82 extern const FileRecord pFileRecTable[]; 83 extern const unsigned char pFileStart0[]; 84#endif /* #ifdef PFILE_VIRTUAL_SUPPORT */ 85 86typedef enum 87 { 88 SENTENCE_BEGIN, 89 SENTENCE_BEGIN_BRACKET_BEGIN, 90 SENTENCE_BEGIN_BRACKET_END, 91 SENTENCE_MIDDLE, 92 SENTENCE_MIDDLE_BRACKET_BEGIN, 93 SENTENCE_MIDDLE_BRACKET_END, 94 SENTENCE_MIDDLE_WITH_SPACE 95 } SENTENCE_CLEANING_STATES; 96 97 98 99typedef enum 100 { 101 ForcedRecModeNotSet = -1, 102 ForcedRecModeOff=0, 103 ForcedRecModeOneTime, 104 ForcedRecModeOn 105 } ForcedRecMode; 106 107 108typedef enum 109 { 110 ERROR_LEVEL_CRITICAL = 0, 111 ERROR_LEVEL_HIGH, 112 ERROR_LEVEL_MODERATE, 113 ERROR_LEVEL_LOW 114 } SREC_TEST_ERROR_LEVELS; 115 116 117typedef struct 118 { 119 LCHAR grammar_path [P_PATH_MAX]; /* File path of the grammar. */ 120 LCHAR grammarID [P_PATH_MAX]; /* ID of the grammar. */ 121 LCHAR ruleName [P_PATH_MAX]; /* rule name of the grammar. */ 122 SR_Grammar* grammar; /* grammar. */ 123 ESR_BOOL is_ve_grammar; /* Is voice-enrollment grammar or not */ 124 } APPL_GRAMMAR_DATA; 125 126 127typedef struct ApplicationData_t 128 { 129 int argc; /* The number of command-line arguments. */ 130 LCHAR **argv; /* The command-line argument values. */ 131 PFile *outputLog; /* Output log. */ 132 ESR_Locale locale; /* Current application locale. */ 133 SR_Recognizer *recognizer; /* The current recognizer. */ 134 SR_RecognizerResult *result; /* The last recognition result. */ 135 SR_Vocabulary *vocabulary; /* The current vocabulary. */ 136 SR_Nametag *nametag; /* The nametag generated by the last recognition. */ 137 SR_Nametags *nametags; /* The active nametag collection. */ 138 APPL_GRAMMAR_DATA grammars [MAX_NUM_REC_CONTEXTS]; /* Grammar data */ 139 int grammarCount; /* The number of grammars. */ 140 int active_grammar_num; /* The index number of the active grammar. */ 141 const asr_int16_t *raw_waveform; /*Points to raw waveform returned from voice enrollment */ 142 size_t raw_waveform_size; /* Size of above wave_form */ 143 asr_int16_t audio_buffer [MAX_AUDIO_BUFFER_SIZE]; 144 unsigned int audio_buffer_requested_size; 145 unsigned int num_samples_read; 146 LCHAR raw_waveform_filename [P_PATH_MAX]; /* Name of file of saved waveform data. */ 147 PFile *raw_waveform_file; /* Pointer to file of saved waveform data. */ 148 LCHAR transcription [MAX_LINE_LENGTH]; 149 ForcedRecMode forced_rec_mode; 150 } ApplicationData; 151 152 153 154static int srec_test_get_run_params ( unsigned int *num_shutdown_loops, unsigned int *num_continuous_run_loops ); 155static int srec_test_init_application_data ( ApplicationData *applicationData, int arg_count, LCHAR *arg_vals [] ); 156static int srec_test_init_file_system ( int arg_count, LCHAR *arg_vals [] ); 157static int srec_test_init_logging_system ( int arg_count, LCHAR *arg_vals [], PLogger *logger ); 158static int srec_test_init_memory_system ( unsigned int srec_test_heap_size ); 159static int srec_test_init_system ( unsigned int srec_test_heap_size, PLogger* logger, int arg_count, 160 LCHAR *arg_vals [], AUDIOIN_H *audio_input_handle ); 161static int srec_test_run_test_execute ( ApplicationData *applicationData, AUDIOIN_H audio_input_handle ); 162static int srec_test_run_test_init ( ApplicationData *applicationData ); 163static int srec_test_run_test ( ApplicationData *applicationData, AUDIOIN_H audio_input_handle ); 164static int srec_test_shutdown_file_system ( void ); 165static int srec_test_shutdown_logging_system ( PLogger *logger ); 166static int srec_test_shutdown_memory_system ( void ); 167static int srec_test_recognize_live ( SR_Grammar *active_grammar, ApplicationData *data, AUDIOIN_H audio_input_handle, 168 FILE *results_file, size_t *recognition_count ); 169static void srec_test_log_recognition_failure ( ApplicationData *data ); 170 171 172 173static ESR_BOOL interrupted = ESR_FALSE; 174 175/* static ESR_BOOL no_enroll = ESR_FALSE; //BJP */ 176 177int signal_handler_SIGINT(int v) 178{ 179 interrupted = ESR_TRUE; 180 return 0; 181} 182 183 184 185ESR_ReturnCode myDSMCallback(LCHAR* functionName, LCHAR** argv, size_t argc, void* value, LCHAR* result, size_t* resultSize) 186{ 187 LCHAR* meaning; 188 189 PLOG_DBG_TRACE((L("myDSMCallback(%s) invoked\n"), functionName)); 190 if ((LSTRCMP(functionName, "myDSMCallback")!=0) || (argc > 1)) 191 { 192 /* Unsupported semantic function */ 193 return ESR_INVALID_STATE; 194 } 195 if (argc > 0) 196 meaning = argv[0]; 197 else 198 meaning = L(""); 199 lstrtrim(meaning); 200 LSTRLWR(meaning); 201 202 if (LISDIGIT(*meaning)) 203 { 204 /* Penalize meaning starting with "<digit>" */ 205 if (*resultSize < LSTRLEN(L("1000"))+1) 206 { 207 *resultSize = LSTRLEN(L("1000"))+1; 208 return ESR_BUFFER_OVERFLOW; 209 } 210 LSTRCPY(result, "1000"); 211 *resultSize = LSTRLEN(L("1000"))+1; 212 return ESR_SUCCESS; 213 } 214 if (*resultSize < LSTRLEN(L("0"))+1) 215 { 216 *resultSize = LSTRLEN(L("0"))+1; 217 return ESR_BUFFER_OVERFLOW; 218 } 219 LSTRCPY(result, "0"); 220 *resultSize = LSTRLEN(L("0"))+1; 221 return ESR_SUCCESS; 222} 223 224 225 226void srec_test_log_error ( unsigned int error_id, SREC_TEST_ERROR_LEVELS error_level, LCHAR *error_text ) 227 { 228 229 switch ( error_level ) 230 { 231 case ERROR_LEVEL_CRITICAL: 232 LPRINTF ( "Critical Level Error %s\n", error_text ); 233 break; 234 235 case ERROR_LEVEL_HIGH: 236 LPRINTF ( "High Level Error %s\n", error_text ); 237 break; 238 239 case ERROR_LEVEL_MODERATE: 240 LPRINTF ( "Moderate Level Error %s\n", error_text ); 241 break; 242 243 case ERROR_LEVEL_LOW: 244 LPRINTF ( "Low Level Error %s\n", error_text ); 245 break; 246 247 default: 248 LPRINTF ( "Unknown Level Error %d : %s\n", error_level, error_text ); 249 break; 250 } 251 } 252 253 254 255void srec_test_delete_grammar ( ApplicationData *data, int grammar_num ) 256 { 257 LCHAR log_buffer[LOG_BUFFER_SIZE]; 258 259 if ( grammar_num < data->grammarCount ) 260 { 261 if ( ( data->grammarCount - grammar_num ) > 1 ) 262 { 263 memmove ( &data->grammars [grammar_num], &data->grammars [data->grammarCount - 1], 264 ( data->grammarCount - grammar_num - 1 ) * sizeof ( APPL_GRAMMAR_DATA ) ); 265 if ( grammar_num > data->active_grammar_num ) 266 data->active_grammar_num--; 267 } 268 data->grammarCount--; 269 } 270 else 271 { 272 LSPRINTF ( log_buffer, L("Internal Error Grammar TableCorrupt : Grammar %d Does Not Exist"), grammar_num ); 273 srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, log_buffer ); 274 } 275 } 276 277 278 279static void srec_test_get_active_grammar ( ApplicationData *data, SR_Grammar **active_grammar ) 280 { 281 282 if ( data->active_grammar_num >= 0 ) 283 *active_grammar = data->grammars [data->active_grammar_num].grammar; 284 else 285 *active_grammar = NULL; 286 } 287 288 289 290static void srec_test_get_active_grammar_data ( ApplicationData *data, APPL_GRAMMAR_DATA **active_grammar_data ) 291 { 292 293 if ( data->active_grammar_num >= 0 ) 294 *active_grammar_data = &data->grammars [data->active_grammar_num]; 295 else 296 *active_grammar_data = NULL; 297 } 298 299 300 301static ESR_BOOL srec_test_get_grammar_from_id ( ApplicationData *data, char *grammar_id, 302 int *grammar_index, ESR_BOOL *is_active, ESR_BOOL *is_ve_grammar ) 303 { 304 ESR_BOOL found_grammar; 305 int grammar_counter; 306 307 found_grammar = ESR_FALSE; 308 grammar_counter = 0; 309 310 while ( ( found_grammar == ESR_FALSE ) && ( grammar_counter < data->grammarCount ) ) 311 { 312 if ( strcmp ( grammar_id, data->grammars [grammar_counter].grammarID ) == 0 ) 313 { 314 *grammar_index = grammar_counter; 315 *is_ve_grammar = data->grammars [grammar_counter].is_ve_grammar; 316 317 if ( grammar_counter == data->active_grammar_num ) 318 *is_active = ESR_TRUE; 319 else 320 *is_active = ESR_FALSE; 321 found_grammar = ESR_TRUE; 322 } 323 else 324 { 325 grammar_counter++; 326 } 327 } 328 return ( found_grammar ); 329 } 330 331 332 333static int srec_test_get_empty_grammar_index ( ApplicationData *data, unsigned int *grammar_index ) 334 { 335 int get_status; 336 337 if ( data->grammarCount < MAX_NUM_REC_CONTEXTS ) 338 { 339 get_status = 0; 340 *grammar_index = data->grammarCount; 341 } 342 else 343 { 344 get_status = -1; 345 } 346 return ( get_status ); 347 } 348 349 350 351ESR_ReturnCode ShutdownSession ( void ) 352 { 353 ESR_ReturnCode shutdown_status; 354 355 shutdown_status = SR_SessionDestroy ( ); 356 357 return ( shutdown_status ); 358 } 359 360 361 362ESR_ReturnCode InitSession ( int argc, char** argv ) 363 { 364 ESR_ReturnCode init_status; 365 LCHAR path[P_PATH_MAX]; 366 size_t len; 367 368 len = P_PATH_MAX; 369 init_status = ESR_CommandLineGetValue ( argc, (const char **)argv, L("parfile"), path, &len ); 370 371 if ( init_status == ESR_SUCCESS ) 372 { 373 init_status = SR_SessionCreate ( path ); 374 375 if ( init_status == ESR_SUCCESS ) 376 { 377 /* Command-line options always override PAR file options */ 378 init_status = ESR_SessionImportCommandLine ( argc, argv ); 379 380 if ( init_status != ESR_SUCCESS ) 381 { 382 SR_SessionDestroy ( ); 383 /* Log Here */ 384 } 385 } 386 else 387 { 388 /* Log Here */ 389 } 390 } 391 else 392 { 393 srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, L("Parfile Nmae Not Specified on Command Line") ); 394 } 395 return ( init_status ); 396 } 397 398 399 400ESR_ReturnCode ShutdownGrammarUnload ( ApplicationData *data, unsigned int grammar_num ) 401 { 402 ESR_ReturnCode shutdown_status; 403 404 shutdown_status = SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 405 406 return ( shutdown_status ); 407 } 408 409 410 411ESR_ReturnCode SetupGrammarLoad ( ApplicationData *data, unsigned int grammar_num ) 412 { 413 ESR_ReturnCode setup_status; 414 415 setup_status = SR_GrammarLoad (data->grammars [grammar_num].grammar_path, &data->grammars [grammar_num].grammar ); 416 417 if ( setup_status == ESR_SUCCESS ) 418 { 419 setup_status = SR_GrammarSetupVocabulary ( data->grammars [grammar_num].grammar, data->vocabulary ); 420 421 if ( setup_status == ESR_SUCCESS ) 422 { 423 // setup_status = SR_GrammarSetupModels ( data->grammars [grammar_num].grammar, data->models ); 424 setup_status = SR_GrammarSetupRecognizer( data->grammars [grammar_num].grammar, data->recognizer ); 425 426 if ( setup_status == ESR_SUCCESS ) 427 { 428 setup_status = SR_GrammarSetDispatchFunction ( data->grammars [grammar_num].grammar, L("myDSMCallback"), NULL, myDSMCallback ); 429 430 if ( setup_status != ESR_SUCCESS ) 431 SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 432 } 433 else 434 { 435 SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 436 } 437 } 438 else 439 { 440 SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 441 } 442 } 443 return ( setup_status ); 444 } 445 446 447 448ESR_ReturnCode SetupGrammarActivate ( ApplicationData *data, unsigned int grammar_num ) 449 { 450 ESR_ReturnCode setup_status; 451 452 setup_status = SR_RecognizerActivateRule ( data->recognizer, data->grammars [grammar_num].grammar, data->grammars [grammar_num].ruleName, 1 ); 453 return ( setup_status ); 454 } 455 456 457 458#ifdef ACCURACY_TESTING 459ESR_ReturnCode srec_test_parse (SR_Grammar *grammar, const LCHAR* trans, LCHAR* meaning, size_t *len); 460#endif 461 462/** 463 * Parses source string and copies the first whitespace-delimited token into destination. 464 * 465 * @param source Source string to parse 466 * @param target Target string to copy into 467 * @param charsRead [in] Size of target buffer. 468 * [out] Number of characters read up to end of token. 469 * If the return code is ESR_BUFFER_OVERFLOW, the required length is 470 * returned in this variable. 471 */ 472int getFirstToken(LCHAR* source, LCHAR* target, size_t* charsRead) 473{ 474 LCHAR* beginning = source; 475 LCHAR* ending; 476 477 /* Skip whitespace */ 478 for (; *beginning!=L('\0') && LISSPACE(*beginning); ++beginning); 479 if (*beginning==L('\0')) 480 return ( -1 ); /* invalid command syntax */ 481 /* Find next whitespace */ 482 for (ending=beginning; *ending!=L('\0') && !LISSPACE(*ending); ++ending); 483 if ((size_t) (ending-beginning) > *charsRead) 484 { 485 *charsRead = ending-beginning; 486 return ( -1 ); 487 } 488 *charsRead = ending-source; 489 LSTRNCPY(target, beginning, ending-beginning); 490 target[ending-beginning] = L('\0'); 491 return ( 0 ); 492} 493 494 495 496int srec_test_get_five_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command, 497 size_t second_max_command_size, LCHAR *second_command, 498 size_t third_max_command_size, LCHAR *third_command, 499 size_t fourth_max_command_size, LCHAR *fourth_command, 500 size_t fifth_max_command_size, LCHAR *fifth_command, 501 size_t *actual_commands, LCHAR **command_end ) 502 { 503 int get_status; 504 505 get_status = getFirstToken ( command_start, first_command, &first_max_command_size ); 506 507 if ( get_status == ESR_SUCCESS ) 508 { 509 get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size ); 510 511 if ( get_status == ESR_SUCCESS ) 512 { 513 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size, 514 third_command, &third_max_command_size ); 515 if ( get_status == ESR_SUCCESS ) 516 { 517 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size, 518 fourth_command, &fourth_max_command_size ); 519 if ( get_status == ESR_SUCCESS ) 520 { 521 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size, 522 fifth_command, &fifth_max_command_size ); 523 if ( get_status == ESR_SUCCESS ) 524 { 525 if ( command_end != NULL ) 526 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size + fifth_max_command_size; 527 if ( actual_commands != NULL ) 528 *actual_commands = 5; 529 } 530 else 531 { 532 if ( command_end != NULL ) 533 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size; 534 if ( actual_commands != NULL ) 535 *actual_commands = 4; 536 } 537 } 538 else 539 { 540 if ( command_end != NULL ) 541 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size; 542 if ( actual_commands != NULL ) 543 *actual_commands = 3; 544 } 545 } 546 else 547 { 548 if ( command_end != NULL ) 549 *command_end = command_start + first_max_command_size + second_max_command_size; 550 if ( actual_commands != NULL ) 551 *actual_commands = 2; 552 } 553 } 554 else 555 { 556 if ( command_end != NULL ) 557 *command_end = command_start + first_max_command_size; 558 if ( actual_commands != NULL ) 559 *actual_commands = 1; 560 } 561 } 562 else 563 { 564 if ( command_end != NULL ) 565 *command_end = command_start; 566 if ( actual_commands != NULL ) 567 *actual_commands = 0; 568 } 569 return ( get_status ); 570 } 571 572 573 574int srec_test_get_four_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command, 575 size_t second_max_command_size, LCHAR *second_command, 576 size_t third_max_command_size, LCHAR *third_command, 577 size_t fourth_max_command_size, LCHAR *fourth_command, 578 size_t *actual_commands, LCHAR **command_end ) 579 { 580 int get_status; 581 582 get_status = getFirstToken ( command_start, first_command, &first_max_command_size ); 583 584 if ( get_status == ESR_SUCCESS ) 585 { 586 get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size ); 587 588 if ( get_status == ESR_SUCCESS ) 589 { 590 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size, 591 third_command, &third_max_command_size ); 592 if ( get_status == ESR_SUCCESS ) 593 { 594 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size, 595 fourth_command, &fourth_max_command_size ); 596 if ( get_status == ESR_SUCCESS ) 597 { 598 if ( command_end != NULL ) 599 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size; 600 if ( actual_commands != NULL ) 601 *actual_commands = 4; 602 } 603 else 604 { 605 if ( command_end != NULL ) 606 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size; 607 if ( actual_commands != NULL ) 608 *actual_commands = 3; 609 } 610 } 611 else 612 { 613 if ( command_end != NULL ) 614 *command_end = command_start + first_max_command_size + second_max_command_size; 615 if ( actual_commands != NULL ) 616 *actual_commands = 2; 617 } 618 } 619 else 620 { 621 if ( command_end != NULL ) 622 *command_end = command_start + first_max_command_size; 623 if ( actual_commands != NULL ) 624 *actual_commands = 1; 625 } 626 } 627 else 628 { 629 if ( command_end != NULL ) 630 *command_end = command_start; 631 if ( actual_commands != NULL ) 632 *actual_commands = 0; 633 } 634 return ( get_status ); 635 } 636 637 638 639int srec_test_get_three_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command, 640 size_t second_max_command_size, LCHAR *second_command, 641 size_t third_max_command_size, LCHAR *third_command, 642 size_t *actual_commands, LCHAR **command_end ) 643 { 644 int get_status; 645 646 get_status = getFirstToken ( command_start, first_command, &first_max_command_size ); 647 648 if ( get_status == ESR_SUCCESS ) 649 { 650 get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size ); 651 652 if ( get_status == ESR_SUCCESS ) 653 { 654 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size, 655 third_command, &third_max_command_size ); 656 if ( get_status == ESR_SUCCESS ) 657 { 658 if ( command_end != NULL ) 659 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size; 660 if ( actual_commands != NULL ) 661 *actual_commands = 3; 662 } 663 else 664 { 665 if ( command_end != NULL ) 666 *command_end = command_start + first_max_command_size + second_max_command_size; 667 if ( actual_commands != NULL ) 668 *actual_commands = 2; 669 } 670 } 671 else 672 { 673 if ( command_end != NULL ) 674 *command_end = command_start + first_max_command_size; 675 if ( actual_commands != NULL ) 676 *actual_commands = 1; 677 } 678 } 679 else 680 { 681 if ( command_end != NULL ) 682 *command_end = command_start; 683 if ( actual_commands != NULL ) 684 *actual_commands = 0; 685 } 686 return ( get_status ); 687 } 688 689 690 691int srec_test_get_two_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command, 692 size_t second_max_command_size, LCHAR *second_command, 693 size_t *actual_commands, LCHAR **command_end ) 694 { 695 int get_status; 696 697 get_status = getFirstToken ( command_start, first_command, &first_max_command_size ); 698 699 if ( get_status == ESR_SUCCESS ) 700 { 701 get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size ); 702 703 if ( get_status == ESR_SUCCESS ) 704 { 705 if ( command_end != NULL ) 706 *command_end = command_start + first_max_command_size + second_max_command_size; 707 if ( actual_commands != NULL ) 708 *actual_commands = 2; 709 } 710 else 711 { 712 if ( command_end != NULL ) 713 *command_end = command_start + first_max_command_size; 714 if ( actual_commands != NULL ) 715 *actual_commands = 1; 716 } 717 } 718 else 719 { 720 if ( command_end != NULL ) 721 *command_end = command_start; 722 if ( actual_commands != NULL ) 723 *actual_commands = 0; 724 } 725 return ( get_status ); 726 } 727 728 729 730int srec_test_get_one_command_item ( LCHAR *command_start, size_t max_command_size, LCHAR *command, LCHAR **command_end ) 731 { 732 int get_status; 733 734 get_status = getFirstToken ( command_start, command, &max_command_size ); 735 736 if ( get_status == ESR_SUCCESS ) 737 { 738 if ( command_end != NULL ) 739 *command_end = command_start + max_command_size; 740 } 741 return ( get_status ); 742 } 743 744 745 746/** 747 * Execute TCP-file commands. 748 * 749 * @param text String containing command 750 * @param recognizer The recognizer 751 */ 752//static int words_added = 0; 753 754#if defined(APP_ENABLE_TIMER) 755static PTimer *addWordTimer = NULL; 756static PTimer *compileTimer = NULL; 757#endif 758 759 760 761int srec_test_reset_slots ( SR_Grammar *active_grammar ) 762 { 763 int reset_status; 764 ESR_ReturnCode esr_status; 765 766 if ( active_grammar != NULL ) 767 { 768 reset_status = 0; 769 esr_status = SR_GrammarResetAllSlots ( active_grammar ); 770 771 if ( esr_status != ESR_SUCCESS ) 772 { 773 reset_status = -1; 774 /* Log Here */ 775 } 776 } 777 else 778 { 779 reset_status = -1; 780 /* Log Here */ 781 } 782 return ( reset_status ); 783 } 784 785 786 787int srec_test_add_word ( SR_Grammar *active_grammar, LCHAR *command_text ) 788 { 789 int add_status; 790 ESR_ReturnCode esr_status; 791 LCHAR slot [MAX_LINE_LENGTH]; 792 LCHAR word [MAX_LINE_LENGTH]; 793 LCHAR pron [MAX_LINE_LENGTH]; 794 LCHAR weight [MAX_UINT_DIGITS+1]; 795 LCHAR semanticTag [MAX_LINE_LENGTH]; 796 int weightNumber; 797 int convert_string_to_num; 798 799 if ( active_grammar != NULL ) 800 { 801 add_status = srec_test_get_five_command_items ( command_text, MAX_LINE_LENGTH, slot, 802 MAX_LINE_LENGTH, word, MAX_LINE_LENGTH, pron, 803 MAX_UINT_DIGITS + 1, weight, MAX_LINE_LENGTH, 804 semanticTag, NULL, NULL ); 805 if ( add_status == 0 ) 806 { 807 convert_string_to_num = lstrtoi (weight, &weightNumber, 10 ); 808 809 if ( convert_string_to_num == 0 ) 810 { 811#if defined(APP_ENABLE_TIMER) 812 PTimerStart ( addWordTimer ); 813#endif 814 esr_status = SR_GrammarAddWordToSlot ( active_grammar, slot, word, pron, weightNumber, semanticTag ); 815#if defined(APP_ENABLE_TIMER) 816 PTimerStop(addWordTimer); 817#endif 818 if ( esr_status != ESR_SUCCESS ) 819 { 820 add_status = -1; 821 /* Log Here */ 822 } 823 } 824 else 825 { 826 add_status = -1; 827 /* Log Here */ 828 } 829 } 830 else 831 { 832 add_status = -1; 833 /* Log Here */ 834 } 835 } 836 else 837 { 838 add_status = -1; 839 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" ); 840 } 841 return ( add_status ); 842 } 843 844 845 846int srec_test_compile_active_context ( SR_Grammar *active_grammar ) 847 { 848 int compile_status; 849 ESR_ReturnCode esr_status; 850 851 if ( active_grammar != NULL ) 852 { 853 compile_status = 0; 854#if defined(APP_ENABLE_TIMER) 855 PTimerStart ( compileTimer ); 856#endif 857 esr_status = SR_GrammarCompile( active_grammar ); 858#if defined(APP_ENABLE_TIMER) 859 PTimerStop ( compileTimer ); 860#endif 861 if ( esr_status != ESR_SUCCESS ) 862 { 863 compile_status = -1; 864 /* Log Here */ 865 } 866 } 867 else 868 { 869 compile_status = -1; 870 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, L("No Active Grammar To Compile") ); 871 } 872 return ( compile_status ); 873 } 874 875 876 877int srec_test_load_grammar_data_from_command ( ApplicationData *data, unsigned int grammar_num, LCHAR *command_text ) 878 { 879 int get_status; 880 ESR_ReturnCode esr_status; 881 LCHAR path [P_PATH_MAX]; 882 LCHAR id [P_PATH_MAX]; 883 LCHAR rule [P_PATH_MAX]; 884 LCHAR ve_marker [P_PATH_MAX]; 885 size_t path_length; 886 887 get_status = srec_test_get_four_command_items ( command_text, P_PATH_MAX, path, P_PATH_MAX, id, 888 P_PATH_MAX, rule, P_PATH_MAX, ve_marker, NULL, NULL ); 889 if ( get_status == 0 ) 890 { 891 path_length = P_PATH_MAX; 892 esr_status = ESR_SessionPrefixWithBaseDirectory ( path, &path_length ); 893 894 if ( esr_status == ESR_SUCCESS ) 895 { 896 LSTRCPY ( data->grammars [grammar_num].grammar_path, path ); 897 LSTRCPY ( data->grammars [grammar_num].grammarID, id ); 898 LSTRCPY ( data->grammars [grammar_num].ruleName, rule ); 899 900 if ( LSTRCMP ( ve_marker, L("ve") ) ==0 ) 901 data->grammars [grammar_num].is_ve_grammar = ESR_TRUE; 902 else if ( LSTRCMP ( ve_marker, L("not_ve") ) ==0 ) 903 data->grammars [grammar_num].is_ve_grammar = ESR_FALSE; 904 else 905 { 906 get_status = -1; 907 /* Log Here */ 908 } 909 } 910 else 911 { 912 get_status = -1; 913 /* Log Here */ 914 } 915 } 916 else 917 { 918 /* Log Here */ 919 } 920 return ( get_status ); 921 } 922 923 924 925int srec_test_load_context ( ApplicationData *data, LCHAR *command_text ) 926 { 927 int load_status; 928 ESR_ReturnCode esr_status; 929 unsigned int open_grammar; 930 931 load_status = srec_test_get_empty_grammar_index ( data, &open_grammar ); 932 933 if ( load_status == 0 ) 934 { 935 load_status = srec_test_load_grammar_data_from_command ( data, open_grammar, command_text ); 936 937 if ( load_status == 0 ) 938 { 939 esr_status = SetupGrammarLoad ( data, open_grammar ); 940 941 if ( esr_status == ESR_SUCCESS ) 942 { 943 data->grammarCount++; 944 } 945 else 946 { 947 load_status = -1; 948 /* Log Here */ 949 } 950 } 951 else 952 { 953 /* Log Here */ 954 } 955 } 956 else 957 { 958 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Maximum Number Of Grammars Already Loaded") ); 959 } 960 return ( load_status ); 961 } 962 963 964 965int srec_test_free_context ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text ) 966 { 967 int free_status; 968 ESR_ReturnCode esr_status; 969 int grammar_num; 970 ESR_BOOL found_grammar; 971 ESR_BOOL grammar_is_active; 972 ESR_BOOL grammar_is_ve; 973 LCHAR grammar_id [P_PATH_MAX]; 974 975 free_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL ); 976 977 if ( free_status == 0 ) 978 { 979 found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve ); 980 981 if ( found_grammar == ESR_TRUE ) 982 { 983 if ( grammar_is_active == ESR_TRUE ) 984 { 985 if ( grammar_is_ve == ESR_TRUE ) 986 { 987 esr_status = SR_RecognizerSetBoolParameter ( data->recognizer, L("enableGetWaveform"), ESR_FALSE ); 988 989 if ( esr_status != ESR_SUCCESS ) 990 { 991 free_status = -1; 992 /* Log Here */ 993 } 994 } 995 else 996 { 997 esr_status = ESR_SUCCESS; 998 } 999 if ( esr_status == ESR_SUCCESS ) 1000 { 1001 esr_status = SR_RecognizerDeactivateRule ( data->recognizer, data->grammars [data->active_grammar_num].grammar, 1002 data->grammars [data->active_grammar_num].ruleName ); 1003 if ( esr_status == ESR_SUCCESS ) 1004 { 1005 data->active_grammar_num = -1; 1006 } 1007 else 1008 { 1009 free_status = -1; 1010 /* Log Here */ 1011 } 1012 } 1013 } 1014 else 1015 { 1016 free_status = -1; 1017 /* Log Here */ 1018 } 1019 } 1020 else 1021 { 1022 free_status = -1; 1023 /* Log Here */ 1024 } 1025 } 1026 else 1027 { 1028 /* Log Here */ 1029 } 1030 return ( free_status ); 1031 } 1032 1033 1034 1035int srec_test_unload_context ( ApplicationData *data, LCHAR *command_text ) 1036 { 1037 int unload_status; 1038 ESR_ReturnCode esr_status; 1039 int grammar_num; 1040 ESR_BOOL found_grammar; 1041 ESR_BOOL grammar_is_active; 1042 ESR_BOOL grammar_is_ve; 1043 LCHAR grammar_id [P_PATH_MAX]; 1044 1045 unload_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL ); 1046 1047 if ( unload_status == 0 ) 1048 { 1049 found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve ); 1050 1051 if ( found_grammar == ESR_TRUE ) 1052 { 1053 if ( grammar_is_active == ESR_FALSE ) 1054 { 1055 esr_status = SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 1056 1057 if ( esr_status != ESR_SUCCESS ) 1058 { 1059 unload_status = -1; 1060 /* Log Here */ 1061 } 1062 srec_test_delete_grammar ( data, grammar_num ); 1063 } 1064 else 1065 { 1066 unload_status = -1; 1067 /* Log Here */ 1068 } 1069 } 1070 else 1071 { 1072 unload_status = -1; 1073 /* Log Here */ 1074 } 1075 } 1076 else 1077 { 1078 /* Log Here */ 1079 } 1080 return ( unload_status ); 1081 } 1082 1083 1084 1085int srec_test_use_context ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text ) 1086 { 1087 int use_status; 1088 ESR_ReturnCode esr_status; 1089 int grammar_num; 1090 ESR_BOOL found_grammar; 1091 ESR_BOOL grammar_is_active; 1092 ESR_BOOL grammar_is_ve; 1093 LCHAR grammar_id [P_PATH_MAX]; 1094 1095 if ( active_grammar == NULL ) 1096 { 1097 use_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL ); 1098 1099 if ( use_status == 0 ) 1100 { 1101 found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve ); 1102 1103 if ( found_grammar == ESR_TRUE ) 1104 { 1105 esr_status = SR_RecognizerActivateRule ( data->recognizer, data->grammars [grammar_num].grammar, 1106 data->grammars [grammar_num].ruleName, 1 ); 1107 if ( esr_status == ESR_SUCCESS ) 1108 { 1109 if ( data->grammars [grammar_num].is_ve_grammar == ESR_TRUE ) 1110 { 1111 esr_status = SR_RecognizerSetBoolParameter ( data->recognizer, L("enableGetWaveform"), ESR_TRUE ); 1112 1113 if ( esr_status == ESR_SUCCESS ) 1114 { 1115 data->active_grammar_num = (int)grammar_num; 1116 } 1117 else 1118 { 1119 use_status = -1; 1120 /* Log Here */ 1121 SR_RecognizerDeactivateRule ( data->recognizer, data->grammars [grammar_num].grammar, 1122 data->grammars [grammar_num].ruleName ); 1123 } 1124 } 1125 else 1126 { 1127 data->active_grammar_num = (int)grammar_num; 1128 } 1129 } 1130 else 1131 { 1132 use_status = -1; 1133 /* Log Here */ 1134 } 1135 } 1136 else 1137 { 1138 use_status = -1; 1139 /* Log Here */ 1140 } 1141 } 1142 else 1143 { 1144 use_status = -1; 1145 /* Log Here */ 1146 } 1147 } 1148 else 1149 { 1150 use_status = -1; 1151 /* Log Here */ 1152 } 1153 return ( use_status ); 1154 } 1155 1156 1157 1158int srec_test_save_context ( SR_Grammar *active_grammar, LCHAR *command_text ) 1159 { 1160 int save_status; 1161 ESR_ReturnCode esr_status; 1162 LCHAR file_name [P_PATH_MAX]; 1163 1164 if ( active_grammar != NULL ) 1165 { 1166 save_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL ); 1167 1168 if ( save_status == 0 ) 1169 { 1170 esr_status = SR_GrammarSave ( active_grammar, file_name ); 1171 1172 if ( esr_status != ESR_SUCCESS ) 1173 { 1174 save_status = -1; 1175 /* Log Here */ 1176 } 1177 } 1178 else 1179 { 1180 /* Log Here */ 1181 } 1182 } 1183 else 1184 { 1185 save_status = -1; 1186 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" ); 1187 } 1188 return ( save_status ); 1189 } 1190 1191 1192 1193int srec_test_voice_enroll ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text ) 1194 { 1195 int enroll_status; 1196 ESR_ReturnCode esr_status; 1197 LCHAR slot [P_PATH_MAX]; 1198 LCHAR nametagID [P_PATH_MAX]; 1199 LCHAR weight [MAX_UINT_DIGITS+1]; 1200 int weightNumber; 1201 int convert_string_to_num; 1202 1203 if ( active_grammar != NULL ) 1204 { 1205 if ( data->nametag != NULL ) 1206 { 1207 enroll_status = srec_test_get_three_command_items ( command_text, P_PATH_MAX, slot, P_PATH_MAX, nametagID, 1208 MAX_UINT_DIGITS + 1, weight, NULL, NULL ); 1209 if ( enroll_status == 0 ) 1210 { 1211 convert_string_to_num = lstrtoi ( weight, &weightNumber, 10 ); 1212 1213 if ( convert_string_to_num == 0 ) 1214 { 1215 esr_status = SR_NametagSetID ( data->nametag, nametagID ); 1216 1217 if ( esr_status == ESR_SUCCESS ) 1218 { 1219 esr_status = SR_GrammarAddNametagToSlot ( active_grammar, slot, data->nametag, weightNumber, NULL ); 1220 1221 if ( esr_status != ESR_SUCCESS ) 1222 { 1223 enroll_status = -1; 1224 /* Log Here */ 1225 } 1226 } 1227 else 1228 { 1229 enroll_status = -1; 1230 /* Log Here */ 1231 } 1232 } 1233 else 1234 { 1235 enroll_status = -1; 1236 /* Log Here */ 1237 } 1238 } 1239 else 1240 { 1241 /* Log Here */ 1242 } 1243 } 1244 else 1245 { 1246 enroll_status = -1; 1247 /* Log Here */ 1248 } 1249 } 1250 else 1251 { 1252 enroll_status = -1; 1253 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" ); 1254 } 1255 return ( enroll_status ); 1256 } 1257 1258 1259 1260int srec_test_load_nametags ( ApplicationData *data, LCHAR *command_text ) 1261 { 1262 int load_status; 1263 ESR_ReturnCode esr_status; 1264 LCHAR file_name [P_PATH_MAX]; 1265 1266 load_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL ); 1267 1268 if ( load_status == 0 ) 1269 { 1270 esr_status = SR_NametagsLoad ( data->nametags, file_name ); 1271 1272 if ( esr_status != ESR_SUCCESS ) 1273 { 1274 load_status = -1; 1275 /* Log Here */ 1276 } 1277 } 1278 else 1279 { 1280 load_status = -1; 1281 /* Log Here */ 1282 } 1283 return ( load_status ); 1284 } 1285 1286 1287 1288int srec_test_save_nametags ( ApplicationData *data, LCHAR *command_text ) 1289 { 1290 int save_status; 1291 ESR_ReturnCode esr_status; 1292 LCHAR file_name [P_PATH_MAX]; 1293 1294 save_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL ); 1295 1296 if ( save_status == 0 ) 1297 { 1298 esr_status = SR_NametagsSave ( data->nametags, file_name ); 1299 1300 if ( esr_status != ESR_SUCCESS ) 1301 { 1302 save_status = -1; 1303 /* Log Here */ 1304 } 1305 } 1306 else 1307 { 1308 save_status = -1; 1309 /* Log Here */ 1310 } 1311 return ( save_status ); 1312 } 1313 1314 1315 1316int srec_test_clear_nametags ( ApplicationData *data ) 1317 { 1318 int clear_status; 1319 ESR_ReturnCode esr_status; 1320 1321 clear_status = 0; 1322 esr_status = SR_NametagsDestroy ( data->nametags ); 1323 1324 if ( esr_status == ESR_SUCCESS ) 1325 { 1326 data->nametags = NULL; 1327 esr_status = SR_NametagsCreate ( &data->nametags ); 1328 1329 if ( esr_status != ESR_SUCCESS ) 1330 { 1331 clear_status = -1; 1332 /* Log Here */ 1333 } 1334 } 1335 else 1336 { 1337 clear_status = -1; 1338 /* Log Here */ 1339 } 1340 return ( clear_status ); 1341 } 1342 1343 1344 1345int srec_test_add_to_nametags ( ApplicationData *data, LCHAR *command_text ) 1346 { 1347 int add_status; 1348 ESR_ReturnCode esr_status; 1349 LCHAR nametagID [P_PATH_MAX]; 1350 1351 if ( data->nametag != NULL ) 1352 { 1353 add_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, nametagID, NULL ); 1354 1355 if ( add_status == 0 ) 1356 { 1357 esr_status = SR_NametagSetID ( data->nametag, nametagID ); 1358 1359 if ( esr_status == ESR_SUCCESS ) 1360 { 1361 esr_status = SR_NametagsAdd ( data->nametags, data->nametag ); 1362 1363 if ( esr_status == ESR_SUCCESS ) 1364 { 1365 data->nametag = NULL; 1366 } 1367 else 1368 { 1369 add_status = -1; 1370 /* Log Here */ 1371 } 1372 } 1373 else 1374 { 1375 add_status = -1; 1376 /* Log Here */ 1377 } 1378 } 1379 else 1380 { 1381 add_status = -1; 1382 /* Log Here */ 1383 } 1384 } 1385 else 1386 { 1387 add_status = -1; 1388 /* Log Here */ 1389 } 1390 return ( add_status ); 1391 } 1392 1393 1394int srec_test_voice_enroll_nametags ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text ) 1395 { 1396 int enroll_status; 1397 ESR_ReturnCode esr_status; 1398 LCHAR slot [P_PATH_MAX]; 1399 SR_Nametag *nametag; 1400 size_t nametags_size; 1401 size_t current_nametag; 1402 1403 if ( active_grammar != NULL ) 1404 { 1405 enroll_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, slot, NULL ); 1406 1407 if ( enroll_status == 0 ) 1408 { 1409 esr_status = SR_NametagsGetSize (data->nametags, &nametags_size ); 1410 1411 if ( esr_status == ESR_SUCCESS ) 1412 { 1413 current_nametag = 0; 1414 1415 while ( ( current_nametag < nametags_size ) && ( esr_status == ESR_SUCCESS ) ) 1416 { 1417 esr_status = SR_NametagsGetAtIndex ( data->nametags, current_nametag, &nametag ); 1418 1419 if ( esr_status == ESR_SUCCESS ) 1420 { 1421 esr_status = SR_GrammarAddNametagToSlot ( active_grammar, slot, nametag, 0, NULL ); 1422 1423 if ( esr_status == ESR_SUCCESS ) 1424 { 1425 current_nametag++; 1426 } 1427 else 1428 { 1429 enroll_status = -1; 1430 /* Log Here */ 1431 } 1432 } 1433 else 1434 { 1435 enroll_status = -1; 1436 /* Log Here */ 1437 } 1438 } 1439 } 1440 else 1441 { 1442 enroll_status = -1; 1443 /* Log Here */ 1444 } 1445 } 1446 else 1447 { 1448 /* Log Here */ 1449 } 1450 } 1451 else 1452 { 1453 enroll_status = -1; 1454 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" ); 1455 } 1456 return ( enroll_status ); 1457 } 1458 1459 1460 1461int srec_test_load_acousticstate ( ApplicationData *data, LCHAR *command_text ) 1462 { 1463 int load_status; 1464 ESR_ReturnCode esr_status; 1465 LCHAR file_name [P_PATH_MAX]; 1466 1467 load_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL ); 1468 1469 if ( load_status == 0 ) 1470 { 1471 esr_status = SR_AcousticStateLoad ( data->recognizer, file_name ); 1472 1473 if ( esr_status != ESR_SUCCESS ) 1474 { 1475 load_status = -1; 1476 /* Log Here */ 1477 } 1478 } 1479 else 1480 { 1481 /* Log Here */ 1482 } 1483 return ( load_status ); 1484 } 1485 1486 1487 1488int srec_test_reset_acousticstate ( ApplicationData *data ) 1489 { 1490 int reset_status; 1491 ESR_ReturnCode esr_status; 1492 1493 reset_status = 0; 1494 esr_status = SR_AcousticStateReset ( data->recognizer ); 1495 1496 if ( esr_status != ESR_SUCCESS ) 1497 { 1498 reset_status = -1; 1499 /* Log Here */ 1500 } 1501 return ( reset_status ); 1502 } 1503 1504 1505 1506int srec_test_set_forced_rec_mode ( ApplicationData *data, LCHAR *command_text ) 1507 { 1508 int set_status; 1509 LCHAR mode[P_PATH_MAX]; 1510 1511 set_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, mode, NULL ); 1512 1513 if ( set_status == 0 ) 1514 { 1515 if ( LSTRCMP ( mode, L("one_time") ) == 0 ) 1516 { 1517 data->forced_rec_mode = ForcedRecModeOneTime; 1518 } 1519 else if ( LSTRCMP ( mode, L("off") ) == 0 ) 1520 { 1521 data->forced_rec_mode = ForcedRecModeOff; 1522 } 1523 else if ( LSTRCMP ( mode, L("on") ) == 0 ) 1524 { 1525 data->forced_rec_mode = ForcedRecModeOn; 1526 } 1527 else 1528 { 1529 set_status = -1; 1530 /* Log Here */ 1531 } 1532 } 1533 return ( set_status ); 1534 } 1535 1536 1537 1538int srec_test_execute_command ( ApplicationData *data, AUDIOIN_H audio_input_handle, LCHAR *text, FILE *results_file, size_t *recognition_count ) 1539 { 1540 int execute_status; 1541 LCHAR *current_command_start; 1542 LCHAR *current_end_command; 1543 LCHAR command [MAX_LINE_LENGTH]; 1544 SR_Grammar *active_grammar; 1545 LCHAR log_buffer [LOG_BUFFER_SIZE]; 1546 1547 srec_test_get_active_grammar ( data, &active_grammar ); 1548 current_command_start = text; 1549 execute_status = srec_test_get_one_command_item ( current_command_start, MAX_LINE_LENGTH, command, ¤t_end_command ); 1550 1551 if ( execute_status == 0 ) 1552 { 1553 if( data->nametag 1554 && ((LSTRCMP(command, "recognize_nist")==0) || (LSTRCMP(command, "recognize_pcm")==0)) ) { 1555 /* if there is a nametag held in memory, and we don't make use of it, then 1556 let's destroy it here */ 1557 SR_NametagDestroy( data->nametag); 1558 data->nametag = NULL; 1559 } 1560 if ( LSTRCMP ( command, L("recognize_live") ) == 0 ) 1561 execute_status = srec_test_recognize_live ( active_grammar, data, audio_input_handle, results_file, recognition_count ); 1562 else if ( LSTRCMP ( command, L("context_load") ) == 0 ) 1563 execute_status = srec_test_load_context ( data, current_end_command ); 1564 else if ( LSTRCMP ( command, L("context_use") ) == 0 ) 1565 execute_status = srec_test_use_context ( active_grammar, data, current_end_command ); 1566 else if ( LSTRCMP ( command, L("context_free") ) == 0 ) 1567 execute_status = srec_test_free_context ( active_grammar, data, current_end_command ); 1568 else if ( LSTRCMP ( command, L("context_unload") ) == 0 ) 1569 execute_status = srec_test_unload_context ( data, current_end_command ); 1570 else if ( LSTRCMP ( command, L("addwords_from_nametags") ) == 0 ) 1571 execute_status = srec_test_voice_enroll_nametags ( active_grammar, data, current_end_command ); 1572 else if ( LSTRCMP ( command, L("resetslots") ) == 0 ) 1573 execute_status = srec_test_reset_slots ( active_grammar ); 1574 else if ( LSTRCMP ( command, L("addword") ) == 0 ) 1575 execute_status = srec_test_add_word ( active_grammar, current_end_command ); 1576 else if ( LSTRCMP ( command, L("context_compile") ) == 0 ) 1577 execute_status = srec_test_compile_active_context ( active_grammar ); 1578 else if ( LSTRCMP ( command, L("context_save") ) == 0 ) 1579 execute_status = srec_test_save_context ( active_grammar, current_end_command ); 1580 else if ( LSTRCMP ( command, L("addword_from_last_nametag") ) == 0 ) 1581 execute_status = srec_test_voice_enroll ( active_grammar, data, current_end_command ); 1582 else if ( LSTRCMP ( command, L("load_nametags") ) == 0 ) 1583 execute_status = srec_test_load_nametags ( data, current_end_command ); 1584 else if ( LSTRCMP ( command, L("save_nametags") ) == 0 ) 1585 execute_status = srec_test_save_nametags ( data, current_end_command ); 1586 else if ( LSTRCMP ( command, L("clear_nametags") ) ==0 ) 1587 execute_status = srec_test_clear_nametags ( data ); 1588 else if ( LSTRCMP ( command, L("add_to_nametags") ) == 0 ) 1589 execute_status = srec_test_add_to_nametags ( data, current_end_command ); 1590 else if ( LSTRCMP ( command, L("acousticstate_load") ) == 0 ) 1591 execute_status = srec_test_load_acousticstate ( data, current_end_command ); 1592 else if ( LSTRCMP ( command, L("acousticstate_reset") ) == 0 ) 1593 execute_status = srec_test_reset_acousticstate ( data ); 1594 else if ( LSTRCMP ( command, L("forced_rec") ) == 0 ) 1595 execute_status = srec_test_set_forced_rec_mode ( data, current_end_command ); 1596 else if ( *( command ) == L('#') ) 1597 execute_status = 0; /* Comment in file just skip */ 1598 else 1599 { 1600 execute_status = -1; 1601 LSPRINTF ( log_buffer, L("Unknown Command %s"), command ); 1602 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, log_buffer ); 1603 } 1604 } 1605 else 1606 { 1607 /* Log Here */ 1608 } 1609 return ( execute_status ); 1610 } 1611 1612 1613 1614int srec_test_open_command_file ( PFile **command_file ) 1615 { 1616 int open_status; 1617 ESR_ReturnCode esr_status; 1618 LCHAR file_name [P_PATH_MAX]; 1619 size_t len; 1620 1621 open_status = 0; 1622 len = P_PATH_MAX; 1623 esr_status = ESR_SessionGetLCHAR ( L("cmdline.tcp"), file_name, &len ); 1624 1625 if ( esr_status == ESR_SUCCESS ) 1626 { 1627 len = P_PATH_MAX; 1628 esr_status = ESR_SessionPrefixWithBaseDirectory ( file_name, &len ); 1629 1630 if ( esr_status == ESR_SUCCESS ) 1631 { 1632 *command_file = pfopen ( file_name, L("r") ); 1633 1634 if ( ( *command_file ) == NULL ) 1635 { 1636 open_status = -1; 1637 /* Log Here */ 1638 } 1639 } 1640 else 1641 { 1642 open_status = -1; 1643 /* Log Here */ 1644 } 1645 } 1646 else 1647 { 1648 open_status = -1; 1649 /* Log Here */ 1650 } 1651 return ( open_status ); 1652 } 1653 1654 1655 1656void srec_test_close_command_file ( PFile *command_file ) 1657 { 1658 1659 pfclose ( command_file ); 1660 } 1661 1662 1663 1664void srec_test_close_audio_file ( PFile *audio_file ) 1665 { 1666 1667 pfclose ( audio_file ); 1668 } 1669 1670 1671 1672int srec_test_open_results_file ( FILE **results_file ) 1673 { 1674 int open_status; 1675 ESR_ReturnCode esr_status; 1676 LCHAR file_name [P_PATH_MAX]; 1677 size_t len; 1678 1679 open_status = 0; 1680 len = P_PATH_MAX; 1681 esr_status = ESR_SessionGetLCHAR ( L("cmdline.results"), file_name, &len ); 1682 1683 if ( esr_status == ESR_SUCCESS ) 1684 { 1685 *results_file = fopen ( file_name, L("w") ); 1686 1687 if ( ( *results_file ) == NULL ) 1688 { 1689 open_status = -1; 1690 /* Log Here */ 1691 } 1692 } 1693 else 1694 { 1695 open_status = -1; 1696 /* Log Here */ 1697 } 1698 return ( open_status ); 1699 } 1700 1701 1702 1703void srec_test_close_results_file ( FILE *results_file ) 1704 { 1705 1706 fclose ( results_file ); 1707 } 1708 1709 1710 1711int srec_test_process_commands ( ApplicationData *data, AUDIOIN_H audio_input_handle ) 1712 { 1713 int process_status; 1714 PFile *command_file; 1715 FILE *results_file; 1716 LCHAR *got_line_ok; 1717 LCHAR linebuffer [MAX_LINE_LENGTH]; 1718 size_t recognition_count; 1719 1720 recognition_count = 0; 1721 process_status = srec_test_open_command_file ( &command_file ); 1722 1723 if ( process_status == 0 ) 1724 { 1725 process_status = srec_test_open_results_file ( &results_file ); 1726 1727 if ( process_status == 0 ) 1728 { 1729 do 1730 { 1731 got_line_ok = pfgets ( linebuffer, MAX_LINE_LENGTH, command_file ); 1732 1733 if ( got_line_ok != NULL ) 1734 srec_test_execute_command ( data, audio_input_handle, linebuffer, results_file, &recognition_count ); 1735 } 1736 while ( ( got_line_ok != NULL ) && ( process_status == 0 ) ); 1737 if( data->nametag ) { 1738 SR_NametagDestroy( data->nametag); 1739 data->nametag = NULL; 1740 } 1741 1742 srec_test_close_results_file ( results_file ); 1743 } 1744 srec_test_close_command_file ( command_file ); 1745 } 1746 return ( process_status ); 1747 } 1748 1749 1750 1751int srec_test_open_nist_file ( LCHAR *file_name, PFile **nist_file ) 1752 { 1753 int open_status; 1754 ESR_ReturnCode esr_status; 1755 int lstr_result; 1756 LCHAR file_path [P_PATH_MAX]; 1757 size_t len; 1758 1759 open_status = 0; 1760 len = P_PATH_MAX; 1761 esr_status = ESR_SessionGetLCHAR ( L("cmdline.datapath"), file_path, &len ); 1762 1763 if ( esr_status == ESR_SUCCESS ) 1764 { 1765 len = P_PATH_MAX; 1766 esr_status = ESR_SessionPrefixWithBaseDirectory ( file_path, &len ); 1767 1768 if ( esr_status == ESR_SUCCESS ) 1769 { 1770 esr_status = pf_convert_backslashes_to_forwardslashes ( file_path ); 1771 1772 if ( esr_status == ESR_SUCCESS ) 1773 { 1774 len = P_PATH_MAX; 1775 lstr_result = lstrinsert ( file_path, file_name, 0, &len ); 1776 1777 if ( lstr_result == 0 ) 1778 { 1779 *nist_file = pfopen ( file_name, L("rb") ); 1780 1781 if ( ( *nist_file ) != NULL ) 1782 { 1783 esr_status = pfseek ( *nist_file, 1024, SEEK_SET ); 1784 1785 if ( esr_status != ESR_SUCCESS ) 1786 { 1787 open_status = -1; 1788 /* Log Here */ 1789 } 1790 } 1791 else 1792 { 1793 open_status = -1; 1794 /* Log Here */ 1795 } 1796 } 1797 else 1798 { 1799 open_status = -1; 1800 /* Log Here */ 1801 } 1802 } 1803 else 1804 { 1805 open_status = -1; 1806 /* Log Here */ 1807 } 1808 } 1809 else 1810 { 1811 open_status = -1; 1812 /* Log Here */ 1813 } 1814 } 1815 else 1816 { 1817 open_status = -1; 1818 /* Log Here */ 1819 } 1820 return ( open_status ); 1821 } 1822 1823 1824 1825int srec_test_get_audio_from_file ( PFile *audio_file, ApplicationData *data, ESR_BOOL *hit_eof ) 1826 { 1827 int get_status; 1828 int eof_status; 1829 1830 get_status = 0; 1831 data->num_samples_read = pfread ( data->audio_buffer, sizeof ( asr_int16_t ), data->audio_buffer_requested_size, audio_file ); 1832 1833 if ( data->num_samples_read > 0 ) 1834 { 1835 *hit_eof = ESR_FALSE; 1836 } 1837 else 1838 { 1839 eof_status = pfeof ( audio_file ); 1840 1841 if ( eof_status == 0 ) 1842 { 1843 get_status = -1; 1844 /* Log Here */ 1845 } 1846 else 1847 { 1848 *hit_eof = ESR_TRUE; 1849 } 1850 } 1851 return ( get_status ); 1852 } 1853 1854 1855 1856int srec_test_feed_recognizer ( ApplicationData *data, ESR_BOOL hit_eof, SR_RecognizerStatus *esr_recog_status, SR_RecognizerResultType *result_type ) 1857 { 1858 int feed_status; 1859 ESR_ReturnCode esr_status; 1860 1861 feed_status = 0; 1862 esr_status = SR_RecognizerPutAudio ( data->recognizer, data->audio_buffer, &data->num_samples_read, hit_eof ); 1863 1864 if ( esr_status == ESR_SUCCESS ) 1865 { 1866 do 1867 { 1868 esr_status = SR_RecognizerAdvance ( data->recognizer, esr_recog_status, result_type, &data->result ); 1869 1870 if ( esr_status != ESR_SUCCESS ) 1871 { 1872 feed_status = -1; 1873 *esr_recog_status = SR_RECOGNIZER_EVENT_STOPPED; 1874 *result_type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE; 1875 /* Log Here */ 1876 } 1877 } 1878 while ( ( *esr_recog_status ) == SR_RECOGNIZER_EVENT_INCOMPLETE ); 1879 } 1880 else 1881 { 1882 feed_status = -1; 1883 /* Log Here */ 1884 } 1885 return ( feed_status ); 1886 } 1887 1888 1889 1890int srec_test_flush_audio ( ApplicationData *data, SR_RecognizerStatus *esr_recog_status, SR_RecognizerResultType *result_type ) 1891 { 1892 int flush_status; 1893 ESR_ReturnCode esr_status; 1894 1895 flush_status = 0; 1896 1897 while ( ( *result_type ) != SR_RECOGNIZER_RESULT_TYPE_COMPLETE ) 1898 { 1899 esr_status = SR_RecognizerAdvance ( data->recognizer, esr_recog_status, result_type, &data->result ); 1900 1901 if ( esr_status != ESR_SUCCESS ) 1902 { 1903 flush_status = -1; 1904 *esr_recog_status = SR_RECOGNIZER_EVENT_STOPPED; 1905 *result_type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE; 1906 /* Log Here */ 1907 } 1908 } 1909 return ( flush_status ); 1910 } 1911 1912 1913 1914int srec_test_process_start_timeout ( ApplicationData *data, FILE *results_file ) 1915 { 1916 int process_status; 1917 ESR_ReturnCode esr_status; 1918 size_t utterance_timeout; 1919 1920 process_status = 0; 1921 esr_status = ESR_SessionGetSize_t ( L("SREC.Recognizer.utterance_timeout"), &utterance_timeout ); 1922 1923 if ( esr_status == ESR_SUCCESS ) 1924 { 1925 LFPRINTF ( results_file, L("E: utterance_timeout %lu\n"), (unsigned long)utterance_timeout ); 1926 LFPRINTF ( results_file, L("R: <FAILED>\n") ); 1927 LPRINTF ( L("\n-------------------------------------\n") ); 1928 LPRINTF ( L("E: utterance_timeout %lu\n"), (unsigned long)utterance_timeout ); 1929 LPRINTF ( L("R: <FAILED>\n") ); 1930 LPRINTF ( L("-------------------------------------\n\n") ); 1931 } 1932 else 1933 { 1934 process_status = -1; 1935 /* Log Here */ 1936 } 1937 srec_test_log_recognition_failure ( data ); 1938 1939 return ( process_status ); 1940 } 1941 1942 1943int srec_test_write_and_log_wave_form_file ( ApplicationData *data, size_t recognition_count ) 1944 { 1945 int write_status; 1946 ESR_ReturnCode esr_status; 1947 LCHAR *wave_filename; 1948 1949 write_status = 0; 1950 LSPRINTF ( data->raw_waveform_filename, L("a%lu__%s.raw"), (unsigned long)recognition_count, data->transcription ); 1951 wave_filename = data->raw_waveform_filename; 1952 1953 while ( *wave_filename ) 1954 { 1955 if ( *wave_filename == ' ') 1956 *wave_filename = '_'; 1957 wave_filename++; 1958 } 1959/* just write to file for now... for testing purposes */ 1960 LPRINTF ( L("Dumping audio waveform to file %s\n"), data->raw_waveform_filename ); 1961 data->raw_waveform_file = pfopen ( data->raw_waveform_filename, L("wb") ); 1962 1963 if ( data->raw_waveform_file != NULL ) 1964 { 1965 pfwrite ( (void*)data->raw_waveform, 1, data->raw_waveform_size, data->raw_waveform_file ); 1966 pfclose ( data->raw_waveform_file ); 1967/* log the filename in the ESR log */ 1968 esr_status = SR_RecognizerLogToken ( data->recognizer, "WVFMFILENAME", data->raw_waveform_filename ); 1969 1970 if( esr_status != ESR_SUCCESS ) 1971 { 1972 write_status = -1; 1973 /* Log Here */ 1974 } 1975 } 1976 else 1977 { 1978 write_status = -1; 1979 /* Log Here */ 1980 } 1981 return ( write_status ); 1982 } 1983 1984 1985 1986int srec_test_process_nbest_list ( ApplicationData *data, FILE *results_file ) 1987 { 1988 int process_status; 1989 ESR_ReturnCode esr_status; 1990 size_t nbestSize; 1991 size_t nbest_num; 1992 LCHAR linebuffer [MAX_LINE_LENGTH]; 1993 size_t line_length; 1994 1995 process_status = 0; 1996 /* At least one semantic result exists */ 1997 LPRINTF ( L("\n\n----------------------------------------------\n") ); 1998 line_length = MAX_LINE_LENGTH; 1999 esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("conf"), linebuffer, &line_length ); 2000 2001 if ( esr_status == ESR_SUCCESS ) 2002 { 2003 LPRINTF ( L("CONFIDENCE SCORE : '%s'\n"), linebuffer ); 2004 LPRINTF ( L("TRANSCRIPTION : '%s'\n"), data->transcription ); 2005 esr_status = SR_RecognizerResultGetSize (data->result, &nbestSize ); 2006 2007 if ( esr_status == ESR_SUCCESS ) 2008 { 2009 for ( nbest_num = 0; nbest_num < nbestSize; nbest_num++ ) 2010 { 2011 line_length = MAX_LINE_LENGTH; 2012 esr_status = SR_RecognizerResultGetValue ( data->result, nbest_num, L("literal"), linebuffer, &line_length ); 2013 2014 if ( esr_status == ESR_SUCCESS ) 2015 { 2016 LPRINTF ( L("LITERAL[%2lu] : '%s'\n"), (unsigned long)nbest_num, linebuffer ); 2017 line_length = MAX_LINE_LENGTH; 2018 esr_status = SR_RecognizerResultGetValue ( data->result, nbest_num, L("meaning"), linebuffer, &line_length ); 2019 2020 if ( esr_status != ESR_SUCCESS ) 2021 { 2022 linebuffer [0] = L('\0') ; 2023 } 2024 LPRINTF ( L("MEANING[%2lu] : '%s'\n"), (unsigned long)nbest_num, linebuffer ); 2025 line_length = MAX_LINE_LENGTH; 2026 esr_status = SR_RecognizerResultGetValue (data->result, nbest_num, L("raws"), linebuffer, &line_length ); 2027 2028 if ( esr_status == ESR_SUCCESS ) 2029 { 2030 LPRINTF ( L("RAW SCORE[%2lu] : '%s'\n\n"), (unsigned long)nbest_num, linebuffer); 2031 } 2032 else 2033 { 2034 process_status = -1; 2035 /* Log Here */ 2036 } 2037 } 2038 else 2039 { 2040 process_status = -1; 2041 /* Log Here */ 2042 } 2043 } 2044 } 2045 else 2046 { 2047 process_status = -1; 2048 /* Log Here */ 2049 } 2050 } 2051 else 2052 { 2053 process_status = -1; 2054 /* Log Here */ 2055 } 2056 LPRINTF ( L("----------------------------------------------\n\n") ); 2057 return ( process_status ); 2058 } 2059 2060 2061 2062int srec_test_process_recognition ( ApplicationData *data, FILE *results_file, size_t recognition_count ) 2063 { 2064 int process_status; 2065 ESR_ReturnCode esr_status; 2066 APPL_GRAMMAR_DATA *grammar_data; 2067 LCHAR linebuffer [MAX_LINE_LENGTH]; 2068 size_t line_length; 2069 2070 process_status = 0; 2071 srec_test_get_active_grammar_data ( data, &grammar_data ); 2072 line_length = MAX_LINE_LENGTH; 2073 esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("literal"), linebuffer, &line_length ); 2074 2075 if ( esr_status == ESR_SUCCESS ) 2076 { 2077 LFPRINTF ( results_file, L("R: %s\n"), linebuffer ); 2078 line_length = MAX_LINE_LENGTH; 2079 esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("conf"), linebuffer, &line_length ); 2080 2081 if ( esr_status == ESR_SUCCESS ) 2082 { 2083 LFPRINTF ( results_file, L("S: %s\n"), linebuffer); 2084 LPRINTF ( L("S: %s\n"), linebuffer); 2085 srec_test_process_nbest_list ( data, results_file ); 2086 /* 2087 * SR_RecognizerResultGetWaveform will return pointer to buffer holding 2088 * audio data in it. This buffer is NOT under the application's control 2089 * and MUST only be read from. 2090 */ 2091 if ( grammar_data->is_ve_grammar == ESR_TRUE ) 2092 { 2093 LPRINTF ( L("VoiceEnrollement=>SUCCESS\n") ); 2094 esr_status = SR_NametagCreate ( data->result, L("dummyID"), &data->nametag ); 2095 2096 if ( esr_status == ESR_SUCCESS ) 2097 { 2098 esr_status = SR_RecognizerResultGetWaveform ( data->result, &data->raw_waveform, &data->raw_waveform_size ); 2099 2100 if( esr_status == ESR_SUCCESS ) 2101 { 2102 if ( data->raw_waveform ) 2103 { 2104 process_status = srec_test_write_and_log_wave_form_file ( data, recognition_count ); 2105 2106 if ( process_status == 0 ) 2107 { 2108 esr_status = SR_RecognizerLogEvent ( data->recognizer, "ESRve" ); 2109 2110 if( esr_status != ESR_SUCCESS ) 2111 { 2112 process_status = -1; 2113 /* Log Here */ 2114 } 2115 } 2116 else 2117 { 2118 /* Log Here */ 2119 } 2120 } 2121 } 2122 else 2123 { 2124 process_status = -1; 2125 /* Log Here */ 2126 } 2127 } 2128 else 2129 { 2130 process_status = -1; 2131 /* Log Here */ 2132 } 2133 } 2134 } 2135 else 2136 { 2137 process_status = -1; 2138 /* Log Here */ 2139 } 2140 } 2141 else 2142 { 2143 process_status = -1; 2144 /* Log Here */ 2145 } 2146 return ( process_status ); 2147 } 2148 2149 2150 2151int srec_test_process_recognition_fail ( ApplicationData *data ) 2152 { 2153 int process_status; 2154 ESR_ReturnCode esr_status; 2155 APPL_GRAMMAR_DATA *grammar_data; 2156 ESR_BOOL reason_status; 2157 2158 process_status = 0; 2159 srec_test_get_active_grammar_data ( data, &grammar_data ); 2160 LPRINTF(L("*** no match in recognition***\n")); 2161 2162 if ( grammar_data->is_ve_grammar == ESR_TRUE ) 2163 { 2164 data->nametag = NULL; 2165 LPRINTF ( L("VoiceEnrollement = FAILED : \n") ); 2166 } 2167 esr_status = SR_RecognizerIsSignalClipping ( data->recognizer, &reason_status ); 2168 2169 if ( esr_status == ESR_SUCCESS ) 2170 { 2171 if ( reason_status == ESR_TRUE ) 2172 LPRINTF ( L("- Signal is clipping\n") ); 2173 } 2174 else 2175 { 2176 process_status = -1; 2177 /* Log Here */ 2178 } 2179 esr_status = SR_RecognizerIsSignalDCOffset ( data->recognizer, &reason_status ); 2180 2181 if ( esr_status == ESR_SUCCESS ) 2182 { 2183 if ( reason_status == ESR_TRUE ) 2184 LPRINTF ( L("- Signal is DC-offset\n") ); 2185 } 2186 else 2187 { 2188 process_status = -1; 2189 /* Log Here */ 2190 } 2191 esr_status = SR_RecognizerIsSignalNoisy ( data->recognizer, &reason_status ); 2192 2193 if ( esr_status == ESR_SUCCESS ) 2194 { 2195 if ( reason_status == ESR_TRUE ) 2196 LPRINTF ( L("- Signal is noisy\n") ); 2197 } 2198 else 2199 { 2200 process_status = -1; 2201 /* Log Here */ 2202 } 2203 esr_status = SR_RecognizerIsSignalTooFewSamples ( data->recognizer, &reason_status ); 2204 2205 if ( esr_status == ESR_SUCCESS ) 2206 { 2207 if ( reason_status == ESR_TRUE ) 2208 LPRINTF ( L("- Signal has too few samples\n") ); 2209 } 2210 else 2211 { 2212 process_status = -1; 2213 /* Log Here */ 2214 } 2215 esr_status = SR_RecognizerIsSignalTooManySamples ( data->recognizer, &reason_status ); 2216 2217 if ( esr_status == ESR_SUCCESS ) 2218 { 2219 if ( reason_status == ESR_TRUE ) 2220 LPRINTF ( L("- Signal has too many samples\n") ); 2221 } 2222 else 2223 { 2224 process_status = -1; 2225 /* Log Here */ 2226 } 2227 esr_status = SR_RecognizerIsSignalTooQuiet ( data->recognizer, &reason_status ); 2228 2229 if ( esr_status == ESR_SUCCESS ) 2230 { 2231 if ( reason_status == ESR_TRUE ) 2232 LPRINTF ( L("- Signal is too quiet\n") ); 2233 } 2234 else 2235 { 2236 process_status = -1; 2237 /* Log Here */ 2238 } 2239 srec_test_log_recognition_failure ( data ); 2240 return ( process_status ); 2241 } 2242 2243 2244 2245int srec_test_process_recognition_unsupported_case ( ApplicationData *data, FILE *results_file ) 2246 { 2247 int process_status; 2248 2249 process_status = 0; 2250 LFPRINTF ( results_file, L("E: No results available\n") ); 2251 LFPRINTF ( results_file, L("R: <FAILED>\n") ); 2252 srec_test_log_recognition_failure ( data ); 2253 2254 return ( process_status ); 2255 } 2256 2257 2258 2259static void srec_test_log_recognition_failure ( ApplicationData *data ) 2260 { 2261 2262 LPRINTF(L("----------------------------------------------\n")); 2263 LPRINTF(L("TRANSCRIPTION : '%s'\n"), data->transcription); 2264 LPRINTF(L("<NO-RESULTS>\n")); 2265 LPRINTF(L("----------------------------------------------\n\n")); 2266 } 2267 2268 2269 2270int srec_test_process_results ( ApplicationData *data, SR_RecognizerStatus esr_recog_status, 2271 FILE *results_file, size_t recognition_count ) 2272 { 2273 int process_status; 2274 2275 switch ( esr_recog_status ) 2276 { 2277 case SR_RECOGNIZER_EVENT_START_OF_UTTERANCE_TIMEOUT: 2278 process_status = srec_test_process_start_timeout ( data, results_file ); 2279 break; 2280 2281 case SR_RECOGNIZER_EVENT_RECOGNITION_RESULT: 2282 process_status = srec_test_process_recognition ( data, results_file, recognition_count ); 2283 break; 2284 2285 case SR_RECOGNIZER_EVENT_NO_MATCH: 2286 process_status = srec_test_process_recognition_fail ( data ); 2287 break; 2288 2289 default: 2290 process_status = srec_test_process_recognition_unsupported_case ( data, results_file ); 2291 break; 2292 } 2293 return ( process_status ); 2294 } 2295 2296 2297 2298int srec_test_log_reco_from_file_data ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *waveform, LCHAR *bos, LCHAR *eos, LCHAR *transcription ) 2299 { 2300 int log_status; 2301 ESR_ReturnCode esr_status; 2302 size_t result_count; 2303 ESR_BOOL got_results; 2304 size_t transcription_length; 2305 2306 log_status = 0; 2307 LSPRINTF ( data->transcription, "%s", transcription ); 2308 transcription_length = LSTRLEN ( data->transcription ); 2309 2310 while ( ( *( data->transcription + transcription_length - 1 ) == '\n' ) || 2311 ( *( data->transcription + transcription_length - 1 ) == '\r' ) ) 2312 { 2313 *( data->transcription + transcription_length - 1 ) = '\0'; 2314 transcription_length--; 2315 } 2316 LPRINTF ( L("D: %s\nC: %s\n"), waveform, data->transcription ); 2317 esr_status = SR_GrammarCheckParse ( active_grammar, data->transcription, 0, &result_count ); 2318 2319 if ( esr_status == ESR_SUCCESS ) 2320 { 2321 if ( result_count > 0 ) 2322 { 2323 got_results = ESR_TRUE; 2324 LPRINTF ( L("Sem (%lu): invocab=1\n"), (unsigned long)result_count ); 2325 } 2326 else 2327 { 2328 got_results = ESR_FALSE; 2329 LPRINTF ( L("Sem: <NO INTERPRETATION FOUND>\n") ); 2330 } 2331 esr_status = SR_RecognizerLogWaveformData ( data->recognizer, waveform, data->transcription, atof ( bos ), atof ( eos ), got_results ); 2332 2333 if ( esr_status != ESR_SUCCESS ) 2334 { 2335 log_status = -1; 2336 /* Log Here */ 2337 } 2338 } 2339 else 2340 { 2341 log_status = -1; 2342 /* Log Here */ 2343 } 2344 return ( log_status ); 2345 } 2346 2347 2348 2349int srec_test_start_audio ( AUDIOIN_H audio_input_handle ) 2350 { 2351 int start_status; 2352 LHS_AUDIOIN_ERROR audio_status; 2353 2354 start_status = 0; 2355 audio_status = lhs_audioinStart ( audio_input_handle ); 2356 2357 if ( audio_status == LHS_AUDIOIN_OK ) 2358 { 2359 LPRINTF ( L("\n!!!!!! Start Speaking !!!!!!....\n") ); 2360 } 2361 else 2362 { 2363 start_status = -1; 2364 srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, "Audio Device Failed To Start" ); 2365 } 2366 return ( start_status ); 2367 } 2368 2369 2370 2371int srec_test_stop_audio ( AUDIOIN_H audio_input_handle ) 2372 { 2373 int stop_status; 2374 LHS_AUDIOIN_ERROR audio_status; 2375 2376 stop_status = 0; 2377 audio_status = lhs_audioinStop ( audio_input_handle ); 2378 2379 if ( audio_status == LHS_AUDIOIN_OK ) 2380 { 2381 LPRINTF ( L("\n!!!!!! Audio Stopped !!!!!!....\n") ); 2382 } 2383 else 2384 { 2385 stop_status = -1; 2386 /* Log Here */ 2387 } 2388 return ( stop_status ); 2389 } 2390 2391 2392int srec_test_get_audio_from_live_input ( ApplicationData *data, AUDIOIN_H audio_input_handle, ESR_BOOL *hit_eof ) 2393 { 2394 int get_status; 2395 LHS_AUDIOIN_ERROR audio_status; 2396 AUDIOIN_INFO input_status; 2397 unsigned long data__num_samples_read; 2398 2399 get_status = 0; 2400 *hit_eof = ESR_FALSE; 2401 data->num_samples_read = data->audio_buffer_requested_size; 2402 data__num_samples_read = data->num_samples_read; 2403 audio_status = lhs_audioinGetSamples ( audio_input_handle, &data__num_samples_read, data->audio_buffer, &input_status ); 2404 data->num_samples_read = (unsigned int)data__num_samples_read; 2405 2406 if ( audio_status == LHS_AUDIOIN_OK ) 2407 { 2408 if ( data->num_samples_read == 0 ) 2409 *hit_eof = ESR_TRUE; 2410 } 2411 else 2412 { 2413 get_status = -1; 2414 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, "Audio Device Failed To Read" ); 2415 } 2416 return ( get_status ); 2417 } 2418 2419 2420 2421static int srec_test_recognize_live ( SR_Grammar *active_grammar, ApplicationData *data, AUDIOIN_H audio_input_handle, FILE *results_file, size_t *recognition_count ) 2422 { 2423 int recognize_status; 2424 ESR_ReturnCode esr_status; 2425 SR_RecognizerStatus esr_recog_status; 2426 SR_RecognizerResultType result_type; 2427 ESR_BOOL hit_eof; 2428 2429 if ( active_grammar != NULL ) 2430 { 2431 recognize_status = srec_test_start_audio ( audio_input_handle ); 2432 2433 if ( recognize_status == 0 ) 2434 { 2435 if ( ( data->forced_rec_mode == ForcedRecModeOn ) || ( data->forced_rec_mode == ForcedRecModeOneTime ) ) 2436 SR_GrammarAllowOnly ( active_grammar, data->transcription ); 2437 esr_status = SR_RecognizerStart ( data->recognizer ); 2438 2439 if ( esr_status == ESR_SUCCESS ) 2440 { 2441 ( *recognition_count )++; 2442 hit_eof = ESR_FALSE; 2443 2444 do 2445 { 2446 recognize_status = srec_test_get_audio_from_live_input ( data, audio_input_handle, &hit_eof ); 2447 2448 if ( recognize_status == 0 ) 2449 recognize_status = srec_test_feed_recognizer ( data, hit_eof, &esr_recog_status, &result_type ); 2450 } 2451 while ( ( hit_eof == ESR_FALSE ) && ( result_type != SR_RECOGNIZER_RESULT_TYPE_COMPLETE ) && ( recognize_status == 0 ) ); 2452 2453 if ( recognize_status == 0 ) 2454 { 2455 recognize_status = srec_test_flush_audio ( data, &esr_recog_status, &result_type ); 2456 2457 if ( recognize_status == 0 ) 2458 { 2459 recognize_status = srec_test_process_results ( data, esr_recog_status, results_file, *recognition_count ); 2460 } 2461 } 2462 } 2463 esr_status = SR_RecognizerStop ( data->recognizer ); 2464 2465 if (esr_status == ESR_SUCCESS ) 2466 { 2467 LPRINTF ( L("Recognizer has been stopped\n") ); 2468 } 2469 else 2470 { 2471 recognize_status = -1; 2472 LPRINTF ( L("Recognizer has failed to stop\n") ); 2473 } 2474 if ( data->forced_rec_mode == ForcedRecModeOneTime ) 2475 { 2476 data->forced_rec_mode = ForcedRecModeOff; 2477 SR_GrammarAllowAll ( active_grammar ); 2478 } 2479 srec_test_stop_audio ( audio_input_handle ); 2480 } 2481 } 2482 else 2483 { 2484 recognize_status = -1; 2485 /* Log Here */ 2486 } 2487 return ( recognize_status ); 2488 } 2489 2490 2491 2492#define STACK_SIZE (1024 * 200) 2493 2494#ifdef _WIN32 2495/* disable optimization for the next functions as the compiler optimizes away the assignment to mySTACK[i] */ 2496#pragma optimize("", off) 2497 2498static void initStack() 2499{ 2500 int mySTACK[STACK_SIZE]; 2501 { 2502 /* This extra block is to ensure that local variables of the function occur after buffer mySTACK. */ 2503 int i; 2504 2505 for (i = 0; i < STACK_SIZE; ++i) 2506 { 2507 mySTACK[i] = 0xDEADBEEF; 2508 } 2509 } 2510} 2511 2512static int analyzeStack() 2513{ 2514 int mySTACK[STACK_SIZE]; 2515 { 2516 2517 /* This extra block is to ensure that local variables of the function occur after buffer mySTACK. */ 2518 int i, j; 2519 2520 for (i = STACK_SIZE - 1; i >= 0; --i) 2521 { 2522 if (mySTACK[i] == 0xDEADBEEF) 2523 { 2524 /* This might be a candidate for the end of stack marker, or it could be 2525 some value that is equal to our marker. To ensure reliability of 2526 this candidate, we will make sure that all remaining entries int the 2527 stack are also equal to DEADBEEF. 2528 */ 2529 for (j = i - 1; j >= 0; --j) 2530 { 2531 if (mySTACK[j] != 0xDEADBEEF) 2532 { 2533 i = j; 2534 break; 2535 } 2536 } 2537 if (j < 0) break; 2538 } 2539 } 2540 2541 if (i < 0) 2542 return -1; 2543 else 2544 return (STACK_SIZE - 1 - i) * sizeof(int); 2545 } 2546} 2547 2548/* restore optmization settings to what they used to be. */ 2549#pragma optimize("", on) 2550#endif 2551 2552 2553#ifdef ACCURACY_TESTING 2554static void srec_test_clean_up_sentence ( char* sentence ) 2555 { 2556 int clean_up_status; 2557 int sentence_finished; 2558 SENTENCE_CLEANING_STATES current_state; 2559 char *current_input; 2560 char *current_output; 2561 2562 clean_up_status = 0; 2563 sentence_finished = 0; 2564 current_state = SENTENCE_BEGIN; 2565 current_input = sentence; 2566 current_output = sentence; 2567 2568 do 2569 { 2570 switch ( *current_input ) 2571 { 2572 case '\0': 2573 switch ( current_state ) 2574 { 2575 case SENTENCE_BEGIN: 2576 break; 2577 2578 case SENTENCE_BEGIN_BRACKET_BEGIN: /* Is this error condition */ 2579 *current_output = '\0'; 2580 clean_up_status = -1; 2581 break; 2582 2583 case SENTENCE_BEGIN_BRACKET_END: 2584 *current_output = '\0'; 2585 break; 2586 2587 case SENTENCE_MIDDLE: 2588 *current_output = '\0'; 2589 break; 2590 2591 case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */ 2592 *( current_output - 1 ) = '\0'; 2593 clean_up_status = -1; 2594 break; 2595 2596 case SENTENCE_MIDDLE_BRACKET_END: 2597 *( current_output - 1 ) = '\0'; 2598 break; 2599 2600 case SENTENCE_MIDDLE_WITH_SPACE: 2601 *( current_output - 1 ) = '\0'; 2602 break; 2603 2604 default: 2605 *current_output = '\0'; 2606 /* Log error */ 2607 break; 2608 } 2609 sentence_finished = 1; 2610 break; 2611 2612 case ' ': 2613 switch ( current_state ) 2614 { 2615 case SENTENCE_BEGIN: 2616 break; 2617 2618 case SENTENCE_BEGIN_BRACKET_BEGIN: 2619 break; 2620 2621 case SENTENCE_BEGIN_BRACKET_END: 2622 break; 2623 2624 case SENTENCE_MIDDLE: 2625 *current_output = ' '; 2626 current_output++; 2627 current_state = SENTENCE_MIDDLE_WITH_SPACE; 2628 break; 2629 2630 case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */ 2631 break; 2632 2633 case SENTENCE_MIDDLE_BRACKET_END: 2634 break; 2635 2636 case SENTENCE_MIDDLE_WITH_SPACE: 2637 break; 2638 2639 default: 2640 *current_output = '\0'; 2641 clean_up_status = -1; 2642 /* Log error */ 2643 break; 2644 } 2645 current_input++; 2646 break; 2647 2648 case '[': 2649 switch ( current_state ) 2650 { 2651 case SENTENCE_BEGIN: 2652 current_state = SENTENCE_BEGIN_BRACKET_BEGIN; 2653 break; 2654 2655 case SENTENCE_BEGIN_BRACKET_BEGIN: 2656 *current_output = '\0'; 2657 clean_up_status = -1; 2658 /* Log error */ 2659 break; 2660 2661 case SENTENCE_BEGIN_BRACKET_END: 2662 current_state = SENTENCE_BEGIN_BRACKET_BEGIN; 2663 break; 2664 2665 case SENTENCE_MIDDLE: 2666 *current_output = ' '; 2667 current_output++; 2668 current_state = SENTENCE_MIDDLE_BRACKET_BEGIN; 2669 break; 2670 2671 case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */ 2672 *current_output = '\0'; 2673 clean_up_status = -1; 2674 /* Log error */ 2675 break; 2676 2677 case SENTENCE_MIDDLE_BRACKET_END: 2678 current_state = SENTENCE_MIDDLE_BRACKET_BEGIN; 2679 break; 2680 2681 case SENTENCE_MIDDLE_WITH_SPACE: 2682 current_state = SENTENCE_MIDDLE_BRACKET_BEGIN; 2683 break; 2684 2685 default: 2686 *current_output = '\0'; 2687 clean_up_status = -1; 2688 /* Log error */ 2689 break; 2690 } 2691 current_input++; 2692 break; 2693 2694 case ']': 2695 switch ( current_state ) 2696 { 2697 case SENTENCE_BEGIN: 2698 *current_output = '\0'; 2699 clean_up_status = -1; 2700 /* Log error */ 2701 break; 2702 2703 case SENTENCE_BEGIN_BRACKET_BEGIN: 2704 current_state = SENTENCE_BEGIN_BRACKET_END; 2705 break; 2706 2707 case SENTENCE_BEGIN_BRACKET_END: 2708 *current_output = '\0'; 2709 clean_up_status = -1; 2710 /* Log error */ 2711 break; 2712 2713 case SENTENCE_MIDDLE: 2714 *current_output = '\0'; 2715 clean_up_status = -1; 2716 /* Log error */ 2717 break; 2718 2719 case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */ 2720 current_state = SENTENCE_MIDDLE_BRACKET_END; 2721 break; 2722 2723 case SENTENCE_MIDDLE_BRACKET_END: 2724 *current_output = '\0'; 2725 clean_up_status = -1; 2726 /* Log error */ 2727 break; 2728 2729 case SENTENCE_MIDDLE_WITH_SPACE: 2730 *current_output = '\0'; 2731 clean_up_status = -1; 2732 /* Log error */ 2733 break; 2734 2735 default: 2736 *current_output = '\0'; 2737 clean_up_status = -1; 2738 /* Log error */ 2739 break; 2740 } 2741 current_input++; 2742 break; 2743 2744 default: 2745 switch ( current_state ) 2746 { 2747 case SENTENCE_BEGIN: 2748 *current_output = *current_input; 2749 current_output++; 2750 current_state = SENTENCE_MIDDLE; 2751 break; 2752 2753 case SENTENCE_BEGIN_BRACKET_BEGIN: 2754 break; 2755 2756 case SENTENCE_BEGIN_BRACKET_END: 2757 *current_output = *current_input; 2758 current_output++; 2759 current_state = SENTENCE_MIDDLE; 2760 break; 2761 2762 case SENTENCE_MIDDLE: 2763 *current_output = *current_input; 2764 current_output++; 2765 current_state = SENTENCE_MIDDLE; 2766 break; 2767 2768 case SENTENCE_MIDDLE_BRACKET_BEGIN: 2769 break; 2770 2771 case SENTENCE_MIDDLE_BRACKET_END: 2772 *current_output = *current_input; 2773 current_output++; 2774 current_state = SENTENCE_MIDDLE; 2775 break; 2776 2777 case SENTENCE_MIDDLE_WITH_SPACE: 2778 *current_output = *current_input; 2779 current_output++; 2780 current_state = SENTENCE_MIDDLE; 2781 break; 2782 2783 default: 2784 *current_output = '\0'; 2785 clean_up_status = -1; 2786 /* Log error */ 2787 break; 2788 } 2789 current_input++; 2790 break; 2791 } 2792 } 2793 while ( ( sentence_finished == 0 ) && ( clean_up_status == 0 ) ); 2794 } 2795 2796 2797 2798ESR_ReturnCode srec_test_parse ( SR_Grammar* grammar, const LCHAR* trans, LCHAR* meaning, size_t *len ) 2799 { 2800 ESR_ReturnCode parse_status; 2801 char cleaned_trans[TRANSCRIPTION_SIZE]; 2802 SR_SemanticResult *semanticResults; 2803 size_t result_count; 2804 2805 result_count = 0; 2806 strcpy( cleaned_trans, trans ); 2807 srec_test_clean_up_sentence ( cleaned_trans ); 2808 2809 /* create the result holders, initially not greater than MAX */ 2810 parse_status = SR_SemanticResultCreate ( &semanticResults ); 2811 2812 if ( parse_status == ESR_SUCCESS ) 2813 { 2814 result_count = 1; 2815 parse_status = SR_SemanticProcessor_Flush( ( (SR_GrammarImpl*)grammar )->semproc ); 2816 2817 if ( parse_status == ESR_SUCCESS ) 2818 { 2819 parse_status = SR_SemanticProcessor_SetParam( ((SR_GrammarImpl*)grammar)->semproc, L("literal"), cleaned_trans ); 2820 2821 if ( parse_status == ESR_SUCCESS ) 2822 { 2823 parse_status = grammar->checkParse ( grammar, cleaned_trans, &semanticResults, (size_t*)&result_count ); 2824 2825 if ( parse_status == ESR_SUCCESS ) 2826 { 2827 if ( result_count < 1 ) 2828 { 2829 LSTRCPY ( meaning, L("") ); 2830 SR_SemanticResultDestroy( semanticResults); 2831 parse_status = ESR_NO_MATCH_ERROR; 2832 } 2833 else 2834 { 2835 parse_status = semanticResults->getValue ( semanticResults, "meaning", meaning, len); 2836 SR_SemanticResultDestroy( semanticResults); 2837 } 2838 } 2839 } 2840 } 2841 } 2842 return ( parse_status ); 2843 } 2844#endif 2845 2846 2847static int srec_test_get_run_params ( unsigned int *num_shutdown_loops, unsigned int *num_continuous_run_loops ) 2848 { 2849 int get_status; 2850 2851 get_status = get_num_srec_test_shutdown_times ( num_shutdown_loops ); 2852 2853 if ( get_status == 0 ) 2854 get_status = get_num_srec_test_continuous_loops ( num_continuous_run_loops ); 2855 2856 return ( get_status ); 2857 } 2858 2859 2860 2861static int srec_test_shutdown_application_data ( ApplicationData *applicationData ) 2862 { 2863 int init_status; 2864 int i; 2865 2866 init_status = 0; 2867 2868 applicationData->argc = 0; 2869 applicationData->argv = NULL; 2870 applicationData->outputLog = PSTDOUT; // may need to check if non PSTDOUT or non PSTDERROR 2871 applicationData->locale = -1; 2872 2873 if (applicationData->recognizer != NULL) 2874 { 2875 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Recognizer") ); 2876/* SR_RecognizerLogSessionEnd ( applicationData->recognizer ); 2877 SR_RecognizerDestroy ( applicationData->recognizer );*/ 2878 applicationData->recognizer = NULL; 2879 applicationData->result = NULL; // this was deallocated by SR_RecognizerDestroy() 2880 } 2881 2882 if (applicationData->vocabulary != NULL) 2883 { 2884 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Vocabulary") ); 2885/* SR_VocabularyDestroy(applicationData->vocabulary); 2886 applicationData->vocabulary = NULL;*/ 2887 } 2888 2889 2890 if (applicationData->nametag != NULL) 2891 { 2892 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup NameTag") ); 2893/* SR_NametagDestroy(applicationData->nametag); 2894 applicationData->nametag = NULL;*/ 2895 } 2896 2897 if (applicationData->nametags != NULL) 2898 { 2899 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup NameTagSet") ); 2900/* SR_NametagsDestroy(applicationData->nametags); 2901 applicationData->nametags = NULL;*/ 2902 } 2903 2904 for (i = 0; i < applicationData->grammarCount; ++i) 2905 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Grammar") ); 2906/* 2907 if ( applicationData->grammars [i] != NULL ) 2908 { 2909 printf ( "!!!!!!!! %d Grammars Not Destroyed !!!!!!!!!!!!\n", i ); 2910 SR_GrammarDestroy(applicationData->grammars[i]); 2911 applicationData->grammars[i] = NULL; 2912 } 2913 } 2914 2915 applicationData->activeGrammar = -1; 2916 applicationData->activeRule = NULL; 2917 applicationData->voiceEnrollment = NULL; 2918*/ 2919 applicationData->raw_waveform = NULL; 2920 applicationData->raw_waveform_filename [0] = L( '\0' ); 2921 applicationData->raw_waveform_file = NULL; 2922 applicationData->transcription[0] = L( '\0' ); 2923 applicationData->forced_rec_mode = ForcedRecModeNotSet; 2924 2925 return ( init_status ); 2926 } 2927 2928 2929 2930static int srec_test_init_application_data ( ApplicationData *applicationData, int arg_count, LCHAR *arg_vals [] ) 2931 { 2932 int init_status; 2933 2934 init_status = 0; 2935 applicationData->argc = arg_count; 2936 applicationData->argv = arg_vals; 2937 applicationData->outputLog = PSTDOUT; 2938 applicationData->locale = -1; 2939 applicationData->recognizer = NULL; 2940 applicationData->result = NULL; 2941 applicationData->vocabulary = NULL; 2942 applicationData->nametag = NULL; 2943 applicationData->nametags = NULL; 2944 applicationData->grammarCount = 0; /* No need to initialize arrays, index is 0 */ 2945 applicationData->active_grammar_num = -1; 2946/* applicationData->activeRule = NULL; 2947 applicationData-> = applicationData->voiceEnrollment = NULL;*/ 2948 applicationData->audio_buffer_requested_size = DEFAULT_AUDIO_BUFFER_SIZE; 2949 applicationData->raw_waveform = NULL; 2950 applicationData->raw_waveform_filename [0] = L( '\0' ); 2951 applicationData->raw_waveform_file = NULL; 2952 applicationData->transcription[0] = L( '\0' ); 2953 applicationData->forced_rec_mode = ForcedRecModeNotSet; 2954 return ( init_status ); 2955 } 2956 2957 2958static int srec_test_run_test_shutdown_session ( ApplicationData *applicationData ) 2959 { 2960 int shutdown_status; 2961 2962 shutdown_status = 0; 2963 2964 SR_RecognizerUnsetup ( applicationData->recognizer); // releases acoustic models 2965 SR_RecognizerDestroy ( applicationData->recognizer ); 2966 applicationData->recognizer = NULL; 2967 ShutdownSession ( ); 2968 2969 return ( shutdown_status ); 2970 } 2971 2972 2973 2974static int srec_test_run_test_init_session ( ApplicationData *applicationData ) 2975{ 2976 int run_status; 2977 ESR_ReturnCode esr_status; 2978 2979 run_status = 0; 2980 LPRINTF(L("\nCreate recognizer:\n")); 2981 LPRINTF(L(" InitSession()\n")); 2982 esr_status = InitSession ( applicationData->argc, applicationData->argv ); 2983 2984 if ( esr_status == ESR_SUCCESS ) 2985 { 2986 LPRINTF(L(" SR_RecognizerCreate()\n")); 2987 esr_status = SR_RecognizerCreate ( &applicationData->recognizer ); 2988 2989 if ( esr_status != ESR_SUCCESS ) 2990 { 2991 ShutdownSession ( ); 2992 run_status = -1; 2993 /* Log Here */ 2994 } else { 2995 LPRINTF(L(" SR_RecognizerSetup()\n")); 2996 esr_status = SR_RecognizerSetup ( applicationData->recognizer); 2997 if ( esr_status != ESR_SUCCESS ) 2998 { 2999 ShutdownSession ( ); 3000 run_status = -1; 3001 /* Log Here */ 3002 } 3003 } 3004 } 3005 return ( run_status ); 3006} 3007 3008 3009static int srec_test_run_test_shutdown_vocab_grammar ( ApplicationData *applicationData ) 3010 { 3011 int shutdown_status; 3012 3013 shutdown_status = 0; 3014 SR_RecognizerLogSessionEnd ( applicationData->recognizer ); 3015/* SR_GrammarDestroy ( applicationData->grammars [0].grammar ); 3016 applicationData->grammars [0].grammar = NULL;*/ 3017 SR_VocabularyDestroy ( applicationData->vocabulary ); 3018 applicationData->vocabulary = NULL; 3019 3020 return ( shutdown_status ); 3021 } 3022 3023 3024 3025static int srec_test_run_test_init_vocab_grammar ( ApplicationData *applicationData ) 3026 { 3027 int run_status; 3028 ESR_ReturnCode esr_status; 3029 LCHAR filename[P_PATH_MAX]; 3030 size_t len; 3031 3032 run_status = 0; 3033 /* Create vocabulary object and associate with grammar */ 3034 LPRINTF(L("Create vocabulary object and associate with grammar:\n")); 3035 len = P_PATH_MAX; 3036 esr_status = ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), filename, &len ); 3037 3038 if ( esr_status == ESR_SUCCESS ) 3039 { 3040 LPRINTF(L(" SR_VocabularyLoad()\n")); 3041 esr_status = SR_VocabularyLoad ( filename, &applicationData->vocabulary ); 3042 3043 if ( esr_status == ESR_SUCCESS ) 3044 { 3045 LPRINTF(L(" SR_VocabularyGetLanguage()\n")); 3046 esr_status = SR_VocabularyGetLanguage ( applicationData->vocabulary, &applicationData->locale ); 3047 3048 if ( esr_status == ESR_SUCCESS ) 3049 { 3050 /* start a new log session */ 3051 LPRINTF( L("Start a new log session:\n") ); 3052 LPRINTF( L(" SR_RecognizerLogSessionStart()\n") ); 3053 esr_status = SR_RecognizerLogSessionStart ( applicationData->recognizer, L("SRecTest.session1") ); 3054 3055 if ( esr_status != ESR_SUCCESS ) 3056 { 3057 SR_VocabularyDestroy ( applicationData->vocabulary ); 3058 applicationData->vocabulary = NULL; 3059 run_status = -1; 3060 /* Log here */ 3061 } 3062 } 3063 else 3064 { 3065 SR_VocabularyDestroy ( applicationData->vocabulary ); 3066 applicationData->vocabulary = NULL; 3067 run_status = -1; 3068 /* Log Here */ 3069 } 3070 } 3071 else 3072 { 3073 run_status = -1; 3074 /* Log Here */ 3075 } 3076 } 3077 else 3078 { 3079 run_status = -1; 3080 /* Log Here */ 3081 } 3082 return ( run_status ); 3083 } 3084 3085 3086 3087static int srec_test_run_test_shutdown ( ApplicationData *applicationData ) 3088 { 3089 int shutdown_status; 3090 3091 shutdown_status = srec_test_run_test_shutdown_vocab_grammar ( applicationData ); 3092 3093 if ( shutdown_status == 0 ) 3094 { 3095 shutdown_status = srec_test_run_test_shutdown_session ( applicationData ); 3096 } 3097 return ( shutdown_status ); 3098 } 3099 3100 3101static int srec_test_run_test_init ( ApplicationData *applicationData ) 3102{ 3103 int run_status; 3104 3105 run_status = srec_test_run_test_init_session ( applicationData ); 3106 3107 if ( run_status == 0 ) 3108 { 3109 run_status = srec_test_run_test_init_vocab_grammar ( applicationData ); 3110 3111 if ( run_status != 0 ) 3112 { 3113 srec_test_run_test_shutdown_session ( applicationData ); 3114 } 3115 } 3116 else 3117 { 3118 srec_test_run_test_shutdown_session ( applicationData ); 3119 } 3120 return ( run_status ); 3121} 3122 3123 3124static int srec_test_run_test_execute ( ApplicationData *applicationData, AUDIOIN_H audio_input_handle ) 3125 { 3126 int run_status; 3127 ESR_ReturnCode esr_status; 3128 3129 run_status = 0; 3130 applicationData->nametag = NULL; 3131 3132 LPRINTF(L("Recognize:\n")); 3133 LPRINTF(L(" SR_NametagsCreate()\n")); 3134 esr_status = SR_NametagsCreate ( &applicationData->nametags ); 3135 3136 if ( esr_status == ESR_SUCCESS ) 3137 { 3138 run_status = srec_test_process_commands ( applicationData, audio_input_handle ); 3139 SR_NametagsDestroy ( applicationData->nametags ); 3140 applicationData->nametags = NULL; 3141 3142 if ( run_status != 0 ) 3143 { 3144 /* Log Here */ 3145 } 3146 } 3147 else 3148 { 3149 run_status = -1; 3150 /* Log Here */ 3151 } 3152 return ( run_status ); 3153 } 3154 3155 3156 3157static int srec_test_run_test ( ApplicationData *applicationData, AUDIOIN_H audio_input_handle ) 3158 { 3159 int run_status; 3160 3161 run_status = srec_test_run_test_init ( applicationData ); 3162 3163 if ( run_status == 0 ) 3164 { 3165 run_status = srec_test_run_test_execute ( applicationData, audio_input_handle ); 3166 srec_test_run_test_shutdown ( applicationData ); 3167 } 3168 return ( run_status ); 3169 } 3170 3171 3172 3173static int srec_test_shutdown_memory_system ( void ) 3174 { 3175 int shutdown_status; 3176 3177 shutdown_status = 0; 3178 PMemShutdown ( ); 3179 3180 return ( shutdown_status ); 3181 } 3182 3183 3184 3185static int srec_test_init_memory_system ( unsigned int srec_test_heap_size ) 3186 { 3187 int init_status; 3188 ESR_ReturnCode esr_status; 3189 3190 init_status = 0; 3191 esr_status = PMemInit ( ); 3192 3193 if ( esr_status == ESR_SUCCESS ) 3194 { 3195 PSTACK_SIZE_INIT ( ); /* I don't know what this is, it should probably have a status */ 3196 } 3197 else 3198 { 3199 init_status = -1; 3200 /* Log Here */ 3201 } 3202 return ( init_status ); 3203 } 3204 3205 3206 3207static int srec_test_shutdown_file_system ( void ) 3208 { 3209 int shutdown_status; 3210 3211 shutdown_status = 0; 3212 3213 return ( shutdown_status ); 3214 } 3215 3216 3217 3218static int srec_test_init_file_system ( int arg_count, LCHAR *arg_vals [] ) 3219 { 3220 int init_status; 3221 3222 init_status = 0; 3223 return ( init_status ); 3224 } 3225 3226 3227 3228static int srec_test_shutdown_logging_system ( PLogger *logger ) 3229 { 3230 int shutdown_status; 3231 3232 shutdown_status = 0; 3233 PLogShutdown ( ); 3234 3235 return ( shutdown_status ); 3236 } 3237 3238 3239 3240static int srec_test_init_logging_system ( int arg_count, LCHAR *arg_vals [], PLogger *logger ) 3241 { 3242 int init_status; 3243 ESR_ReturnCode esr_status; 3244 3245 init_status = 0; 3246 esr_status = PLogCreateFileLogger ( PSTDOUT, &logger ); 3247 3248 if ( esr_status == ESR_SUCCESS ) 3249 { 3250 esr_status = PLogInit ( logger, 0 ); 3251 3252 if ( esr_status != ESR_SUCCESS ) 3253 { 3254/* pfclose ( (struct PFile_t *)logger ); I'm not sure this is correct, check with Gili */ 3255 init_status = -1; 3256 /* Log Here */ 3257 } 3258 } 3259 else 3260 { 3261 init_status = -1; 3262 /* Log Here */ 3263 } 3264 return ( init_status ); 3265 } 3266 3267 3268 3269static int srec_test_init_audio_input ( AUDIOIN_H *audio_input_handle ) 3270 { 3271 int init_status; 3272 LHS_AUDIOIN_ERROR audio_status; 3273 3274 init_status = 0; 3275 audio_status = lhs_audioinOpen ( WAVE_MAPPER, SREC_TEST_DEFAULT_AUDIO_FREQUENCY, audio_input_handle ); 3276 3277 if ( audio_status != LHS_AUDIOIN_OK ) 3278 { 3279 init_status = -1; 3280 srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, "Audio Device Failed To Open" ); 3281 } 3282 return ( init_status ); 3283 } 3284 3285 3286 3287static int srec_test_shutdown_audio_input ( AUDIOIN_H *audio_input_handle ) 3288 { 3289 int shutdown_status; 3290 LHS_AUDIOIN_ERROR audio_status; 3291 3292 shutdown_status = 0; 3293 audio_status = lhs_audioinClose ( audio_input_handle ); 3294 3295 if ( audio_status != LHS_AUDIOIN_OK ) 3296 { 3297 shutdown_status = -1; 3298 /* Log Here */ 3299 } 3300 return ( shutdown_status ); 3301 } 3302 3303 3304 3305static int srec_test_shutdown_system ( PLogger *logger, AUDIOIN_H *audio_input_handle ) 3306 { 3307 int shutdown_status; 3308 3309 shutdown_status = srec_test_shutdown_audio_input ( audio_input_handle ); 3310 3311 if ( shutdown_status == 0 ) 3312 { 3313 shutdown_status = srec_test_shutdown_logging_system ( logger ); 3314 3315 if ( shutdown_status == 0 ) 3316 { 3317 shutdown_status = srec_test_shutdown_file_system ( ); 3318 3319 if ( shutdown_status == 0 ) 3320 shutdown_status = srec_test_shutdown_memory_system ( ); 3321 } 3322 } 3323 return ( shutdown_status ); 3324 } 3325 3326 3327 3328 3329static int srec_test_init_system ( unsigned int srec_test_heap_size, PLogger* logger, int arg_count, LCHAR *arg_vals [], AUDIOIN_H *audio_input_handle ) 3330 { 3331 int init_status; 3332 3333 /* register signal handler so cleanup works on CTRL-C (Win32) */ 3334#ifdef _WIN32 3335 signal(SIGINT, signal_handler_SIGINT); 3336#endif 3337 init_status = srec_test_init_memory_system ( srec_test_heap_size ); 3338 3339 if ( init_status == 0 ) 3340 { 3341 init_status = srec_test_init_file_system ( arg_count, arg_vals ); 3342 3343 if ( init_status == 0 ) 3344 { 3345 init_status = srec_test_init_logging_system ( arg_count, arg_vals, logger ); 3346 3347 if ( init_status == 0 ) 3348 { 3349 init_status = srec_test_init_audio_input ( audio_input_handle ); 3350 3351 if ( init_status != 0 ) 3352 { 3353 srec_test_shutdown_logging_system ( logger ); 3354 srec_test_shutdown_file_system ( ); 3355 srec_test_shutdown_memory_system ( ); 3356 } 3357 } 3358 else 3359 { 3360 srec_test_shutdown_file_system ( ); 3361 srec_test_shutdown_memory_system ( ); 3362 } 3363 } 3364 else 3365 { 3366 srec_test_shutdown_memory_system ( ); 3367 } 3368 } 3369 return ( init_status ); 3370 } 3371 3372 3373 3374#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3375_CrtMemState s0,s1,s2; 3376 3377 3378 3379void OutputDivider( void ) 3380 { 3381 3382 _RPT1(_CRT_WARN, "%s", "********************************************************************\n"); 3383 } 3384 3385 3386 3387void OutputNewline( void ) 3388 { 3389 3390 _RPT1(_CRT_WARN, "%s", "\n"); 3391 } 3392#endif 3393 3394 3395 3396#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3397void initialize_heap_logging ( void ) 3398 { 3399 3400 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); 3401 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT); 3402 _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); 3403 _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT); 3404 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); 3405 _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT); 3406 _CrtMemCheckpoint(&s0); 3407 } 3408#endif 3409 3410 3411 3412#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3413void execute_heap_logging ( void ) 3414 { 3415 OutputNewline(); 3416 OutputDivider(); 3417 _RPT1(_CRT_WARN, "%s", "After cleanup, before exiting main()\n"); 3418 OutputDivider(); 3419 _CrtMemCheckpoint(&s1); 3420 _CrtMemDifference(&s2, &s0, &s1); 3421 _CrtMemDumpStatistics(&s2); 3422 OutputNewline(); 3423 OutputDivider(); 3424 _RPT1(_CRT_WARN, "%s", "Checking for memory leaks...\n"); 3425 OutputDivider(); 3426 _CrtDumpMemoryLeaks(); 3427 } 3428#endif 3429 3430 3431 3432int main(int argc, LCHAR* argv [] ) 3433 { 3434 int test_status; 3435 unsigned int num_shutdown_loops; 3436 unsigned int current_shutdown_loop; 3437 unsigned int num_continuous_run_loops; 3438 unsigned int current_continuous_run_loop; 3439 unsigned int srec_test_heap_size; 3440 3441#ifdef _WIN32 3442 initStack(); 3443#endif 3444 { 3445 /* This extra block is there to get a more precise estimate of the stack 3446 depth. This way we also make sure that the local variables of main are 3447 taken into acount when estimating the stack size. 3448 */ 3449 ApplicationData applicationData; 3450 PLogger *logger; 3451 AUDIOIN_H audio_in_handle; 3452 3453 srec_test_heap_size = ( 4 * 1024 * 1024 ); 3454 logger = NULL; 3455 test_status = srec_test_get_run_params ( &num_shutdown_loops, &num_continuous_run_loops ); 3456 3457 if ( test_status == 0 ) 3458 { 3459 current_shutdown_loop = 0; 3460 3461 while ( ( current_shutdown_loop < num_shutdown_loops )/* && ( test_status == 0 )*/ ) 3462 { 3463#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3464 initialize_heap_logging ( ); 3465#endif 3466 test_status = srec_test_init_system ( srec_test_heap_size, logger, argc, argv, &audio_in_handle ); 3467 3468 if ( test_status == 0 ) 3469 { 3470 current_continuous_run_loop = 0; 3471 3472 while ( ( current_continuous_run_loop < num_continuous_run_loops ) && ( test_status == 0 ) ) 3473 { 3474 test_status = srec_test_init_application_data ( &applicationData, argc, argv ); 3475 3476 if ( test_status == 0 ) 3477 { 3478 test_status = srec_test_run_test ( &applicationData, audio_in_handle ); 3479 srec_test_shutdown_application_data ( &applicationData ); 3480 } 3481 current_continuous_run_loop++; 3482 } 3483 test_status = srec_test_shutdown_system ( logger, &audio_in_handle ); 3484 } 3485 current_shutdown_loop++; 3486#if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3487 execute_heap_logging ( ); 3488#endif 3489 } 3490 } 3491 } 3492 3493 return ( test_status ); 3494 } 3495 3496 3497