/** * Top function to read word dictionary via normal file pointer. * * @param fp [in] file pointer * @param winfo [out] pointer to word dictionary to store the read data. * @param hmminfo [in] HTK %HMM definition data. if NULL, phonemes are ignored. * @param ignore_tri_conv [in] TRUE if triphone conversion is ignored * * @return TRUE on success, FALSE on any error word. */ boolean voca_load_htkdict_fp(FILE *fp, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo, boolean ignore_tri_conv) { boolean ret; voca_load_start(winfo, hmminfo, ignore_tri_conv); while(getl_fp(buf, MAXLINELEN, fp) != NULL) { if (voca_load_line(buf, winfo, hmminfo) == FALSE) break; } ret = voca_load_end(winfo); return(ret); }
/** * Top function to read word list via file pointer * * @param fp [in] file pointer * @param winfo [out] pointer to word dictionary to store the read data. * @param hmminfo [in] HTK %HMM definition data. if NULL, phonemes are ignored. * @param headphone [in] word head silence model name * @param tailphone [in] word tail silence model name * @param contextphone [in] silence context name to be used at head and tail * * @return TRUE on success, FALSE on any error word. */ boolean voca_load_wordlist_fp(FILE *fp, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo, char *headphone, char *tailphone, char *contextphone) { boolean ret; voca_load_start(winfo, hmminfo, FALSE); while (getl_fp(buf, sizeof(buf), fp) != NULL) { if (voca_load_word_line(buf, winfo, hmminfo, headphone, tailphone, contextphone) == FALSE) break; } ret = voca_load_end(winfo); return(ret); }
/** * @brief Begin reading audio data from a file. * * If listfile was specified in adin_sndfile_standby(), the next filename * will be read from the listfile. Otherwise, the * filename will be obtained from stdin. Then the file will be opened here. * * @param filename [in] file name to open or NULL for prompt * * @return TRUE on success, FALSE on failure. */ boolean adin_sndfile_begin(char *filename) { boolean readp; if (filename != NULL) { if (adin_sndfile_open(filename) == FALSE) { jlog("Error: adin_sndfile: invalid format: \"%s\"\n", filename); print_format(&sinfo); return FALSE; } jlog("Stat: adin_sndfile: input speechfile: %s\n", filename); print_format(&sinfo); strcpy(speechfilename, filename); return TRUE; } /* ready to read next input */ readp = FALSE; while(readp == FALSE) { if (from_file) { /* read file name from listfile */ do { if (getl_fp(speechfilename, MAXPATHLEN, fp_list) == NULL) { /* end of input */ fclose(fp_list); return(FALSE); /* end of input */ } } while (speechfilename[0] == '#'); /* skip comment */ } else { /* read file name from stdin */ if (get_line_from_stdin(speechfilename, MAXPATHLEN, "enter filename->") == NULL) { return (FALSE); /* end of input */ } } if (adin_sndfile_open(speechfilename) == FALSE) { jlog("Error: adin_sndfile: invalid format: \"%s\"\n",speechfilename); print_format(&sinfo); } else { jlog("Stat: adin_sndfile: input speechfile: %s\n",speechfilename); print_format(&sinfo); readp = TRUE; } } return TRUE; }
/** * Top loop function to read DFA grammar via file descriptor * * @param fp [in] file pointer that points to the DFA grammar data * @param dinfo [out] the read data will be stored in this DFA grammar structure * * @return TRUE on success, FALSE on failure. */ boolean rddfa_fp(FILE *fp, DFA_INFO *dinfo) { int state_max, arc_num, terminal_max; /* initialize */ dfa_state_init(dinfo); state_max = 0; arc_num = 0; terminal_max = 0; while(getl_fp(buf, MAXLINELEN, fp) != NULL) { if (rddfa_line(buf, dinfo, &state_max, &arc_num, &terminal_max) == FALSE) { break; } } dinfo->state_num = state_max + 1; dinfo->arc_num = arc_num; dinfo->term_num = terminal_max + 1; return(TRUE); }
/** * <JA> * @brief 単語辞書をファイルから読み込んでセットアップする. * * 辞書上のモノフォン表記からトライフォンへの計算は init_voca() で * 読み込み時に行われる. このため,辞書読み込み時には,認識で使用する * 予定のHMM情報を与える必要がある. * * N-gram 使用時は,文頭無音単語およぶ文末無音単語をここで設定する. * また,"-iwspword" 指定時は,ポーズ単語を辞書の最後に挿入する. * * </JA> * <EN> * @brief Read in word dictionary from a file and setup for recognition. * * Monophone-to-triphone conversion will be performed inside init_voca(). * So, an HMM definition data that will be used with the LM should also be * specified as an argument. * * When reading dictionary for N-gram, sentence head silence word and * tail silence word will be determined in this function. Also, * when an option "-iwspword" is specified, this will insert a pause * word at the last of the given dictionary. * * </EN> * * @param lmconf [in] LM configuration variables * @param hmminfo [in] HMM definition of each phone in dictionary, for * phone checking and monophone-to-triphone conversion. * * @return the newly created word dictionary structure, or NULL on failure. * */ static WORD_INFO * initialize_dict(JCONF_LM *lmconf, HTK_HMM_INFO *hmminfo) { WORD_INFO *winfo; JCONF_LM_NAMELIST *nl; char buf[MAXLINELEN]; int n; /* allocate new word dictionary */ winfo = word_info_new(); /* read in dictinary from file */ if ( ! #ifdef MONOTREE /* leave winfo monophone for 1st pass lexicon tree */ init_voca(winfo, lmconf->dictfilename, hmminfo, TRUE, lmconf->forcedict_flag) #else init_voca(winfo, lmconf->dictfilename, hmminfo, FALSE, lmconf->forcedict_flag) #endif ) { jlog("ERROR: m_fusion: failed to read dictionary, terminated\n"); word_info_free(winfo); return NULL; } /* load additional entries */ for (nl = lmconf->additional_dict_files; nl; nl=nl->next) { FILE *fp; if ((fp = fopen(nl->name, "rb")) == NULL) { jlog("ERROR: m_fusion: failed to open %s\n",nl->name); word_info_free(winfo); return NULL; } n = winfo->num; while (getl_fp(buf, MAXLINELEN, fp) != NULL) { if (voca_load_line(buf, winfo, hmminfo) == FALSE) break; } if (voca_load_end(winfo) == FALSE) { if (lmconf->forcedict_flag) { jlog("Warning: m_fusion: the error words above are ignored\n"); } else { jlog("ERROR: m_fusion: error in reading dictionary %s\n", nl->name); fclose(fp); word_info_free(winfo); return NULL; } } if (fclose(fp) == -1) { jlog("ERROR: m_fusion: failed to close %s\n", nl->name); word_info_free(winfo); return NULL; } jlog("STAT: + additional dictionary: %s (%d words)\n", nl->name, winfo->num - n); } n = winfo->num; for (nl = lmconf->additional_dict_entries; nl; nl=nl->next) { if (voca_load_line(nl->name, winfo, hmminfo) == FALSE) { jlog("ERROR: m_fusion: failed to set entry: %s\n", nl->name); } } if (lmconf->additional_dict_entries) { if (voca_load_end(winfo) == FALSE) { jlog("ERROR: m_fusion: failed to read additinoal word entry\n"); word_info_free(winfo); return NULL; } jlog("STAT: + additional entries: %d words\n", winfo->num - n); } if (lmconf->lmtype == LM_PROB) { /* if necessary, append a IW-sp word to the dict if "-iwspword" specified */ if (lmconf->enable_iwspword) { if ( #ifdef MONOTREE voca_append_htkdict(lmconf->iwspentry, winfo, hmminfo, TRUE) #else voca_append_htkdict(lmconf->iwspentry, winfo, hmminfo, FALSE) #endif == FALSE) { jlog("ERROR: m_fusion: failed to make IW-sp word entry \"%s\"\n", lmconf->iwspentry); word_info_free(winfo); return NULL; } else { jlog("STAT: 1 IW-sp word entry added\n"); } } /* set {head,tail}_silwid */ winfo->head_silwid = voca_lookup_wid(lmconf->head_silname, winfo); if (winfo->head_silwid == WORD_INVALID) { /* not exist */ jlog("ERROR: m_fusion: head sil word \"%s\" not exist in voca\n", lmconf->head_silname); word_info_free(winfo); return NULL; } winfo->tail_silwid = voca_lookup_wid(lmconf->tail_silname, winfo); if (winfo->tail_silwid == WORD_INVALID) { /* not exist */ jlog("ERROR: m_fusion: tail sil word \"%s\" not exist in voca\n", lmconf->tail_silname); word_info_free(winfo); return NULL; } } return(winfo); }
/** * Read and parse an HTK Config file, and set the specified option values. * * @param HTKconffile [in] HTK Config file path name * @param para [out] MFCC parameter to set * * @return TRUE on success, FALSE on failure. */ boolean htk_config_file_parse(char *HTKconffile, Value *para) { FILE *fp; char buf[512]; char *p, *d, *a; float srate; boolean skipped; jlog("Stat: para: parsing HTK Config file: %s\n", HTKconffile); /* convert the content into argument list c_argv[1..c_argc-1] */ /* c_argv[0] will be the original conffile name */ if ((fp = fopen(HTKconffile, "r")) == NULL) { jlog("Error: para: failed to open HTK Config file: %s\n", HTKconffile); return FALSE; } srate = 0.0; while (getl_fp(buf, 512, fp) != NULL) { p = buf; if (*p == 35) { /* skip comment line */ continue; } /* parse the input line to get directive and argument */ while (*p != '\0' && ISTOKEN(*p)) p++; if (*p == '\0') continue; d = p; while (*p != '\0' && (!ISTOKEN(*p)) && *p != '=') p++; if (*p == '\0') continue; *p = '\0'; p++; while (*p != '\0' && ((ISTOKEN(*p)) || *p == '=')) p++; if (*p == '\0') continue; a = p; while (*p != '\0' && (!ISTOKEN(*p))) p++; *p = '\0'; /* process arguments */ skipped = FALSE; if (strmatch(d, "SOURCERATE")) { /* -smpPeriod */ srate = atof(a); } else if (strmatch(d, "TARGETRATE")) { /* -fshift */ para->frameshift = atof(a); } else if (strmatch(d, "WINDOWSIZE")) { /* -fsize */ para->framesize = atof(a); } else if (strmatch(d, "ZMEANSOURCE")) { /* -zmeansource */ para->zmeanframe = (a[0] == 'T') ? TRUE : FALSE; } else if (strmatch(d, "USEPOWER")) { /* -usepower */ para->usepower = (a[0] == 'T') ? TRUE : FALSE; } else if (strmatch(d, "PREEMCOEF")) { /* -preemph */ para->preEmph = atof(a); } else if (strmatch(d, "USEHAMMING")) { /* (fixed to T) */ if (a[0] != 'T') { jlog("Error: para: USEHAMMING should be T\n", HTKconffile); return FALSE; } } else if (strmatch(d, "NUMCHANS")) { /* -fbank */ para->fbank_num = atoi(a); } else if (strmatch(d, "CEPLIFTER")) { /* -ceplif */ para->lifter = atoi(a); } else if (strmatch(d, "DELTAWINDOW")) { /* -delwin */ para->delWin = atoi(a); } else if (strmatch(d, "ACCWINDOW")) { /* -accwin */ para->accWin = atoi(a); } else if (strmatch(d, "LOFREQ")) { /* -lofreq */ para->lopass = atof(a); } else if (strmatch(d, "HIFREQ")) { /* -hifreq */ para->hipass = atof(a); } else if (strmatch(d, "RAWENERGY")) { /* -rawe */ para->raw_e = (a[0] == 'T') ? TRUE : FALSE; } else if (strmatch(d, "ENORMALISE")) { /* -enormal */ para->enormal = (a[0] == 'T') ? TRUE : FALSE; } else if (strmatch(d, "ESCALE")) { /* -escale */ para->escale = atof(a); } else if (strmatch(d, "SILFLOOR")) { /* -silfloor */ para->silFloor = atof(a); } else if (strmatch(d, "WARPFREQ")) { /* -vtln (1) */ para->vtln_alpha = atof(a); } else if (strmatch(d, "WARPLCUTOFF")) { /* -vtln (2) */ para->vtln_lower = atof(a); } else if (strmatch(d, "WARPUCUTOFF")) { /* -vtln (3) */ para->vtln_upper = atof(a); } else if (strmatch(d, "TARGETKIND")) { jlog("Warning: para: TARGETKIND skipped (will be determined by AM header)\n"); skipped = TRUE; } else if (strmatch(d, "NUMCEPS")) { jlog("Warning: para: NUMCEPS skipped (will be determined by AM header)\n"); skipped = TRUE; } else { jlog("Warning: para: \"%s\" ignored (not supported, or irrelevant)\n", d); skipped = TRUE; } if (!skipped) { jlog("Stat: para: %s=%s\n", d, a); } } if (srate == 0.0) { jlog("Warning: no SOURCERATE found\n"); jlog("Warning: assume source waveform sample rate to 625 (16kHz)\n"); srate = 625; } para->smp_period = srate; para->smp_freq = period2freq(para->smp_period); para->frameshift /= srate; para->framesize /= srate; if (fclose(fp) == -1) { jlog("Error: para: failed to close file\n"); return FALSE; } para->loaded = 1; return TRUE; }