/** * @file vocabulary.h * * * @brief 単語辞書の構造体定義 * * このファイルは認識で用いられる単語辞書を定義します.単語辞書は単語の読み, * 出力文字列,音素列の他に,文の開始・終了単語や透過単語情報も保持します. * * N-gramに出現する語彙の辞書は NGRAM_INFO に格納され,この認識用単語辞書とは * 区別されることに注意して下さい.単語辞書からN-gramの語彙へのマッピングは * WORD_INFO 内の wton[] によって行なわれます.またDFAの場合,wton は * その単語が属するDFA_INFO 内のカテゴリ番号を含みます. * * * @brief Word dictionary for recognition * * This file defines data structure for word dictionary used in recognition. * It stores word's string, output string, phoneme sequence, transparency. * Beginning-of-sentence word and End-of-sentence word guessed from runtime * environment is also stored here. * * Please note that the N-gram vocabulary is stored in NGRAM_INFO and it * can differ from this word dictionary. The reference from the word * dictionary to a N-gram vocabulary is done by wton[] member in WORD_INFO. * When used with DFA, the wton[] holds a category number to which each word * belongs. * * * @author Akinobu LEE * @date Sat Feb 12 12:38:13 2005 * * $Revision: 1.9 $ * */ /* * Copyright (c) 1991-2012 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology * All rights reserved */ #ifndef __SENT_VOCA_H__ #define __SENT_VOCA_H__ #include #include /// Memory allocation step in number of words when loading a word dictionary #define MAXWSTEP 4000 /// Word dictionary structure to hold vocabulary typedef struct { WORD_ID maxnum; ///< Allocated number of word space WORD_ID num; ///< Number of words WORD_ID errnum; ///< Number of error words that were skipped when reading dictionary WORD_ID linenum; ///< Current line number while loading boolean do_conv; ///< TRUE if needs conversion while loading boolean ok_flag; ///< FALSE if any error occur while loading unsigned char *wlen; ///< Number of phonemes for each word [wid] char **wname; ///< Word name string for each word [wid]. With DFA, it's category ID. With N-gram, it's N-gram entry name. char **woutput; ///< Word output string that will be output as recognition result for each word [wid] HMM_Logical ***wseq; ///< Phone sequence of each word [wid][0..wlen[wid]-1] WORD_ID *wton; ///< Reference to N-gram/category ID of each word ID [wid] #ifdef CLASS_NGRAM LOGPROB *cprob; ///< Class probability of each word [wid] WORD_ID cwnum; ///< Number of words whose class prob is specified (just for a statistic) #endif WORD_ID head_silwid; ///< Word ID of beginning-of-sentence silence WORD_ID tail_silwid; ///< Word ID of end-of-sentence silence short maxwn; ///< Maximum number of %HMM states per word (statistic) short maxwlen; ///< Maximum number of phones in a word (statistic) int totalstatenum; ///< Total number of HMM states int totalmodelnum; ///< Total number of models (phonemes) int totaltransnum; ///< Total number of state transitions boolean *is_transparent; ///< TRUE if the word can be treated as transparent [wid] APATNODE *errph_root; ///< Root node of index tree for gathering error %HMM name appeared when reading the dictionary BMALLOC_BASE *mroot; ///< Pointer for block memory allocation void *work; ///< Work buffer for dictionary reading int work_num; ///< Num of elements in work } WORD_INFO; #ifdef __cplusplus extern "C" { #endif WORD_INFO *word_info_new(); void word_info_free(WORD_INFO *winfo); void winfo_init(WORD_INFO *winfo); boolean winfo_expand(WORD_INFO *winfo); boolean init_voca(WORD_INFO *winfo, char *filename, HTK_HMM_INFO *hmminfo, boolean, boolean); boolean init_wordlist(WORD_INFO *winfo, char *filename, HTK_HMM_INFO *hmminfo, char *headphone, char *tailphone, char *contextphone, boolean force_dict); void voca_set_stats(WORD_INFO *winfo); void voca_load_start(WORD_INFO *winfo, HTK_HMM_INFO *hmminfo, boolean ignore_tri_conv); boolean voca_load_line(char *buf, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo); boolean voca_load_end(WORD_INFO *winfo); boolean voca_load_htkdict(FILE *, WORD_INFO *, HTK_HMM_INFO *, boolean); boolean voca_load_htkdict_fp(FILE *, WORD_INFO *, HTK_HMM_INFO *, boolean); boolean voca_append_htkdict(char *entry, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo, boolean ignore_tri_conv); boolean voca_append(WORD_INFO *dstinfo, WORD_INFO *srcinfo, int coffset, int woffset); boolean voca_load_htkdict_line(char *buf, WORD_ID *vnum, int linenum, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo, boolean do_conv, boolean *ok_flag); boolean voca_load_word_line(char *buf, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo, char *headphone, char *tailpohone, char *contextphone); boolean voca_load_wordlist(FILE *fp, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo, char *headphone, char *tailphone, char *contextphone); boolean voca_load_wordlist_fp(FILE *fp, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo, char *headphone, char *tailphone, char *contextphone); boolean voca_load_wordlist_line(char *buf, WORD_ID *vnum, int linenum, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo, boolean do_conv, boolean *ok_flag, char *headphone, char *tailphone, char *contextphone); boolean voca_mono2tri(WORD_INFO *winfo, HTK_HMM_INFO *hmminfo); WORD_ID voca_lookup_wid(char *, WORD_INFO *); WORD_ID *new_str2wordseq(WORD_INFO *, char *, int *); char *cycle_triphone(char *p); char *cycle_triphone_flush(); void print_voca_info(FILE *fp, WORD_INFO *); void put_voca(FILE *fp, WORD_INFO *winfo, WORD_ID wid); /* HMMList check */ boolean make_base_phone(HTK_HMM_INFO *hmminfo, WORD_INFO *winfo); void print_phone_info(FILE *fp, HTK_HMM_INFO *hmminfo); void print_all_basephone_detail(HMM_basephone *base); void print_all_basephone_name(HMM_basephone *base); void test_interword_triphone(HTK_HMM_INFO *hmminfo, WORD_INFO *winfo); #ifdef __cplusplus } #endif #endif /* __SENT_VOCA_H__ */