00001
00018
00019
00020
00021
00022
00023
00024
00025 #include <sent/stddefs.h>
00026 #include <sent/htk_hmm.h>
00027
00033 HTK_HMM_INFO *
00034 hmminfo_new()
00035 {
00036 HTK_HMM_INFO *new;
00037
00038 new = (HTK_HMM_INFO *)mymalloc(sizeof(HTK_HMM_INFO));
00039
00040 new->mroot = NULL;
00041 new->lroot = NULL;
00042
00043 new->opt.stream_info.num = 1;
00044 new->opt.cov_type = C_DIAG_C;
00045 new->opt.dur_type = D_NULL;
00046
00047 new->trstart = NULL;
00048 new->vrstart = NULL;
00049 new->ststart = NULL;
00050 new->dnstart = NULL;
00051 new->start = NULL;
00052 new->lgstart = NULL;
00053 new->physical_root = NULL;
00054 new->logical_root = NULL;
00055 new->tr_root = NULL;
00056 new->vr_root = NULL;
00057 new->dn_root = NULL;
00058 new->st_root = NULL;
00059 new->codebooknum = 0;
00060 new->codebook_root = NULL;
00061 new->maxcodebooksize = 0;
00062 new->totalmixnum = 0;
00063 new->totalstatenum = 0;
00064 new->totalhmmnum = 0;
00065 new->totallogicalnum = 0;
00066 new->is_triphone = FALSE;
00067 new->is_tied_mixture = FALSE;
00068 new->cdset_method = IWCD_NBEST;
00069 new->cdmax_num = 3;
00070 new->totalpseudonum = 0;
00071 new->sp = NULL;
00072 new->basephone.root = NULL;
00073 new->cdset_info.cdtree = NULL;
00074 new->variance_inversed = FALSE;
00075
00076 return(new);
00077 }
00078
00086 boolean
00087 hmminfo_free(HTK_HMM_INFO *hmm)
00088 {
00089
00090 free_cdset(&(hmm->cdset_info.cdtree));
00091
00092
00093 free_aptree(hmm->tr_root);
00094 free_aptree(hmm->vr_root);
00095 free_aptree(hmm->dn_root);
00096 free_aptree(hmm->st_root);
00097 free_aptree(hmm->physical_root);
00098 free_aptree(hmm->logical_root);
00099 free_aptree(hmm->codebook_root);
00100 free_aptree(hmm->basephone.root);
00101
00102
00103 if (hmm->mroot != NULL) mybfree2(&(hmm->mroot));
00104 if (hmm->lroot != NULL) mybfree2(&(hmm->lroot));
00105
00106
00107 free(hmm);
00108
00109 return(TRUE);
00110 }
00111
00122 boolean
00123 init_hmminfo(HTK_HMM_INFO *hmminfo, char *hmmfilename, char *namemapfile, Value *para)
00124 {
00125 FILE *fp;
00126 boolean ok_p;
00127
00128 ok_p = FALSE;
00129
00130
00131 jlog("Stat: init_phmm: Reading in HMM definition\n");
00132
00133 if ((fp = fopen_readfile(hmmfilename)) == NULL) {
00134 jlog("Error: init_phmm: failed to open %s\n",hmmfilename);
00135 return FALSE;
00136 }
00137 if (rdhmmdef(fp, hmminfo) == TRUE) {
00138 ok_p = TRUE;
00139 }
00140 if (fclose_readfile(fp) < 0) {
00141 jlog("Error: init_phmm: failed to close %s\n", hmmfilename);
00142 return FALSE;
00143 }
00144 if (ok_p == FALSE) {
00145
00146 if ((fp = fopen_readfile(hmmfilename)) == NULL) {
00147 jlog("Error: init_phmm: failed to open %s\n",hmmfilename);
00148 return FALSE;
00149 }
00150 if (read_binhmm(fp, hmminfo, TRUE, para) == TRUE) {
00151 ok_p = TRUE;
00152 }
00153 if (fclose_readfile(fp) < 0) {
00154 jlog("Error: init_phmm: failed to close %s\n", hmmfilename);
00155 return FALSE;
00156 }
00157 }
00158 if (ok_p == FALSE) {
00159 jlog("Error: init_phmm: failed to read %s\n", hmmfilename);
00160 return FALSE;
00161 }
00162
00163 jlog("Stat: init_phmm: defined HMMs: %5d\n", hmminfo->totalhmmnum);
00164
00165
00166 if (namemapfile != NULL) {
00167
00168 if ((fp = fopen_readfile(namemapfile)) == NULL) {
00169 jlog("Error: init_phmm: failed to open %s\n",namemapfile);
00170 return FALSE;
00171 }
00172 if (rdhmmlist(fp, hmminfo) == FALSE) {
00173 jlog("Error: init_phmm: HMMList \"%s\" read error\n",namemapfile);
00174 return FALSE;
00175 }
00176 if (fclose_readfile(fp) < 0) {
00177 jlog("Error: init_phmm: failed to close %s\n", namemapfile);
00178 return FALSE;
00179 }
00180 jlog("Stat: init_phmm: logical names: %5d in HMMList\n", hmminfo->totallogicalnum);
00181 } else {
00182
00183 hmm_add_physical_to_logical(hmminfo);
00184 jlog("Stat: init_phmm: logical names: %5d\n", hmminfo->totallogicalnum);
00185 }
00186
00187
00188 make_hmm_basephone_list(hmminfo);
00189 jlog("Stat: init_phmm: base phones: %5d used in logical\n", hmminfo->basephone.num);
00190
00191
00192
00193 if (guess_if_cd_hmm(hmminfo)) {
00194 hmminfo->is_triphone = TRUE;
00195 } else {
00196 hmminfo->is_triphone = FALSE;
00197 }
00198
00199 jlog("Stat: init_phmm: finished reading HMM definitions\n");
00200
00201 return TRUE;
00202 }
00203
00210 void
00211 htk_hmm_set_pause_model(HTK_HMM_INFO *hmminfo, char *spmodel_name)
00212 {
00213 HMM_Logical *l;
00214
00215 l = htk_hmmdata_lookup_logical(hmminfo, spmodel_name);
00216 if (l == NULL) {
00217 jlog("Warning: init_phmm: no model named as \"%s\", no short pause model assigned\n", spmodel_name);
00218 }
00219 hmminfo->sp = l;
00220 }