/* * Enter a new LMstate into the current frame LMstates trees; called ONLY IF not already * present. */ static void vithist_lmstate_enter(vithist_t * vh, int32 vhid, vithist_entry_t * ve) { vh_lms2vh_t *lms2vh, *child; s3lmwid32_t lwid; lwid = ve->lmstate.lm3g.lwid[0]; if ((lms2vh = vh->lms2vh_root[lwid]) == NULL) { lms2vh = (vh_lms2vh_t *) ckd_calloc(1, sizeof(vh_lms2vh_t)); vh->lms2vh_root[lwid] = lms2vh; lms2vh->state = lwid; lms2vh->children = NULL; vh->lwidlist = glist_add_int32(vh->lwidlist, (int32) lwid); } else { assert(lms2vh->state == lwid); } child = (vh_lms2vh_t *) ckd_calloc(1, sizeof(vh_lms2vh_t)); child->state = ve->lmstate.lm3g.lwid[1]; child->children = NULL; child->vhid = vhid; child->ve = ve; lms2vh->children = glist_add_ptr(lms2vh->children, (void *) child); }
/* * Build a glist of triphone senone-sequence IDs (ssids) derivable from [b] as a single * phone word, with a given left context l. If no triphone found in mdef, include the ssid * for basephone b. Return the generated glist. */ static glist_t single_lc_comsseq (mdef_t *mdef, int32 b, int32 l) { int32 r, p, ssid; glist_t g; g = NULL; for (r = 0; r < mdef_n_ciphone(mdef); r++) { p = mdef_phone_id (mdef, (s3cipid_t)b, (s3cipid_t)l, (s3cipid_t)r, WORD_POSN_SINGLE); if (IS_S3PID(p)) { ssid = mdef_pid2ssid(mdef, p); if (! glist_chkdup_int32 (g, ssid)) g = glist_add_int32 (g, ssid); } } if (! g) g = glist_add_int32 (g, mdef_pid2ssid(mdef, b)); return g; }
/* * Build a glist of triphone senone-sequence IDs (ssids) derivable from [b][r] at the word * begin position. If no triphone found in mdef, include the ssid for basephone b. * Return the generated glist. */ static glist_t ldiph_comsseq (mdef_t *mdef, int32 b, int32 r) { int32 l, p, ssid; glist_t g; g = NULL; for (l = 0; l < mdef_n_ciphone(mdef); l++) { p = mdef_phone_id (mdef, (s3cipid_t)b, (s3cipid_t)l, (s3cipid_t)r, WORD_POSN_BEGIN); if (IS_S3PID(p)) { ssid = mdef_pid2ssid(mdef, p); if (! glist_chkdup_int32 (g, ssid)) g = glist_add_int32 (g, ssid); } } if (! g) g = glist_add_int32 (g, mdef_pid2ssid(mdef, b)); return g; }
char * dict_g2p(char const *word_grapheme, ngram_model_t *ngram_g2p_model) { char *final_phone = NULL; int totalh = 0; size_t increment = 1; int word_offset = 0; int j; size_t grapheme_len = 0, final_phoneme_len = 0; glist_t history_list = NULL; gnode_t *gn; int first = 0; const int32 *total_unigrams; struct winner_t winner; const char *word; unigram_t unigram; total_unigrams = ngram_model_get_counts(ngram_g2p_model); int32 wid_sentence = ngram_wid(ngram_g2p_model,"<s>"); // start with sentence history_list = glist_add_int32(history_list, wid_sentence); grapheme_len = strlen(word_grapheme); for (j = 0; j < grapheme_len; j += increment) { winner = dict_get_winner_wid(ngram_g2p_model, word_grapheme, history_list, *total_unigrams, word_offset); increment = winner.length_match; if (increment == 0) { E_ERROR("Error trying to find matching phoneme (%s) Exiting.. \n" , word_grapheme); return NULL; } history_list = glist_add_int32(history_list, winner.winner_wid); totalh = j + 1; word_offset += winner.length_match; final_phoneme_len += winner.len_phoneme; } history_list = glist_reverse(history_list); final_phone = ckd_calloc(1, final_phoneme_len * 2); for (gn = history_list; gn; gn = gnode_next(gn)) { if (!first) { first = 1; continue; } word = ngram_word(ngram_g2p_model, gnode_int32(gn)); if (!word) continue; unigram = dict_split_unigram(word); if (strcmp(unigram.phone, "_") == 0) { if (unigram.word) ckd_free(unigram.word); if (unigram.phone) ckd_free(unigram.phone); continue; } strcat(final_phone, unigram.phone); strcat(final_phone, " "); if (unigram.word) ckd_free(unigram.word); if (unigram.phone) ckd_free(unigram.phone); } if (history_list) glist_free(history_list); return final_phone; }