1 /*---------------------------------------------------------------------------* 2 * c47mulsp.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 #ifndef _RTT 21 #include "pstdio.h" 22 #endif 23 #include "passert.h" 24 25 #include "c42mul.h" 26 #include "portable.h" 27 #include "srec_context.h" 28 #include "srec.h" 29 30 int add_acoustic_model_for_recognition(multi_srec* recm, const SWIModel* model) 31 { 32 if (recm->num_swimodels >= MAX_ACOUSTIC_MODELS) 33 { 34 log_report("Error: recognizer can't hold any more acoustic models\n"); 35 return 0; 36 } 37 if (recm->num_activated_recs >= recm->num_allocated_recs) 38 { 39 log_report("Error: too few recognizers allocated\n"); 40 return 0; 41 } 42 43 if (recm->rec[0].num_model_slots_allocated < model->num_hmmstates) 44 { 45 PLogError("recognizer max_model_states %d, acoustic model num states %d, set CREC.Recognizer.max_model_states higher\n", 46 recm->rec[0].num_model_slots_allocated, 47 model->num_hmmstates); 48 return 0; 49 } 50 51 recm->swimodel[ recm->num_swimodels] = model; 52 recm->num_swimodels++; 53 54 recm->num_activated_recs++; 55 return 1; 56 } 57 58 int clear_acoustic_models_for_recognition(multi_srec* recm) 59 { 60 recm->num_swimodels = 0; 61 recm->num_activated_recs = 0; 62 return 0; 63 } 64 65 void begin_recognition(multi_srec *recm, int begin_syn_node) 66 { 67 int i = 0; 68 #if DO_ALLOW_MULTIPLE_MODELS 69 ASSERT(recm->num_activated_recs == recm->num_swimodels); 70 for (i = 0; i < recm->num_activated_recs; i++) 71 #endif 72 srec_begin(&recm->rec[i], begin_syn_node); 73 for (i = 0;i < recm->max_fsm_nodes;i++) 74 recm->best_token_for_node[i] = MAXftokenID; 75 recm->eos_status = VALID_SPEECH_CONTINUING; 76 } 77 78 void end_recognition(multi_srec *recm) 79 /* 80 ** To free space allocated for recognizer variables 81 */ 82 { 83 int i = 0; 84 #if DO_ALLOW_MULTIPLE_MODELS 85 for (i = 0; i < recm->num_activated_recs; i++) 86 #endif 87 srec_no_more_frames(&recm->rec[i]); 88 /* srec_get_result(rec); */ 89 } 90 91 int activate_grammar_for_recognition(multi_srec* recm, srec_context* grammar, const char* rule) 92 { 93 srec_context* context = grammar; 94 95 context->max_searchable_nodes = recm->max_fsm_nodes; 96 context->max_searchable_arcs = recm->max_fsm_arcs; 97 98 if (context->max_searchable_nodes < context->num_nodes || context->max_searchable_arcs < context->num_arcs) 99 { 100 PLogError(L("Error: context switch failed due to search limitations [arcs max=%d, actual=%d], [nodes max=%d, actual=%d]\n"), 101 context->max_searchable_arcs, context->num_arcs, 102 context->max_searchable_nodes, context->num_nodes); 103 return 1; 104 } 105 else 106 { 107 int i, rc = 0; 108 for (i = 0; i < recm->num_allocated_recs; i++) 109 recm->rec[i].context = context; 110 rc = FST_PrepareContext(context); 111 if (rc) 112 return rc; 113 else 114 return 0; 115 } 116 } 117 118 int clear_grammars_for_recognition(multi_srec* recm) 119 { 120 int i; 121 for (i = 0; i < recm->num_allocated_recs; i++) 122 { 123 recm->rec[i].context = NULL; 124 } 125 return 0; 126 } 127 128 129 130 131 132 133 134 135