50 hmm_enter(sas->
hmms, 0, 0, 0);
60 hmm_normalize(sas->
hmms + i, norm);
71 for (i = 0; i < sas->
n_phones; ++i) {
75 if (hmm_frame(hmm) < frame_idx)
77 score = hmm_vit_eval(hmm);
88 int nf = frame_idx + 1;
92 for (i = 0; i < sas->
n_phones; ++i) {
94 if (hmm_frame(hmm) < frame_idx)
103 int nf = frame_idx + 1;
106 for (i = 0; i < sas->
n_phones - 1; ++i) {
108 int32 newphone_score;
111 if (hmm_frame(hmm) != nf)
114 newphone_score = hmm_out_score(hmm);
117 if (hmm_frame(nhmm) < frame_idx
118 || newphone_score
BETTER_THAN hmm_in_score(nhmm)) {
119 hmm_enter(nhmm, newphone_score, hmm_out_history(hmm), nf);
124 #define TOKEN_STEP 20
145 extend_tokenstack(sas, frame_idx);
149 for (i = 0; i < sas->
n_phones; ++i) {
153 if (hmm_frame(hmm) < frame_idx)
155 for (j = 0; j < sas->
hmmctx->n_emit_state; ++j) {
156 int state_idx = i * sas->
hmmctx->n_emit_state + j;
158 tokens[state_idx] = hmm_history(hmm, j);
160 hmm_history(hmm, j) = state_idx;
166 state_align_search_step(
ps_search_t *search,
int frame_idx)
169 acmod_t *acmod = ps_search_acmod(search);
181 E_INFO(
"Renormalizing Scores at frame %d, best score %d\n",
183 renormalize_hmms(sas, frame_idx, sas->
best_score);
187 sas->
best_score = evaluate_hmms(sas, senscr, frame_idx);
188 prune_hmms(sas, frame_idx);
191 phone_transition(sas, frame_idx);
194 record_transitions(sas, frame_idx);
197 sas->
frame = frame_idx;
209 int next_state, next_start, state, frame;
212 next_state = state = hmm_out_history(final_phone);
213 if (state == 0xffff) {
214 E_ERROR(
"Failed to reach final state in alignment\n");
218 next_start = sas->
frame + 1;
219 for (frame = sas->
frame - 1; frame >= 0; --frame) {
222 if (state != next_state) {
224 assert(itor != NULL);
226 ent->start = frame + 1;
227 ent->duration = next_start - ent->start;
228 E_DEBUG(1,(
"state %d start %d end %d\n", next_state,
229 ent->start, next_start));
231 next_start = frame + 1;
236 assert(itor != NULL);
239 ent->duration = next_start;
240 E_DEBUG(1,(
"state %d start %d end %d\n", 0,
241 ent->start, next_start));
259 ps_search_deinit(search);
262 hmm_context_free(sas->
hmmctx);
268 state_align_search_start,
269 state_align_search_step,
270 state_align_search_finish,
271 state_align_search_reinit,
272 state_align_search_free,
280 state_align_search_init(cmd_ln_t *config,
288 sas = ckd_calloc(1,
sizeof(*sas));
289 ps_search_init(ps_search_base(sas), &state_align_search_funcs,
290 config, acmod, al->d2p->
dict, al->d2p);
291 sas->
hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->
mdef),
293 if (sas->
hmmctx == NULL) {
306 hmm_init(sas->
hmmctx, hmm, FALSE,
307 ent->id.pid.ssid, ent->id.pid.tmatid);
309 return ps_search_base(sas);