/**
* @file hmm_calc.h
*
*
* @brief Work area and outprob cache for acoustic computation.
*
*
*
* @brief 音響尤度計算用ワークエリアとキャッシュ
*
*
*
* @author Akinobu LEE
* @date Thu Feb 10 14:54:06 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_HMM_CALC_H__
#define __SENT_HMM_CALC_H__
#include
#include
#include
/**
* @brief Symbols to specify which Gaussian pruning algorithm to use.
*
* - GPRUNE_SEL_UNDEF: unspecified by user
* - GPRUNE_SEL_NONE: no pruning
* - GPRUNE_SEL_SAFE: safe pruning
* - GPRUNE_SEL_HEURISTIC: heuristic pruning
* - GPRUNE_SEL_BEAM: beam pruning
* - GPRUNE_SEL_USER: user-defined function
*
*/
enum{GPRUNE_SEL_UNDEF, GPRUNE_SEL_NONE, GPRUNE_SEL_SAFE, GPRUNE_SEL_HEURISTIC, GPRUNE_SEL_BEAM, GPRUNE_SEL_USER};
/**
* @brief Score beam offset for GPRUNE_SEL_BEAM.
*
* Larger value may ease pruning error, but processing may become slower.
* Smaller value can speed up the acoustic computation, but may cause error.
*
*/
#define TMBEAMWIDTH 5.0
/// A component of per-codebook probability cache while search
typedef struct {
LOGPROB score; ///< Cached probability of below
int id; ///< ID of the cached Gaussian in the codebook
} MIXCACHE;
/**
* Work area and cache for %HMM computation
*
*/
typedef struct __hmmwork__{
/* pointer to functions, selected by model configuration */
/// Function to compute output probability with/without code book level cache
LOGPROB (*calc_outprob)(struct __hmmwork__ *);
/// Function to compute state output with/without GMS support
LOGPROB (*calc_outprob_state)(struct __hmmwork__ *);
/// Pruning function to compute likelihood of a mixture component
void (*compute_gaussset)(struct __hmmwork__ *, HTK_HMM_Dens **g, int num, int *last_id, int lnum);
/// Initialization function that corresponds to compute_gaussset.
boolean (*compute_gaussset_init)(struct __hmmwork__ *);
/// Function to Free above
void (*compute_gaussset_free)(struct __hmmwork__ *);
/* local storage of pointers to the HMM */
HTK_HMM_INFO *OP_hmminfo; ///< Current %HMM definition data
HTK_HMM_INFO *OP_gshmm; ///< Current GMS %HMM data
/* local storage of input parameters */
HTK_Param *OP_param; ///< Current parameter
int OP_gprune_num; ///< Current number of computed mixtures for pruning
int OP_time; ///< Current time
int OP_last_time; ///< last time
/* current computing state */
HTK_HMM_State *OP_state; ///< Current state
int OP_state_id; ///< Current state ID
/* for multi-stream input */
short OP_nstream; ///< Number of input stream (copy from header)
VECT *OP_vec_stream[MAXSTREAMNUM]; ///< input vector for each stream at current frame
short OP_veclen_stream[MAXSTREAMNUM]; ///< vector length for each stream
/* temporal buffers to hold result of mixture computation at each stream */
VECT *OP_vec; ///< Current input vector to be computed
short OP_veclen; ///< Current vector length to be computed
int OP_calced_maxnum; ///< Allocated length of below
LOGPROB *OP_calced_score; ///< Scores of computed mixtures
int *OP_calced_id; ///< IDs of computed mixtures
int OP_calced_num; ///< Number of computed mixtures
/* state level cache */
int statenum; ///< Local work area that holds total number of HMM states in the %HMM definition data
LOGPROB **outprob_cache; ///< State-level cache [t][stateid]
int outprob_allocframenum; ///< Allocated frames of the cache
BMALLOC_BASE *croot; ///< Root alloc pointer to state outprob cache
LOGPROB *last_cache; ///< Local work are to hold cache list of current time
/* mixture level cache for tied-mixture model */
MIXCACHE ***mixture_cache; ///< Codebook cache: [time][book_id][0..computed_mixture_num]
short **mixture_cache_num; ///< Num of mixtures to be calculated and stored in mixture_cache
BMALLOC_BASE *mroot; ///< Root alloc pointer to state outprob cache
/* work area for tied-mixture computation */
int *tmix_last_id; ///< List of computed mixture id on the previous input frame
int tmix_allocframenum; ///< Allocated frame length of codebook cache
/* work area for gaussian pruning (common) */
boolean *mixcalced; ///< Mark which Gaussian has been computed
/* for beam gaussian pruning */
LOGPROB *dimthres; ///< Threshold for each dimension (inversed)
int dimthres_num; ///< Length of above
/* for heuristic gaussian pruning */
LOGPROB *backmax; ///< Backward sum of max for each dimension (inversed)
int backmax_num; ///< Length of above
/* work area for outprob_cd_nbest */
LOGPROB *cd_nbest_maxprobs; ///< Work area that holds N-best state scores for pseudo state set
int cd_nbest_maxn; ///< Allocated length of above
/* work area for GMS */
/* GMS variables */
int my_nbest; ///< Number of states to be selected
int gms_allocframenum; ///< Allocated number of frame for storing fallback scores per frame
/* GMS info */
GS_SET *gsset; ///< Set of GS states
int gsset_num; ///< Num of above
int *state2gs; ///< Mapping from triphone state id to gs id
/* GMS results */
boolean *gms_is_selected; ///< TRUE if the frame is already selected
LOGPROB **fallback_score; ///< [t][gssetid], LOG_ZERO if selected
/* GMS calculation */
int *gsindex; ///< Index buffer
LOGPROB *t_fs; ///< Current fallback_score
/* GMS gprune local cache */
int **gms_last_max_id_list; ///< maximum mixture id of last call for each states
} HMMWork;
#ifdef __cplusplus
extern "C" {
#endif
/* addlog.c */
void make_log_tbl();
LOGPROB addlog(LOGPROB x, LOGPROB y);
LOGPROB addlog_array(LOGPROB *x, int n);
/* outprob_init.c */
boolean
outprob_init(HMMWork *wrk, HTK_HMM_INFO *hmminfo,
HTK_HMM_INFO *gshmm, int gms_num,
int gprune_method, int gprune_mixnum
);
boolean outprob_prepare(HMMWork *wrk, int framenum);
void outprob_free(HMMWork *wrk);
/* outprob.c */
boolean outprob_cache_init(HMMWork *wrk);
boolean outprob_cache_prepare(HMMWork *wrk);
void outprob_cache_free(HMMWork *wrk);
LOGPROB outprob_state(HMMWork *wrk, int t, HTK_HMM_State *stateinfo, HTK_Param *param);
void outprob_cd_nbest_init(HMMWork *wrk, int num);
void outprob_cd_nbest_free(HMMWork *wrk);
LOGPROB outprob_cd(HMMWork *wrk, int t, CD_State_Set *lset, HTK_Param *param);
/* gms.c */
boolean gms_init(HMMWork *wrk);
boolean gms_prepare(HMMWork *wrk, int framelen);
void gms_free(HMMWork *wrk);
LOGPROB gms_state(HMMWork *wrk);
/* gms_gprune.c */
void gms_gprune_init(HMMWork *wrk);
void gms_gprune_prepare(HMMWork *wrk);
void gms_gprune_free(HMMWork *wrk);
void compute_gs_scores(HMMWork *wrk);
/* calc_mix.c */
LOGPROB calc_mix(HMMWork *wrk);
/* calc_tied_mix.c */
boolean calc_tied_mix_init(HMMWork *wrk);
boolean calc_tied_mix_prepare(HMMWork *wrk, int framenum);
void calc_tied_mix_free(HMMWork *wrk);
LOGPROB calc_tied_mix(HMMWork *wrk);
LOGPROB calc_compound_mix(HMMWork *wrk);
/* gprune_common.c */
int cache_push(HMMWork *wrk, int id, LOGPROB score, int len);
/* gprune_none.c */
LOGPROB compute_g_base(HMMWork *wrk, HTK_HMM_Dens *binfo);
boolean gprune_none_init(HMMWork *wrk);
void gprune_none_free(HMMWork *wrk);
void gprune_none(HMMWork *wrk, HTK_HMM_Dens **g, int num, int *last_id, int lnum);
/* gprune_safe.c */
LOGPROB compute_g_safe(HMMWork *wrk, HTK_HMM_Dens *binfo, LOGPROB thres);
boolean gprune_safe_init(HMMWork *wrk);
void gprune_safe_free(HMMWork *wrk);
void gprune_safe(HMMWork *wrk, HTK_HMM_Dens **g, int gnum, int *last_id, int lnum);
/* gprune_heu.c */
boolean gprune_heu_init(HMMWork *wrk);
void gprune_heu_free(HMMWork *wrk);
void gprune_heu(HMMWork *wrk, HTK_HMM_Dens **g, int gnum, int *last_id, int lnum);
/* gprune_beam.c */
boolean gprune_beam_init(HMMWork *wrk);
void gprune_beam_free(HMMWork *wrk);
void gprune_beam(HMMWork *wrk, HTK_HMM_Dens **g, int gnum, int *last_id, int lnum);
#ifdef __cplusplus
}
#endif
#endif /* __SENT_HMM_CALC_H__ */