|
#define | MAX_N_FRAMES MAX_INT32 |
| Maximum number of frames in index, should be in sync with above.
|
|
#define | SENSCR_SHIFT 10 |
| Shift count for senone scores.
|
|
#define | WORST_SCORE ((int)0xE0000000) |
| Large "bad" score.
|
|
#define | TMAT_WORST_SCORE (-255) |
| Watch out, though! Transition matrix entries that are supposed to be "zero" don't actually get that small due to quantization.
|
|
#define | BETTER_THAN > |
| Is one score better than another?
|
|
#define | WORSE_THAN < |
| Is one score worse than another?
|
|
#define | HMM_MAX_NSTATE 5 |
| Hard-coded limit on the number of emitting states.
|
|
#define | hmm_context(h) (h)->ctx |
| Access macros.
|
|
#define | hmm_is_mpx(h) (h)->mpx |
|
#define | hmm_in_score(h) (h)->score[0] |
|
#define | hmm_score(h, st) (h)->score[st] |
|
#define | hmm_out_score(h) (h)->out_score |
|
#define | hmm_in_history(h) (h)->history[0] |
|
#define | hmm_history(h, st) (h)->history[st] |
|
#define | hmm_out_history(h) (h)->out_history |
|
#define | hmm_bestscore(h) (h)->bestscore |
|
#define | hmm_frame(h) (h)->frame |
|
#define | hmm_mpx_ssid(h, st) (h)->senid[st] |
|
#define | hmm_nonmpx_ssid(h) (h)->ssid |
|
#define | hmm_ssid(h, st) |
|
#define | hmm_mpx_senid(h, st) |
|
#define | hmm_nonmpx_senid(h, st) ((h)->senid[st]) |
|
#define | hmm_senid(h, st) |
|
#define | hmm_senscr(h, st) |
|
#define | hmm_tmatid(h) (h)->tmatid |
|
#define | hmm_tprob(h, i, j) (-(h)->ctx->tp[hmm_tmatid(h)][i][j]) |
|
#define | hmm_n_emit_state(h) ((h)->n_emit_state) |
|
#define | hmm_n_state(h) ((h)->n_emit_state + 1) |
|
#define | hmm_context_set_senscore(ctx, senscr) ((ctx)->senscore = (senscr)) |
| Change the senone score array for a context.
|
|
|
hmm_context_t * | hmm_context_init (int32 n_emit_state, uint8 **const *tp, int16 const *senscore, uint16 *const *sseq) |
| Create an HMM context.
|
|
void | hmm_context_free (hmm_context_t *ctx) |
| Free an HMM context.
|
|
void | hmm_init (hmm_context_t *ctx, hmm_t *hmm, int mpx, int ssid, int tmatid) |
| Populate a previously-allocated HMM structure, allocating internal data.
|
|
void | hmm_deinit (hmm_t *hmm) |
| Free an HMM structure, releasing internal data (but not the HMM structure itself).
|
|
void | hmm_clear (hmm_t *h) |
| Reset the states of the HMM to the invalid condition.
|
|
void | hmm_clear_scores (hmm_t *h) |
| Reset the scores of the HMM.
|
|
void | hmm_normalize (hmm_t *h, int32 bestscr) |
| Renormalize the scores in this HMM based on the given best score.
|
|
void | hmm_enter (hmm_t *h, int32 score, int32 histid, int frame) |
| Enter an HMM with the given path score and history ID.
|
|
int32 | hmm_vit_eval (hmm_t *hmm) |
| Viterbi evaluation of given HMM.
|
|
int32 | hmm_dump_vit_eval (hmm_t *hmm, FILE *fp) |
| Like hmm_vit_eval, but dump HMM state and relevant senscr to fp first, for debugging;.
|
|
void | hmm_dump (hmm_t *h, FILE *fp) |
| For debugging, dump the whole HMM out.
|
|
Implementation of HMM base structure.
HMM data structure and operation.
Hidden Markov Model base structures.
For efficiency, this version is hardwired for two possible HMM topologies, but will fall back to others:
5-state left-to-right HMMs: (0 is the emitting entry state and E is a non-emitting exit state; the x's indicate allowed transitions between source and destination states):
0 1 2 3 4 E (destination-states)
0 x x x
1 x x x
2 x x x
3 x x x
4 x x
(source-states)
5-state topologies that contain a subset of the above transitions should work as well.
3-state left-to-right HMMs (similar notation as the 5-state topology above):
0 1 2 E (destination-states)
0 x x x
1 x x x
2 x x
(source-states)
3-state topologies that contain a subset of the above transitions should work as well.
Definition in file hmm.h.