/** * @file hmm.h * * * @brief Hidden Marcov Model for recognition. * * This file defines %HMM instance structure for recognition. * When recognition, the required word %HMM or tree lexicon will be built * using these structures referencing word dictionary and HTK %HMM Acoustic * Model (defined in htk_hmm.h), and actual likelihood computation. * * * @brief 認識計算用の Hidden Marcov Model * * このファイルでは, 認識における%HMMの構造体を定義しています. * 認識時には, 辞書および音響モデル構造体 (htk_hmm.h) を元に * 必要な単語%HMMや木構造化辞書がこの構造体を用いて構築され, * 音響尤度計算はこの上で行われます. * * * @author Akinobu LEE * @date Thu Feb 10 14:54:06 2005 * * $Revision: 1.5 $ * */ /* * 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_HMM_NEW2_H__ #define __SENT_HMM_NEW2_H__ #include #include #include #include /// Transition arc of %HMM state typedef struct _a_cell { LOGPROB a; ///< Transition probability in log10 int arc; ///< Transition destination in state ID struct _a_cell *next; ///< Pointer to next transition on the same state } A_CELL; /// %HMM State typedef struct { A_CELL *ac; ///< List of transition arcs from this state /** * @brief Pointer to corresponding output state definition * * When a triphone model is used, if this state is located as a * part of phoneme %HMM on @em word-edge, the corresponding * @em pseudo-triphone, i.e. "*-e+g", "k-a+*", should be assigned. * Otherwise, i.e. if this state is located at @em internal position * of a word, pointer to the corresponding @em physical * (actually defined) %HMM will be assigned. * When a triphone model is used, phoneme %HMMs on @em word-edge should * be @em pseudo-triphone, i.e. "*-e+g", "k-a+*". In this case, the * belonging state should hold the output probability function * in CD_State_Set. * Otherwise, i.e. if this state is located at @em internal position * of a word, pointer to the corresponding @em physical * (actually defined) %HMM will be assigned. */ union { HTK_HMM_State *state; ///< Pointer to the mapped physical %HMM CD_State_Set *cdset; ///< Pointer to the pseudo %HMM } out; boolean is_pseudo_state; ///< TRUE if pseudo %HMM is assigned, FALSE if physical %HMM is assigned } HMM_STATE; /** * @brief %HMM state sequence * * @note This assumes that there is only one transition that goes outside * this %HMM state sequence. */ typedef struct { int len; ///< Length of state HMM_STATE *state; ///< Array of state LOGPROB accept_ac_a; ///< Transition probability outside this sequence (fixed to one) for normal mode } HMM; /** * Token definition for viterbi segmentation. * */ typedef struct _seg_token { int last_id; ///< ID of last unit int last_end_frame; ///< Frame at which the last unit ends LOGPROB last_end_score; ///< Score at which the last unit ends struct _seg_token *next; ///< Pointer to previous token context, NULL if no context struct _seg_token *list; ///< Link to next token, NULL if last } SEGTOKEN; #ifdef __cplusplus extern "C" { #endif /* mkwhmm.c */ HMM *new_make_word_hmm(HTK_HMM_INFO *, HMM_Logical **, int, boolean *); HMM *new_make_word_hmm_with_lm(HTK_HMM_INFO *, HMM_Logical **, int, boolean *, LOGPROB *); void free_hmm(HMM *); /* vsegment.c */ LOGPROB viterbi_segment(HMM *hmm, HTK_Param *param, HMMWork *wrk, boolean multipath, int *endstates, int ulen, int **id_ret, int **seg_ret, LOGPROB **uscore_ret, int *retlen); /* hmminfo/outprob.c */ LOGPROB outprob(HMMWork *wrk, int t, HMM_STATE *hmmstate, HTK_Param *param); /* hmminfo/put_htkdata_info */ void put_hmm_arc(FILE *fp, HMM *d); void put_hmm_outprob(FILE *fp, HMM *d); void put_hmm(FILE *fp, HMM *d); #ifdef __cplusplus } #endif #endif /* __SENT_HMM_NEW2_H__ */