1 /*---------------------------------------------------------------------------*
2 * ca_front.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 /************************************************************************
21 * CA_Frontend Methods
22 ************************************************************************/
23
24
25 #ifndef _RTT
26 #include <stdio.h>
27 #endif
28 #include <stdlib.h>
29 #include <string.h>
30 #include <limits.h>
31
32 #ifdef unix
33 #include <unistd.h>
34 #endif
35 #include <assert.h>
36
37 #include "frontapi.h"
38
39 #include "portable.h"
40
41 #ifdef USE_COMP_STATS
42 void stop_front_end_clock(void);
43 void start_front_end_clock(void);
44 #endif
45
46 /* These are front-end functions
47 */
48
CA_AllocateFrontend(float srcscale,int offset,float sinkscale)49 CA_Frontend *CA_AllocateFrontend(float srcscale, int offset,
50 float sinkscale)
51 {
52 CA_Frontend *hFrontend = NULL;
53 TRY_CA_EXCEPT
54 hFrontend = (CA_Frontend *) CALLOC_CLR(1, sizeof(CA_Frontend), "ca.hFrontend");
55 hFrontend->src_scale = srcscale;
56 hFrontend->sink_scale = sinkscale;
57 hFrontend->offset = offset;
58
59 hFrontend->is_configured = False;
60 hFrontend->is_filter_loaded = False;
61
62 hFrontend->ca_rtti = CA_FRONTEND_SIGNATURE;
63 return (hFrontend);
64 BEG_CATCH_CA_EXCEPT;
65 END_CATCH_CA_EXCEPT(hFrontend)
66 }
67
CA_FreeFrontend(CA_Frontend * hFrontend)68 void CA_FreeFrontend(CA_Frontend *hFrontend)
69 {
70 TRY_CA_EXCEPT
71 ASSERT(hFrontend);
72 if (hFrontend->is_configured == True)
73 SERVICE_ERROR(CONFIGURED_FRONTEND);
74 if (hFrontend->is_filter_loaded == True)
75 SERVICE_ERROR(SPEC_FILTER_CONFIGURED);
76
77 FREE((char *) hFrontend);
78 return;
79 BEG_CATCH_CA_EXCEPT;
80 END_CATCH_CA_EXCEPT(hFrontend);
81 }
82
83
CA_ConfigureFrontend(CA_Frontend * hFrontend,CA_FrontendInputParams * hFrontArgs)84 void CA_ConfigureFrontend(CA_Frontend *hFrontend,
85 CA_FrontendInputParams *hFrontArgs)
86 {
87 TRY_CA_EXCEPT
88 ASSERT(hFrontend);
89 ASSERT(hFrontArgs);
90
91 if (hFrontArgs->is_loaded == False)
92 SERVICE_ERROR(FRONTEND_INPUT_NOT_LOADED);
93 if (hFrontend->is_configured == True)
94 SERVICE_ERROR(CONFIGURED_FRONTEND);
95
96 hFrontend->config = create_config_object() ;
97 setup_config_object(hFrontend->config, hFrontArgs);
98 hFrontend->is_configured = True;
99
100 return;
101 BEG_CATCH_CA_EXCEPT;
102 END_CATCH_CA_EXCEPT(hFrontend);
103 }
104
CA_UnconfigureFrontend(CA_Frontend * hFrontend)105 void CA_UnconfigureFrontend(CA_Frontend *hFrontend)
106 {
107 TRY_CA_EXCEPT
108 ASSERT(hFrontend);
109 if (hFrontend->is_configured == False)
110 SERVICE_ERROR(UNCONFIGURED_FRONTEND);
111
112 clear_config_object(hFrontend->config);
113 delete_config_object(hFrontend->config);
114 hFrontend->config = NULL;
115
116 hFrontend->is_configured = False;
117
118 return;
119 BEG_CATCH_CA_EXCEPT;
120 END_CATCH_CA_EXCEPT(hFrontend);
121 }
122
123
CA_MakeFrame(CA_Frontend * hFrontend,CA_Utterance * hUtt,CA_Wave * hWave)124 int CA_MakeFrame(CA_Frontend *hFrontend, CA_Utterance *hUtt, CA_Wave *hWave)
125 {
126 /* Note: samdata has already been loaded
127 */
128 int valid;
129 TRY_CA_EXCEPT
130 featdata framdata[MAX_CHAN_DIM], voicedata = 0;
131
132 ASSERT(hFrontend);
133 ASSERT(hUtt);
134 ASSERT(hWave);
135
136 ASSERT(hUtt->data.gen_utt.frame->uttDim <= MAX_CHAN_DIM);
137
138 if (hFrontend->is_configured == False)
139 SERVICE_ERROR(UNCONFIGURED_FRONTEND);
140 if (hUtt->data.utt_type != LIVE_INPUT)
141 SERVICE_ERROR(UTTERANCE_INVALID);
142
143 #ifdef USE_COMP_STATS
144 start_front_end_clock();
145 #endif
146
147
148 if (hUtt->data.gen_utt.frame->haveVoiced)
149 valid = make_frame(hWave->data.channel, hFrontend->config->waveobj,
150 hFrontend->config->freqobj, hFrontend->config->cepobj,
151 &hWave->voice, hWave->data.income, hWave->data.outgo,
152 hWave->data.num_samples,
153 framdata, &voicedata);
154 else
155 valid = make_frame(hWave->data.channel, hFrontend->config->waveobj,
156 hFrontend->config->freqobj,
157 hFrontend->config->cepobj,
158 NULL, hWave->data.income, hWave->data.outgo,
159 hWave->data.num_samples,
160 framdata, &voicedata);
161
162 /* Ignore first 3 frames. This prevents a spike due to dc offset.
163 ** This effect would normally be removed by loading the window
164 ** overhang but we are not doing that (tricky).
165 */
166 if (valid > 0 && hWave->data.channel->frame_count > (DELTA + 3))
167 {
168 if (pushSingleFEPframe(hUtt->data.gen_utt.frame,
169 framdata, voicedata) != False)
170 valid = False;
171 }
172 else valid = False;
173
174 #ifdef USE_COMP_STATS
175 stop_front_end_clock();
176 #endif
177
178 return (valid);
179 BEG_CATCH_CA_EXCEPT;
180 END_CATCH_CA_EXCEPT(hFrontend);
181 }
182
CA_GetFrontendUtteranceDimension(CA_Frontend * hFrontend)183 int CA_GetFrontendUtteranceDimension(CA_Frontend *hFrontend)
184 {
185 int dim;
186 TRY_CA_EXCEPT
187 ASSERT(hFrontend);
188 ASSERT(hFrontend->config);
189
190 if (hFrontend->is_configured == False)
191 SERVICE_ERROR(UNCONFIGURED_FRONTEND);
192
193 /* TODO: Determine the dim exactly */
194 dim = 2 * hFrontend->config->cepobj->mel_dim;
195 if (hFrontend->config->cepobj->do_dd_mel)
196 dim += hFrontend->config->cepobj->mel_dim;
197 return (dim);
198 BEG_CATCH_CA_EXCEPT;
199 END_CATCH_CA_EXCEPT(hFrontend);
200 }
201