1 /*---------------------------------------------------------------------------*
2 * rec_basi.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 #include <stdlib.h>
21 #include <string.h>
22 #ifndef _RTT
23 #include <stdio.h>
24 #endif
25
26 #ifdef unix
27 #include <unistd.h>
28 #endif
29 #include <assert.h>
30
31
32 #include "simapi.h"
33 #include "portable.h"
34
35 static const char rec_basi[] = "$Id: rec_basi.c,v 1.13.6.7 2007/10/15 18:06:24 dahan Exp $";
36
37 /*chopped - chopped a lot of stuff out of this file - all the references to the
38 stuff within the rec structure. It seems like this should not be at this level. If
39 we leave it below here, we can change the search (with a new rec type) without
40 having to change this level*/
41
CA_AllocateRecognition()42 CA_Recog *CA_AllocateRecognition()
43 {
44 CA_Recog *hRecog = NULL;
45
46 #ifdef SREC_ENGINE_VERBOSE_LOGGING
47 PLogMessage("in CA_AllocateRecognition\n");
48 #endif
49
50 TRY_CA_EXCEPT
51
52
53 /* CREC_SET_SIGNATURE must be 'tied' to the
54 * actual creation of the recog_info structure.
55 * Any methods which take 'recog_info' as an argument,
56 * even 'destroy_recognition()' will test the signature!
57 */
58 hRecog = (CA_Recog *) CALLOC_CLR(1, sizeof(CA_Recog), "ca.hRecog");
59
60 hRecog->setup_count = 0;
61 hRecog->is_running = False;
62 hRecog->is_configured = False;
63 hRecog->is_resultBlocked = False;
64 hRecog->ca_rtti = CA_RECOGNIZER_SIGNATURE;
65
66 hRecog->recm = (multi_srec*)CALLOC_CLR(1, sizeof(multi_srec), "ca.hRecog.srec");
67 return (hRecog);
68
69 BEG_CATCH_CA_EXCEPT
70 END_CATCH_CA_EXCEPT(hRecog)
71 }
72
CA_ConfigureRecognition(CA_Recog * hRecog,CA_RecInputParams * hRecInput)73 int CA_ConfigureRecognition(CA_Recog *hRecog, CA_RecInputParams *hRecInput)
74 {
75 int rc = 0;
76 TRY_CA_EXCEPT
77
78 if (hRecog->is_configured == True)
79 SERVICE_ERROR(RECOGNIZER_ALREADY_CONFIGURED);
80
81 rc = allocate_recognition(hRecog->recm,
82 hRecInput->viterbi_prune_thresh,
83 hRecInput->max_hmm_tokens,
84 hRecInput->max_fsmnode_tokens,
85 hRecInput->max_word_tokens,
86 hRecInput->max_altword_tokens,
87 hRecInput->num_wordends_per_frame,
88 hRecInput->max_fsm_nodes,
89 hRecInput->max_fsm_arcs,
90 hRecInput->max_frames,
91 hRecInput->max_model_states,
92 hRecInput->max_searches);
93 if (rc) return rc;
94
95 /*rc =*/
96 srec_eosd_allocate(&hRecog->eosd_parms,
97 hRecInput->eou_threshold,
98 hRecInput->eou_threshold,
99 hRecInput->terminal_timeout,
100 hRecInput->optional_terminal_timeout,
101 hRecInput->non_terminal_timeout,
102 hRecInput->max_frames);
103 if (rc) return rc;
104
105 hRecog->is_configured = True;
106
107 BEG_CATCH_CA_EXCEPT
108 END_CATCH_CA_EXCEPT(hRecog)
109 return 0;
110 }
111
CA_UnconfigureRecognition(CA_Recog * hRecog)112 void CA_UnconfigureRecognition(CA_Recog *hRecog)
113 {
114 TRY_CA_EXCEPT
115
116 if (hRecog->is_configured == False)
117 SERVICE_ERROR(RECOGNIZER_NOT_CONFIGURED);
118
119 if (hRecog->is_running == True)
120 SERVICE_ERROR(RECOGNIZER_ALREADY_STARTED);
121
122 srec_eosd_destroy(hRecog->eosd_parms);
123 free_recognition(hRecog->recm);
124 hRecog->is_configured = False;
125
126 BEG_CATCH_CA_EXCEPT
127 END_CATCH_CA_EXCEPT(hRecog)
128 }
129
130
131
CA_FreeRecognition(CA_Recog * hRecog)132 void CA_FreeRecognition(CA_Recog *hRecog)
133 {
134 TRY_CA_EXCEPT
135 ASSERT(hRecog);
136
137 if (hRecog->is_configured == True)
138 SERVICE_ERROR(RECOGNIZER_ALREADY_CONFIGURED);
139
140 /* CREC_CLEAR_SIGNATURE must be 'tied' to the
141 * actual destruction of the recog_info structure.
142 * Any methods which take 'recog_info' as an argument,
143 * even 'destroy_recognition()' will test the signature!
144 */
145 FREE(hRecog->recm);
146 FREE(hRecog);
147
148 return;
149
150 BEG_CATCH_CA_EXCEPT
151 END_CATCH_CA_EXCEPT(hRecog)
152 }
153
154
CA_BeginRecognition(CA_Recog * hRecog,CA_Syntax * hSyntax,int first_syntax_node,CA_RecInputParams * hRecInput)155 void CA_BeginRecognition(CA_Recog *hRecog, CA_Syntax *hSyntax,
156 int first_syntax_node, CA_RecInputParams *hRecInput)
157 {
158 TRY_CA_EXCEPT
159 /*ASSERT (hSyntax);*/
160 ASSERT(hRecog);
161 ASSERT(hRecInput);
162 if (hRecog->is_running == True)
163 SERVICE_ERROR(RECOGNIZER_ALREADY_STARTED);
164
165 if (hRecog->is_configured == False)
166 SERVICE_ERROR(RECOGNIZER_NOT_CONFIGURED);
167
168 begin_recognition(hRecog->recm, first_syntax_node);
169 hRecog->is_running = True;
170
171 return;
172
173 BEG_CATCH_CA_EXCEPT
174 END_CATCH_CA_EXCEPT(hRecog)
175 }
176
177
CA_AdvanceRecognitionByFrame(CA_Recog * hRecog,CA_Pattern * hPattern,CA_Utterance * hUtterance)178 void CA_AdvanceRecognitionByFrame(CA_Recog *hRecog, CA_Pattern *hPattern,
179 CA_Utterance *hUtterance)
180 {
181 int rc;
182 TRY_CA_EXCEPT
183 ASSERT(hRecog);
184 ASSERT(hPattern);
185 ASSERT(hUtterance);
186 if (hRecog->is_running == False)
187 SERVICE_ERROR(RECOGNIZER_NOT_STARTED);
188 if (hPattern->is_loaded == False)
189 SERVICE_ERROR(PATTERN_NOT_LOADED);
190 //if (0 && hPattern->setup_sub == NULL && hPattern->setup_whole == NULL)
191 //SERVICE_ERROR(PATTERN_NOT_SETUP);
192
193 rc = multi_srec_viterbi(hRecog->recm,
194 hRecog->eosd_parms,
195 &hPattern->data,
196 &hUtterance->data);
197 return;
198
199 BEG_CATCH_CA_EXCEPT
200 END_CATCH_CA_EXCEPT(hRecog)
201 }
202
203
CA_EndRecognition(CA_Recog * hRecog,CA_Pattern * hPattern,CA_Utterance * hUtterance)204 int CA_EndRecognition(CA_Recog *hRecog, CA_Pattern *hPattern,
205 CA_Utterance *hUtterance)
206 {
207 TRY_CA_EXCEPT
208 int terminated;
209
210 ASSERT(hRecog);
211 ASSERT(hPattern);
212 ASSERT(hUtterance);
213 if (hRecog->is_running == False)
214 SERVICE_ERROR(RECOGNIZER_NOT_STARTED);
215 if (hPattern->is_loaded == False)
216 SERVICE_ERROR(PATTERN_NOT_LOADED);
217 //if (0 && hPattern->setup_sub == NULL && hPattern->setup_whole == NULL)
218 //SERVICE_ERROR(PATTERN_NOT_SETUP);
219
220 terminated = 1;
221 end_recognition(hRecog->recm);
222
223 if (terminated && hUtterance->data.gen_utt.do_channorm)
224 {
225 if (!inherit_recognition_statistics(&hUtterance->data, hRecog->recm,
226 hUtterance->data.gen_utt.channorm->dim))
227 SERVICE_ERROR(UNEXPECTED_DATA_ERROR); /* TODO: find a suitable error code */
228 }
229
230 if (terminated) hPattern->recog_terminated = True;
231 hRecog->is_running = False;
232 return (terminated);
233
234 BEG_CATCH_CA_EXCEPT
235 END_CATCH_CA_EXCEPT(hRecog)
236 }
237