14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * srec_initialize.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 <stdlib.h> 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h> 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <math.h> 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h" 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "hmm_desc.h" 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "utteranc.h" 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "hmmlib.h" 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec_sizes.h" 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec.h" 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "word_lattice.h" 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "swimodel.h" 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "c42mul.h" 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*this file contains code which handles the initialization of the srec data structures*/ 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*allocates an srec - 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectinput args come from config and are: 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int viterbi_prune_thresh; score-based pruning threshold - only keep paths within this delta of best cost 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_hmm_tokens; controls the maximum number of HMM's alive in any frame. If number 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project exceeded, pruning gets tightened. So, this threshold can be used 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project to tradeoff accuracy for computation an memory 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_fsmnode_tokens; controls the maximum number of FSMs alive in any frame. If number, 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project exceeded, pruning gets tightened. So, this threshold can be used 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project to tradeoff accuracy for computation an memory 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_word_tokens; controls the maximum number of word tokens kept in the word lattice. 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if number exceeded, the word lattice is pruned more tightly (less word 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ends per frame 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_altword_tokens; controls the maximum number of alternative paths to propagate for proper nbest 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int num_wordends_per_frame; controls the size of the word lattice - the number of word ends to 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project keep at each time frame 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_fsm_nodes; allocation size of a few arrays in the search - needs to be big enough 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project to handle any grammar that the search needs to run. Initialization fails 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if num exceeded 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_fsm_arcs; allocation size of a few arrays in the search - needs to be big enough 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project to handle any grammar that the search needs to run. Initialization fails 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if num exceeded 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/ 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void allocate_recognition1(srec *rec, 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int viterbi_prune_thresh, /*score-based pruning threshold - only keep paths within this delta of best cost*/ 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_hmm_tokens, 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_fsmnode_tokens, 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_word_tokens, 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_altword_tokens, 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int num_wordends_per_frame, 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_frames, 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_model_states) 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage("allocating recognition arrays2 prune %d max_hmm_tokens %d max_fsmnode_tokens %d max_word_tokens %d max_altword_tokens %d max_wordends_per_frame %d\n", 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project viterbi_prune_thresh, 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project max_hmm_tokens, 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project max_fsmnode_tokens, 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project max_word_tokens, 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project max_altword_tokens, 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_wordends_per_frame); 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->current_model_scores = (costdata*) CALLOC_CLR(max_model_states, sizeof(costdata), "search.srec.current_model_scores"); /*FIX - either get NUM_MODELS from acoustic models, or check this someplace to make sure we have enough room*/ 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->num_model_slots_allocated = (modelID)max_model_states; 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->fsmarc_token_array_size = (stokenID)max_hmm_tokens; 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->fsmarc_token_array = (fsmarc_token*) CALLOC_CLR(rec->fsmarc_token_array_size , sizeof(fsmarc_token), "search.srec.fsmarc_token_array"); 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->max_new_states = (stokenID)max_hmm_tokens; 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->word_token_array = (word_token*) CALLOC_CLR(max_word_tokens, sizeof(word_token), "search.srec.word_token_array"); 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->word_token_array_size = (wtokenID)max_word_tokens; 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* todo: change this to a bit array later */ 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->word_token_array_flags = (asr_int16_t*) CALLOC_CLR(max_word_tokens, sizeof(asr_int16_t), "search.srec.word_token_array_flags"); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->fsmnode_token_array = (fsmnode_token*) CALLOC_CLR(max_fsmnode_tokens, sizeof(fsmnode_token), "search.srec.fsmnode_token_array"); 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->fsmnode_token_array_size = (ftokenID)max_fsmnode_tokens; 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->altword_token_array = (altword_token*) CALLOC_CLR(max_altword_tokens, sizeof(altword_token), "search.srec.altword_token_array"); 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->altword_token_array_size = (wtokenID)max_altword_tokens; 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->prune_delta = (costdata)viterbi_prune_thresh; 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->max_frames = (frameID)max_frames; 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->best_model_cost_for_frame = (costdata*)CALLOC_CLR(max_frames, sizeof(costdata), "search.srec.best_model_cost_for_frame"); 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->word_lattice = allocate_word_lattice((frameID)max_frames); 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->word_priority_q = allocate_priority_q(num_wordends_per_frame); 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->best_fsmarc_token = MAXstokenID; 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define ASTAR_NBEST_LEN 10 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->astar_stack = astar_stack_make(rec, ASTAR_NBEST_LEN); 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->context = NULL; 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int check_parameter_range(int parval, int parmin, int parmax, const char* parname) 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (parval > parmax) 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_report("Error: %s value %d is out-of-range [%d,%d]\n", parname, 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project parval, parmin, parmax); 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint allocate_recognition(multi_srec *rec, 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int viterbi_prune_thresh, /*score-based pruning threshold - only keep paths within this delta of best cost*/ 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_hmm_tokens, 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_fsmnode_tokens, 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_word_tokens, 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_altword_tokens, 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int num_wordends_per_frame, 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_fsm_nodes, 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_fsm_arcs, 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_frames, 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_model_states, 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int max_searches) 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (check_parameter_range(max_fsm_nodes, 1, MAXnodeID, "max_fsm_nodes")) 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (check_parameter_range(max_fsm_arcs, 1, MAXarcID, "max_fsm_arcs")) 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (check_parameter_range(max_frames, 1, MAXframeID, "max_frames")) 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (check_parameter_range(max_model_states, 1, MAXmodelID, "max_model_states")) 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (check_parameter_range(max_hmm_tokens, 1, MAXstokenID, "max_hmm_tokens")) 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (check_parameter_range(max_fsmnode_tokens, 1, MAXftokenID, "max_fsmnode_tokens")) 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (check_parameter_range(viterbi_prune_thresh, 1, MAXcostdata, "viterbi_prune_thresh")) 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (check_parameter_range(max_altword_tokens, 0, MAXftokenID, "max_altword_tokens")) 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (check_parameter_range(max_searches, 1, 2, "max_searches")) 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->rec = (srec*)CALLOC_CLR(max_searches, sizeof(srec), "search.srec.base"); 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->num_allocated_recs = max_searches; 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->num_swimodels = 0; 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* best_token_for_arc and best_token_for_node are shared across 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project multiple searches */ 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->best_token_for_arc = (stokenID*)CALLOC_CLR(max_fsm_arcs, sizeof(stokenID), "search.srec.best_token_for_arc"); 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->max_fsm_arcs = (arcID)max_fsm_arcs; 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->best_token_for_node = (ftokenID*)CALLOC_CLR(max_fsm_nodes, sizeof(ftokenID), "search.srec.best_token_for_node"); 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->max_fsm_nodes = (nodeID)max_fsm_nodes; 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* cost offsets and accumulated cost offsets are pooled for all 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project different searches, this saves memory and enables each search 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project to know it's total scores */ 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->cost_offset_for_frame = (costdata*)CALLOC_CLR(max_frames, sizeof(costdata), "search.srec.current_best_costs"); 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->accumulated_cost_offset = (bigcostdata*)CALLOC_CLR(max_frames, sizeof(bigcostdata), "search.srec.accumulated_cost_offset"); 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->max_frames = (frameID)max_frames; 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < max_frames; i++) 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->accumulated_cost_offset[i] = 0; 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* now copy the shared data down to individual recogs */ 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < rec->num_allocated_recs; i++) 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project allocate_recognition1(&rec->rec[i], viterbi_prune_thresh, max_hmm_tokens, max_fsmnode_tokens, max_word_tokens, max_altword_tokens, num_wordends_per_frame, max_frames, max_model_states); 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->rec[i].best_token_for_node = rec->best_token_for_node; 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->rec[i].max_fsm_nodes = rec->max_fsm_nodes; 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->rec[i].best_token_for_arc = rec->best_token_for_arc; 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->rec[i].max_fsm_arcs = rec->max_fsm_arcs; 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->rec[i].max_frames = rec->max_frames; 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->rec[i].cost_offset_for_frame = rec->cost_offset_for_frame; 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->rec[i].accumulated_cost_offset = rec->accumulated_cost_offset; 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->rec[i].id = (asr_int16_t)i; 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rec->eos_status = VALID_SPEECH_NOT_YET_DETECTED; 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void free_recognition1(srec *rec) 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->current_model_scores); 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->fsmarc_token_array); 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->word_token_array); 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->word_token_array_flags); 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->fsmnode_token_array); 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->altword_token_array); 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->best_model_cost_for_frame); 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project destroy_word_lattice(rec->word_lattice); 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project free_priority_q(rec->word_priority_q); 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project astar_stack_destroy(rec); 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid free_recognition(multi_srec *rec) 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < rec->num_allocated_recs; i++) 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project free_recognition1(&rec->rec[i]); 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->accumulated_cost_offset); 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->cost_offset_for_frame); 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->best_token_for_node); 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->best_token_for_arc); 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(rec->rec); 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 237