/** * <JA> * 構築された factoring 情報を multipath 用に調整する. factoring 情報を, * モデル全体をスキップする遷移がある場合はその先の音素へコピーする. * また,(出力を持たない)文頭文法ノードに単語先頭ノードからコピーする. * * @param wchmm [in] 木構造化辞書 * </JA> * <EN> * Adjust factoring data in tree lexicon for multipath transition handling. * * @param wchmm [in] tree lexicon * </EN> * * @callgraph * @callergraph * */ void adjust_sc_index(WCHMM_INFO *wchmm) { WORD_ID w; int i,j,k; HMM_Logical *ltmp; int ltmp_state_num; int ato; LOGPROB prob; int node, scid; A_CELL2 *ac; /* duplicate scid for HMMs with more than one arc from initial state */ for(w=0;w<wchmm->winfo->num;w++) { for(k=0;k<wchmm->winfo->wlen[w];k++) { node = wchmm->offset[w][k]; scid = wchmm->state[node].scid; if (scid == 0) continue; ltmp = wchmm->winfo->wseq[w][k]; ltmp_state_num = hmm_logical_state_num(ltmp); if ((hmm_logical_trans(ltmp))->a[0][ltmp_state_num-1] != LOG_ZERO) { j = k + 1; if (j == wchmm->winfo->wlen[w]) { if (wchmm->state[wchmm->wordend[w]].scid == 0) { jlog("STAT: word %d: factoring node copied for skip phone\n", w); wchmm->state[wchmm->wordend[w]].scid = scid; } } else { if (wchmm->state[wchmm->offset[w][j]].scid == 0) { jlog("STAT: word %d: factoring node copied for skip phone\n", w); wchmm->state[wchmm->offset[w][j]].scid = scid; } } } for(ato=1;ato<ltmp_state_num;ato++) { prob = (hmm_logical_trans(ltmp))->a[0][ato]; if (prob != LOG_ZERO) { wchmm->state[node+ato-1].scid = scid; } } } } /* move scid and fscore on the head state to the head grammar state */ for(i=0;i<wchmm->startnum;i++) { node = wchmm->startnode[i]; if (wchmm->state[node].out.state != NULL) { j_internal_error("adjust_sc_index: outprob exist in word-head node??\n"); } if (wchmm->next_a[node] != LOG_ZERO) { if (wchmm->state[node+1].scid != 0) { if (wchmm->state[node].scid != 0 && wchmm->state[node].scid != wchmm->state[node+1].scid) { j_internal_error("adjust_sc_index: different successor list within word-head phone?\n"); } wchmm->state[node].scid = wchmm->state[node+1].scid; wchmm->state[node+1].scid = 0; } } for(ac=wchmm->ac[node];ac;ac=ac->next) { for(k=0;k<ac->n;k++) { if (wchmm->state[ac->arc[k]].scid != 0) { if (wchmm->state[node].scid != 0 && wchmm->state[node].scid != wchmm->state[ac->arc[k]].scid) { j_internal_error("adjust_sc_index: different successor list within word-head phone?\n"); } wchmm->state[node].scid = wchmm->state[ac->arc[k]].scid; wchmm->state[ac->arc[k]].scid = 0; } } } } }
/** * <JA> * 音素の出力状態への遷移確率の最大値を求める. (multipath) * * @param l [in] 音素 * * @return 出力状態への遷移確率の最大値を返す. * </JA> * <EN> * Get the maximum transition log probability outside a phone. (multipath) * * @param l [in] phone * * @return the maximum transition log probability outside a phone. * </EN> */ static LOGPROB max_out_arc(HMM_Logical *l) { return(get_max_out_arc(hmm_logical_trans(l), hmm_logical_state_num(l))); }