76 ms_cont_mgau_frame_eval,
77 ms_mgau_mllr_transform,
99 g = msg->
g = gauden_init(cmd_ln_str_r(config,
"-mean"),
100 cmd_ln_str_r(config,
"-var"),
101 cmd_ln_float32_r(config,
"-varfloor"),
105 if (g->
n_feat != feat_dimension1(acmod->
fcb)) {
106 E_ERROR(
"Number of streams does not match: %d != %d\n",
110 for (i = 0; i < g->
n_feat; ++i) {
111 if (g->
featlen[i] != feat_dimension2(acmod->
fcb, i)) {
112 E_ERROR(
"Dimension of stream %d does not match: %d != %d\n", i,
113 g->
featlen[i], feat_dimension2(acmod->
fcb, i));
118 s = msg->
s = senone_init(msg->
g,
119 cmd_ln_str_r(config,
"-mixw"),
120 cmd_ln_str_r(config,
"-senmgau"),
121 cmd_ln_float32_r(config,
"-mixwfloor"),
124 s->
aw = cmd_ln_int32_r(config,
"-aw");
128 E_FATAL(
"#Feature mismatch: gauden= %d, senone= %d\n", g->
n_feat,
131 E_FATAL(
"#Densities mismatch: gauden= %d, senone= %d\n",
134 E_FATAL(
"Senones need more codebooks (%d) than present (%d)\n",
137 E_ERROR(
"Senones use fewer codebooks (%d) than present (%d)\n",
140 msg->
topn = cmd_ln_int32_r(config,
"-topn");
141 E_INFO(
"The value of topn: %d\n", msg->
topn);
144 (
"-topn argument (%d) invalid or > #density codewords (%d); set to latter\n",
152 msg->mgau_active = ckd_calloc(g->
n_mgau,
sizeof(int8));
155 mg->
vt = &ms_mgau_funcs;
158 ms_mgau_free(ps_mgau_base(msg));
174 ckd_free_3d((
void *) msg->dist);
175 if (msg->mgau_active)
176 ckd_free(msg->mgau_active);
186 return gauden_mllr_transform(msg->
g, mllr, msg->config);
192 uint8 *senone_active,
193 int32 n_senone_active,
205 topn = ms_mgau_topn(msg);
206 g = ms_mgau_gauden(msg);
207 sen = ms_mgau_senone(msg);
212 for (gid = 0; gid < g->
n_mgau; gid++)
215 best = (int32) 0x7fffffff;
216 for (s = 0; s < sen->
n_sen; s++) {
218 if (best > senscr[s]) {
224 for (s = 0; s < sen->
n_sen; s++) {
225 int32 bs = senscr[s] - best;
236 for (gid = 0; gid < g->
n_mgau; gid++)
237 msg->mgau_active[gid] = 0;
240 for (i = 0; i < n_senone_active; i++) {
242 int32 s = senone_active[i] + n;
243 msg->mgau_active[sen->
mgau[s]] = 1;
248 for (gid = 0; gid < g->
n_mgau; gid++) {
249 if (msg->mgau_active[gid])
253 best = (int32) 0x7fffffff;
255 for (i = 0; i < n_senone_active; i++) {
256 int32 s = senone_active[i] + n;
258 if (best > senscr[s]) {
266 for (i = 0; i < n_senone_active; i++) {
267 int32 s = senone_active[i] + n;
268 int32 bs = senscr[s] - best;