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