MATLAB functions that interface with the HTK Speech Recognition Toolkit (http://htk.eng.cam.ac.uk/) for training HMMs, GMMs and simple speech recognizers.
Matlab Shell
Switch branches/tags
Nothing to show
Clone or download
Permalink
Failed to load latest commit information.
COPYING added documentation and licensing information Nov 6, 2007
README isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
apply_mllr_transform.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
compose_hmms.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
eval_htk_recognizer.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
get_htk_path.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
get_temp_filename.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
htkread.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
htkwrite.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
kmeans.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
learn_mllr_transform.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
logsum.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
read_htk_hmm.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
read_text_file.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
train_gmm_htk.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
train_hmm_htk.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
train_htk_recognizer.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
train_htk_recognizer.sh isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
write_htk_bnf.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
write_htk_hmm.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
write_htk_slf.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010
write_text_file.m isolated matlab_htk from original monolithic ronw-matlab-tools reposi… Jan 6, 2010

README

This package contains a set of functions for calling interfacing with
HTK from Matlab.  Right now its mostly limited to training GMMs and
HMMs.  It converts your Matlab data into a format that HTK understands
and calls HTK command line programs.  The path to the HTK binaries is
hardcoded in get_htk_path.m

The portions written by me are distributed under the terms of the GNU
General Public License.  See the file COPYING for details.

Unforuntately this has not been very thoroughly tested, but it has
been working for me.  If anyone wants to write some unit tests using
http://mlunit.sf.net or something similar I won't say no.


* Functions

They are all reasonably commented...

 - The important ones:
   - train_hmm_htk        - use HTK to train an HMM
   - train_gmm_htk        - use HTK to train a GMM
   - train_htk_recognizer - train a simple HTK recognizer
   - eval_htk_recognizer  - recognize signal using HTK recognizer

 - Utility functions:
   - read_htk_hmm     - read in an HTK HMM definition (text format only)
   - write_htk_hmm    - write an HMM structure as an HTK HMM definition
   - htkread/htkwrite - read/write a Matlab matrix in HTK feature file format
                        (written by Mark Hasegawa-Johnson)
   - compose_hmms     - does FSM composition to form a big HMM from many
                        small HMMs (i.e. get an HMM to recognize a
                        sentence from a bunch of phone HMMs).
   - kmeans           - uses k-means to learn clusters from data.  Used to
                        initialize GMMs and HMMs.
   - logsum           - takes the sum of a matrix of log likelihoods
   - get_htk_path     - centralized location to set the path to the HTK binaries
 
* Data Structures

The functions in this toolbox pass around the following structures:
Note: all probabilities are stored as log probabilities

** GMM
  - gmm.nmix   - number of components in the mixture
  - gmm.priors - array of prior log probabilities over each state
  - gmm.means  - matrix of means (column x is mean of component x)
  - gmm.covars - matrix of covariance (column x is the diagonal of the
                 covariance matrix of component x)

** HMM with GMM observations
  - hmm.name          - 
  - hmm.nstates       - number of states in the HMM
  - hmm.emission_type - 'GMM'
  - hmm.start_prob    - array of log probs P(first observation is state x)
  - hmm.end_prob      - array of log probs P(last observation is state x)
  - hmm.transmat      - matrix of transition log probs (transmat(x,y) 
                        = log(P(transition from state x to state y)))
  - hmm.labels        - optional cell array of labels for each state in the HMM
                        (for use in composing HMMs)
  - hmm.gmms          - array of GMM structures 

** HMM with Gaussian observations
  - hmm.nstates       - number of states in the HMM
  - hmm.emission_type - 'gaussian'
  - hmm.start_prob    - array of log probs P(first observation is state x)
  - hmm.end_prob      - array of log probs P(last observation is state x)
  - hmm.transmat      - matrix of transition log probs (transmat(x,y) 
                        = log(P(transition from state x to state y)))
  - hmm.labels        - optional cell array of labels for each state in the HMM
                        (for use in composing HMMs)
  - hmm.means         - matrix of means (column x is mean of state x)
  - hmm.covars        - matrix of means (column x is the diagonal of the
                        covariance matrix of component x)

Note that each row of exp(hmm.transmat) does not necessarily sum to 1
because for each state x there is some probability
(exp(hmm.exit_prob(x))) that the next transition will be to a
non-emitting exit state (i.e. the current observation is the last
observation in the sequence).  The correct invariant is:
sum(exp(hmm.transmat, 2)) + exp(hmm.exit_prob) == ones(hmm.nstates, 1)


2007-11-06 Ron Weiss <ronw@ee.columbia.edu>