14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * c47mulsp.c * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _RTT 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pstdio.h" 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "c42mul.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec_context.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec.h" 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint add_acoustic_model_for_recognition(multi_srec* recm, const SWIModel* model) 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (recm->num_swimodels >= MAX_ACOUSTIC_MODELS) 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_report("Error: recognizer can't hold any more acoustic models\n"); 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (recm->num_activated_recs >= recm->num_allocated_recs) 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_report("Error: too few recognizers allocated\n"); 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (recm->rec[0].num_model_slots_allocated < model->num_hmmstates) 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError("recognizer max_model_states %d, acoustic model num states %d, set CREC.Recognizer.max_model_states higher\n", 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->rec[0].num_model_slots_allocated, 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project model->num_hmmstates); 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->swimodel[ recm->num_swimodels] = model; 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->num_swimodels++; 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->num_activated_recs++; 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint clear_acoustic_models_for_recognition(multi_srec* recm) 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->num_swimodels = 0; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->num_activated_recs = 0; 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid begin_recognition(multi_srec *recm, int begin_syn_node) 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i = 0; 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DO_ALLOW_MULTIPLE_MODELS 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(recm->num_activated_recs == recm->num_swimodels); 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < recm->num_activated_recs; i++) 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project srec_begin(&recm->rec[i], begin_syn_node); 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0;i < recm->max_fsm_nodes;i++) 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->best_token_for_node[i] = MAXftokenID; 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->eos_status = VALID_SPEECH_CONTINUING; 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid end_recognition(multi_srec *recm) 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project** To free space allocated for recognizer variables 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/ 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i = 0; 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DO_ALLOW_MULTIPLE_MODELS 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < recm->num_activated_recs; i++) 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project srec_no_more_frames(&recm->rec[i]); 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* srec_get_result(rec); */ 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint activate_grammar_for_recognition(multi_srec* recm, srec_context* grammar, const char* rule) 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project srec_context* context = grammar; 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project context->max_searchable_nodes = recm->max_fsm_nodes; 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project context->max_searchable_arcs = recm->max_fsm_arcs; 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (context->max_searchable_nodes < context->num_nodes || context->max_searchable_arcs < context->num_arcs) 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("Error: context switch failed due to search limitations [arcs max=%d, actual=%d], [nodes max=%d, actual=%d]\n"), 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project context->max_searchable_arcs, context->num_arcs, 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project context->max_searchable_nodes, context->num_nodes); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i, rc = 0; 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < recm->num_allocated_recs; i++) 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->rec[i].context = context; 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = FST_PrepareContext(context); 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc) 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint clear_grammars_for_recognition(multi_srec* recm) 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < recm->num_allocated_recs; i++) 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recm->rec[i].context = NULL; 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 135