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