Julius 4.2
|
00001 00018 /* 00019 * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University 00020 * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology 00021 * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology 00022 * All rights reserved 00023 */ 00024 00025 /* currenty cannot treat other sub macros (~u,~i,~x) */ 00026 00027 #include <sent/stddefs.h> 00028 #include <sent/htk_hmm.h> 00029 00030 extern char *rdhmmdef_token; 00031 00037 static HTK_HMM_Var * 00038 var_new(HTK_HMM_INFO *hmm) 00039 { 00040 HTK_HMM_Var *new; 00041 00042 new = (HTK_HMM_Var *)mybmalloc2(sizeof(HTK_HMM_Var), &(hmm->mroot)); 00043 00044 new->name = NULL; 00045 new->vec = NULL; 00046 new->len = 0; 00047 new->next = NULL; 00048 00049 return(new); 00050 } 00051 00058 void 00059 var_add(HTK_HMM_INFO *hmm, HTK_HMM_Var *new) 00060 { 00061 HTK_HMM_Var *match; 00062 00063 /* link data structure */ 00064 new->next = hmm->vrstart; 00065 hmm->vrstart = new; 00066 00067 if (new->name != NULL) { 00068 /* add index to search index tree */ 00069 if (hmm->vr_root == NULL) { 00070 hmm->vr_root = aptree_make_root_node(new, &(hmm->mroot)); 00071 } else { 00072 match = aptree_search_data(new->name, hmm->vr_root); 00073 if (match != NULL && strmatch(match->name, new->name)) { 00074 jlog("Error: rdhmmdef_var: ~v \"%s\" is already defined\n", new->name); 00075 rderr(NULL); 00076 } else { 00077 aptree_add_entry(new->name, new, match->name, &(hmm->vr_root), &(hmm->mroot)); 00078 } 00079 } 00080 } 00081 00082 } 00083 00092 static HTK_HMM_Var * 00093 var_lookup(HTK_HMM_INFO *hmm, char *keyname) 00094 { 00095 HTK_HMM_Var *v; 00096 00097 v = aptree_search_data(keyname, hmm->vr_root); 00098 if (v != NULL && strmatch(v->name, keyname)) { 00099 return v; 00100 } else { 00101 return NULL; 00102 } 00103 } 00104 00119 static HTK_HMM_Var * 00120 var_read(FILE *fp, HTK_HMM_INFO *hmm) 00121 { 00122 HTK_HMM_Var *new; 00123 int i; 00124 00125 new = var_new(hmm); 00126 00127 /* read covariance matrix (diagonal vector) */ 00128 00129 if (!currentis("VARIANCE")) { 00130 jlog("Error: rdhmmdef_var: variance matrix type \"%s\" not supported\n", rdhmmdef_token); 00131 rderr(NULL); 00132 } else { 00133 read_token(fp); 00134 NoTokErr("missing VARIANCE vector length"); 00135 new->len = atoi(rdhmmdef_token); 00136 read_token(fp); 00137 new->vec = (VECT *)mybmalloc2(sizeof(VECT) * new->len, &(hmm->mroot)); 00138 /* needs comversion if integerized */ 00139 for (i=0;i<new->len;i++) { 00140 NoTokErr("missing some VARIANCE element"); 00141 new->vec[i] = (VECT)atof(rdhmmdef_token); 00142 read_token(fp); 00143 } 00144 } 00145 00146 return (new); 00147 } 00148 00162 HTK_HMM_Var * 00163 get_var_data(FILE *fp, HTK_HMM_INFO *hmm) 00164 { 00165 HTK_HMM_Var *tmp; 00166 00167 if (currentis("~v")) { 00168 /* macro reference: lookup and return the pointer */ 00169 read_token(fp); 00170 NoTokErr("missing VARIANCE macro name"); 00171 tmp = var_lookup(hmm, rdhmmdef_token); 00172 if (tmp == NULL) { 00173 jlog("Error: rdhmmdef_var: ~v \"%s\" not defined\n", rdhmmdef_token); 00174 rderr(NULL); 00175 } 00176 read_token(fp); 00177 return tmp; 00178 } else if (currentis("VARIANCE")){ 00179 /* definition: define variance data, and return the pointer */ 00180 tmp = var_read(fp, hmm); 00181 tmp->name = NULL; /* no name */ 00182 var_add(hmm, tmp); 00183 return tmp; 00184 } else { 00185 rderr("no variance data"); 00186 return NULL; 00187 } 00188 } 00189 00197 void 00198 def_var_macro(char *name, FILE *fp, HTK_HMM_INFO *hmm) 00199 { 00200 HTK_HMM_Var *new; 00201 00202 00203 /* read in data and return newly malloced data */ 00204 new = var_read(fp, hmm); 00205 00206 /* register it to the grobal HMM structure */ 00207 new->name = name; 00208 var_add(hmm, new); 00209 }