50 hmm_enter(sas->
hmms, 0, 0, 0);
60 hmm_normalize(sas->
hmms + i, norm);
72 for (i = 0; i < sas->
n_phones; ++i) {
76 if (hmm_frame(hmm) < frame_idx)
78 score = hmm_vit_eval(hmm);
90 int nf = frame_idx + 1;
94 for (i = 0; i < sas->
n_phones; ++i) {
96 if (hmm_frame(hmm) < frame_idx)
105 int nf = frame_idx + 1;
108 for (i = 0; i < sas->
n_phones - 1; ++i) {
110 int32 newphone_score;
113 if (hmm_frame(hmm) != nf)
116 newphone_score = hmm_out_score(hmm);
119 if (hmm_frame(nhmm) < frame_idx
120 || newphone_score
BETTER_THAN hmm_in_score(nhmm)) {
121 hmm_enter(nhmm, newphone_score, hmm_out_history(hmm), nf);
126 #define TOKEN_STEP 20
147 extend_tokenstack(sas, frame_idx);
151 for (i = 0; i < sas->
n_phones; ++i) {
155 if (hmm_frame(hmm) < frame_idx)
157 for (j = 0; j < sas->
hmmctx->n_emit_state; ++j) {
158 int state_idx = i * sas->
hmmctx->n_emit_state + j;
160 tokens[state_idx] = hmm_history(hmm, j);
162 hmm_history(hmm, j) = state_idx;
168 state_align_search_step(
ps_search_t *search,
int frame_idx)
171 acmod_t *acmod = ps_search_acmod(search);
183 E_INFO(
"Renormalizing Scores at frame %d, best score %d\n",
185 renormalize_hmms(sas, frame_idx, sas->
best_score);
189 sas->
best_score = evaluate_hmms(sas, senscr, frame_idx);
190 prune_hmms(sas, frame_idx);
193 phone_transition(sas, frame_idx);
196 record_transitions(sas, frame_idx);
199 sas->
frame = frame_idx;
211 int next_state, next_start, state, frame;
214 next_state = state = hmm_out_history(final_phone);
215 if (state == 0xffff) {
216 E_ERROR(
"Failed to reach final state in alignment\n");
220 next_start = sas->
frame + 1;
221 for (frame = sas->
frame - 1; frame >= 0; --frame) {
224 if (state != next_state) {
226 assert(itor != NULL);
228 ent->start = frame + 1;
229 ent->duration = next_start - ent->start;
230 E_DEBUG(1,(
"state %d start %d end %d\n", next_state,
231 ent->start, next_start));
233 next_start = frame + 1;
238 assert(itor != NULL);
241 ent->duration = next_start;
242 E_DEBUG(1,(
"state %d start %d end %d\n", 0,
243 ent->start, next_start));
261 ps_search_deinit(search);
264 hmm_context_free(sas->
hmmctx);
270 state_align_search_start,
271 state_align_search_step,
272 state_align_search_finish,
273 state_align_search_reinit,
274 state_align_search_free,
282 state_align_search_init(cmd_ln_t *config,
290 sas = ckd_calloc(1,
sizeof(*sas));
291 ps_search_init(ps_search_base(sas), &state_align_search_funcs,
292 config, acmod, al->d2p->
dict, al->d2p);
293 sas->
hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->
mdef),
295 if (sas->
hmmctx == NULL) {
308 hmm_init(sas->
hmmctx, hmm, FALSE,
309 ent->id.pid.ssid, ent->id.pid.tmatid);
311 return ps_search_base(sas);