00001
00017
00018
00019
00020
00021
00022
00023
00024 #include <sent/stddefs.h>
00025 #include <sent/htk_param.h>
00026 #include <sent/htk_hmm.h>
00027
00029 static OptionStr optcov[] = {
00030 {"DIAGC", C_DIAG_C, "Diag", TRUE},
00031 {"INVDIAGC", C_INV_DIAG, "InvDiag", FALSE},
00032 {"FULLC", C_FULL, "Full", FALSE},
00033 {"LLTC", C_LLT, "LLT", FALSE},
00034 {"XFORMC", C_XFORM, "Xform", FALSE},
00035 {NULL,0,NULL,FALSE}
00036 };
00038 static OptionStr optdur[] = {
00039 {"NULLD", D_NULL, "Null", TRUE},
00040 {"POISSOND", D_POISSON, "Poisson", FALSE},
00041 {"GAMMAD", D_GAMMA, "Gamma", FALSE},
00042 {"GEND", D_GEN, "Gen", FALSE},
00043 {NULL,0,NULL,FALSE}
00044 };
00045
00046 extern char *rdhmmdef_token;
00047
00048
00055 static void
00056 read_global_opt(FILE *fp, HTK_HMM_Options *op)
00057 {
00058 int i;
00059 short tmptype;
00060
00061 for (;;) {
00062 if (rdhmmdef_token == NULL) break;
00063 if (currentis("HMMSETID")) {
00064 read_token(fp);
00065 NoTokErr("missing HMMSETID argument");
00066 } else if (currentis("STREAMINFO")) {
00067 read_token(fp);
00068 NoTokErr("missing STREAMINFO num");
00069 op->stream_info.num = atoi(rdhmmdef_token);
00070
00071 if (op->stream_info.num > 50) {
00072 j_printerr("stream num exceeded %d\n", 50);
00073 rderr(NULL);
00074 }
00075 for (i=0;i<op->stream_info.num;i++) {
00076 read_token(fp);
00077 NoTokErr("missing STREAMINFO vector size");
00078 op->stream_info.vsize[i] = atoi(rdhmmdef_token);
00079
00080 }
00081
00082
00083 } else if (currentis("VECSIZE")) {
00084 read_token(fp);
00085 NoTokErr("missing VECSIZE value");
00086 op->vec_size = atoi(rdhmmdef_token);
00087
00088
00089 } else {
00090
00091 for (i=0;optcov[i].name!=NULL;i++) {
00092 if (currentis(optcov[i].name)) {
00093 op->cov_type = optcov[i].type;
00094
00095 goto optloop;
00096 }
00097 }
00098
00099 for (i=0;optdur[i].name!=NULL;i++) {
00100 if (currentis(optdur[i].name)) {
00101 op->dur_type = optdur[i].type;
00102
00103 goto optloop;
00104 }
00105 }
00106
00107 tmptype = param_str2code(rdhmmdef_token);
00108 if (tmptype != F_ERR_INVALID) {
00109 op->param_type = tmptype;
00110
00111 goto optloop;
00112 } else {
00113
00114 if(rdhmmdef_token[0] != '~') {
00115 j_printerr("Error: unknown option in header: %s\n", rdhmmdef_token);
00116 rderr("unknown option in header");
00117 }
00118 return;
00119 }
00120 }
00121 optloop:
00122 read_token(fp);
00123 }
00124 }
00125
00132 void
00133 set_global_opt(FILE *fp, HTK_HMM_INFO *hmm)
00134 {
00135 read_global_opt(fp,&(hmm->opt));
00136 }
00137
00138
00147 static char *
00148 get_opttype_str(OptionStr *confdata, short type)
00149 {
00150 int i;
00151 for (i = 0; confdata[i].name != NULL; i++) {
00152 if (confdata[i].type == type) {
00153 return(confdata[i].name);
00154 }
00155 }
00156 rderr("unknown typecode in header!");
00157 return(NULL);
00158 }
00159
00167 char *
00168 get_cov_str(short covtype)
00169 {
00170 return(get_opttype_str(optcov, covtype));
00171 }
00172
00180 char *
00181 get_dur_str(short durtype)
00182 {
00183 return(get_opttype_str(optdur, durtype));
00184 }