42 #include <sphinxbase/err.h>
46 static int phone_loop_search_start(
ps_search_t *search);
47 static int phone_loop_search_step(
ps_search_t *search,
int frame_idx);
48 static int phone_loop_search_finish(
ps_search_t *search);
50 static void phone_loop_search_free(
ps_search_t *search);
51 static char const *phone_loop_search_hyp(
ps_search_t *search, int32 *out_score, int32 *out_is_final);
52 static int32 phone_loop_search_prob(
ps_search_t *search);
57 phone_loop_search_start,
58 phone_loop_search_step,
59 phone_loop_search_finish,
60 phone_loop_search_reinit,
61 phone_loop_search_free,
63 phone_loop_search_hyp,
64 phone_loop_search_prob,
65 phone_loop_search_seg_iter,
72 cmd_ln_t *config = ps_search_config(search);
73 acmod_t *acmod = ps_search_acmod(search);
77 ps_search_base_reinit(search, dict, d2p);
81 hmm_context_free(pls->
hmmctx);
82 pls->
hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->
mdef),
95 for (i = 0; i < pls->
n_phones; ++i) {
99 bin_mdef_pid2ssid(acmod->
mdef, i),
100 bin_mdef_pid2tmatid(acmod->
mdef, i));
102 pls->
beam = logmath_log(acmod->
lmath, cmd_ln_float64_r(config,
"-pl_beam"));
103 pls->
pbeam = logmath_log(acmod->
lmath, cmd_ln_float64_r(config,
"-pl_pbeam"));
104 pls->
pip = logmath_log(acmod->
lmath, cmd_ln_float64_r(config,
"-pip"));
105 E_INFO(
"State beam %d Phone exit beam %d Insertion penalty %d\n",
112 phone_loop_search_init(cmd_ln_t *config,
119 pls = ckd_calloc(1,
sizeof(*pls));
120 ps_search_init(ps_search_base(pls), &phone_loop_search_funcs,
121 config, acmod, dict, NULL);
122 phone_loop_search_reinit(ps_search_base(pls), ps_search_dict(pls),
123 ps_search_dict2pid(pls));
125 return ps_search_base(pls);
132 for (gn = pls->
renorm; gn; gn = gnode_next(gn))
133 ckd_free(gnode_ptr(gn));
144 ps_search_deinit(search);
147 phone_loop_search_free_renorm(pls);
149 hmm_context_free(pls->
hmmctx);
160 for (i = 0; i < pls->
n_phones; ++i) {
163 hmm_enter(hmm, 0, -1, 0);
165 phone_loop_search_free_renorm(pls);
181 for (i = 0; i < pls->
n_phones; ++i) {
194 for (i = 0; i < pls->
n_phones; ++i) {
198 if (hmm_frame(hmm) < frame_idx)
200 score = hmm_vit_eval(hmm);
213 int nf = frame_idx + 1;
217 for (i = 0; i < pls->
n_phones; ++i) {
220 if (hmm_frame(hmm) < frame_idx)
227 hmm_clear_scores(hmm);
235 int nf = frame_idx + 1;
240 for (i = 0; i < pls->
n_phones; ++i) {
242 int32 newphone_score;
245 if (hmm_frame(hmm) != nf)
248 newphone_score = hmm_out_score(hmm) + pls->
pip;
251 for (j = 0; j < pls->
n_phones; ++j) {
254 if (hmm_frame(nhmm) < frame_idx
255 || newphone_score
BETTER_THAN hmm_in_score(nhmm)) {
256 hmm_enter(nhmm, newphone_score, hmm_out_history(hmm), nf);
264 phone_loop_search_step(
ps_search_t *search,
int frame_idx)
267 acmod_t *acmod = ps_search_acmod(search);
272 if (!ps_search_acmod(pls)->compallsen)
281 E_INFO(
"Renormalizing Scores at frame %d, best score %d\n",
283 renormalize_hmms(pls, frame_idx, pls->
best_score);
287 pls->
best_score = evaluate_hmms(pls, senscr, frame_idx);
290 prune_hmms(pls, frame_idx);
293 phone_transition(pls, frame_idx);
306 phone_loop_search_hyp(
ps_search_t *search, int32 *out_score, int32 *out_is_final)
308 E_WARN(
"Hypotheses are not returned from phone loop search");
316 E_WARN(
"Posterior probabilities are not returned from phone loop search");
321 phone_loop_search_seg_iter(
ps_search_t *search, int32 *out_score)
323 E_WARN(
"Hypotheses are not returned from phone loop search");