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);
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) {
195 for (i = 0; i < pls->
n_phones; ++i) {
199 if (hmm_frame(hmm) < frame_idx)
201 score = hmm_vit_eval(hmm);
215 int nf = frame_idx + 1;
219 for (i = 0; i < pls->
n_phones; ++i) {
222 if (hmm_frame(hmm) < frame_idx)
229 hmm_clear_scores(hmm);
237 int nf = frame_idx + 1;
242 for (i = 0; i < pls->
n_phones; ++i) {
244 int32 newphone_score;
247 if (hmm_frame(hmm) != nf)
250 newphone_score = hmm_out_score(hmm) + pls->
pip;
253 for (j = 0; j < pls->
n_phones; ++j) {
256 if (hmm_frame(nhmm) < frame_idx
257 || newphone_score
BETTER_THAN hmm_in_score(nhmm)) {
258 hmm_enter(nhmm, newphone_score, hmm_out_history(hmm), nf);
266 phone_loop_search_step(
ps_search_t *search,
int frame_idx)
269 acmod_t *acmod = ps_search_acmod(search);
274 if (!ps_search_acmod(pls)->compallsen)
283 E_INFO(
"Renormalizing Scores at frame %d, best score %d\n",
285 renormalize_hmms(pls, frame_idx, pls->
best_score);
289 pls->
best_score = evaluate_hmms(pls, senscr, frame_idx);
292 prune_hmms(pls, frame_idx);
295 phone_transition(pls, frame_idx);
308 phone_loop_search_hyp(
ps_search_t *search, int32 *out_score)
310 E_WARN(
"Hypotheses are not returned from phone loop search");
318 E_WARN(
"Posterior probabilities are not returned from phone loop search");
323 phone_loop_search_seg_iter(
ps_search_t *search, int32 *out_score)
325 E_WARN(
"Hypotheses are not returned from phone loop search");