/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ /* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /* * fsg_model.h -- Word-level finite state graph * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 2003 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** */ #ifndef __FSG_MODEL_H__ #define __FSG_MODEL_H__ /* System headers. */ #include #include /* SphinxBase headers. */ #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif #if 0 /* Fool Emacs. */ } #endif /* * A single transition in the FSG. */ typedef struct fsg_link_s { int32 from_state; int32 to_state; int32 logs2prob; /**< log(transition probability)*lw */ int32 wid; /**< Word-ID; <0 if epsilon or null transition */ } fsg_link_t; /* Access macros */ #define fsg_link_from_state(l) ((l)->from_state) #define fsg_link_to_state(l) ((l)->to_state) #define fsg_link_wid(l) ((l)->wid) #define fsg_link_logs2prob(l) ((l)->logs2prob) /** * Adjacency list (opaque) for a state in an FSG. */ typedef struct trans_list_s trans_list_t; /** * Word level FSG definition. * States are simply integers 0..n_state-1. * A transition emits a word and has a given probability of being taken. * There can also be null or epsilon transitions, with no associated emitted * word. */ typedef struct fsg_model_s { int refcount; /**< Reference count. */ char *name; /**< A unique string identifier for this FSG */ int32 n_word; /**< Number of unique words in this FSG */ int32 n_word_alloc; /**< Number of words allocated in vocab */ char **vocab; /**< Vocabulary for this FSG. */ bitvec_t *silwords; /**< Indicates which words are silence/fillers. */ bitvec_t *altwords; /**< Indicates which words are pronunciation alternates. */ logmath_t *lmath; /**< Pointer to log math computation object. */ int32 n_state; /**< number of states in FSG */ int32 start_state; /**< Must be in the range [0..n_state-1] */ int32 final_state; /**< Must be in the range [0..n_state-1] */ float32 lw; /**< Language weight that's been applied to transition logprobs */ trans_list_t *trans; /**< Transitions out of each state, if any. */ listelem_alloc_t *link_alloc; /**< Allocator for FSG links. */ } fsg_model_t; /* Access macros */ #define fsg_model_name(f) ((f)->name) #define fsg_model_n_state(f) ((f)->n_state) #define fsg_model_start_state(f) ((f)->start_state) #define fsg_model_final_state(f) ((f)->final_state) #define fsg_model_log(f,p) logmath_log((f)->lmath, p) #define fsg_model_lw(f) ((f)->lw) #define fsg_model_n_word(f) ((f)->n_word) #define fsg_model_word_str(f,wid) (wid == -1 ? "(NULL)" : (f)->vocab[wid]) /** * Iterator over arcs. */ typedef struct fsg_arciter_s fsg_arciter_t; /** * Have silence transitions been added? */ #define fsg_model_has_sil(f) ((f)->silwords != NULL) /** * Have alternate word transitions been added? */ #define fsg_model_has_alt(f) ((f)->altwords != NULL) #define fsg_model_is_filler(f,wid) \ (fsg_model_has_sil(f) ? bitvec_is_set((f)->silwords, wid) : FALSE) #define fsg_model_is_alt(f,wid) \ (fsg_model_has_alt(f) ? bitvec_is_set((f)->altwords, wid) : FALSE) /** * Create a new FSG. */ SPHINXBASE_EXPORT fsg_model_t *fsg_model_init(char const *name, logmath_t *lmath, float32 lw, int32 n_state); /** * Read a word FSG from the given file and return a pointer to the structure * created. Return NULL if any error occurred. * * File format: * *
 *   Any number of comment lines; ignored
 *   FSG_BEGIN []
 *   N <#states>
 *   S 
 *   F 
 *   T    []
 *   T ...
 *   ... (any number of state transitions)
 *   FSG_END
 *   Any number of comment lines; ignored
 * 
* * The FSG spec begins with the line containing the keyword FSG_BEGIN. * It has an optional fsg name string. If not present, the FSG has the empty * string as its name. * * Following the FSG_BEGIN declaration is the number of states, the start * state, and the final state, each on a separate line. States are numbered * in the range [0 .. -1]. * * These are followed by all the state transitions, each on a separate line, * and terminated by the FSG_END line. A state transition has the given * probability of being taken, and emits the given word. The word emission * is optional; if word-string omitted, it is an epsilon or null transition. * * Comments can also be embedded within the FSG body proper (i.e. between * FSG_BEGIN and FSG_END): any line with a # character in col 1 is treated * as a comment line. * * Return value: a new fsg_model_t structure if the file is successfully * read, NULL otherwise. */ SPHINXBASE_EXPORT fsg_model_t *fsg_model_readfile(const char *file, logmath_t *lmath, float32 lw); /** * Like fsg_model_readfile(), but from an already open stream. */ SPHINXBASE_EXPORT fsg_model_t *fsg_model_read(FILE *fp, logmath_t *lmath, float32 lw); /** * Retain ownership of an FSG. * * @return Pointer to retained FSG. */ SPHINXBASE_EXPORT fsg_model_t *fsg_model_retain(fsg_model_t *fsg); /** * Free the given word FSG. * * @return new reference count (0 if freed completely) */ SPHINXBASE_EXPORT int fsg_model_free(fsg_model_t *fsg); /** * Add a word to the FSG vocabulary. * * @return Word ID for this new word. */ SPHINXBASE_EXPORT int fsg_model_word_add(fsg_model_t *fsg, char const *word); /** * Look up a word in the FSG vocabulary. * * @return Word ID for this word */ SPHINXBASE_EXPORT int fsg_model_word_id(fsg_model_t *fsg, char const *word); /** * Add the given transition to the FSG transition matrix. * * Duplicates (i.e., two transitions between the same states, with the * same word label) are flagged and only the highest prob retained. */ SPHINXBASE_EXPORT void fsg_model_trans_add(fsg_model_t * fsg, int32 from, int32 to, int32 logp, int32 wid); /** * Add a null transition between the given states. * * There can be at most one null transition between the given states; * duplicates are flagged and only the best prob retained. Transition * probs must be <= 1 (i.e., logprob <= 0). * * @return 1 if a new transition was added, 0 if the prob of an existing * transition was upgraded; -1 if nothing was changed. */ SPHINXBASE_EXPORT int32 fsg_model_null_trans_add(fsg_model_t * fsg, int32 from, int32 to, int32 logp); /** * Add a "tag" transition between the given states. * * A "tag" transition is a null transition with a non-null word ID, * which corresponds to a semantic tag or other symbol to be output * when this transition is taken. * * As above, there can be at most one null or tag transition between * the given states; duplicates are flagged and only the best prob * retained. Transition probs must be <= 1 (i.e., logprob <= 0). * * @return 1 if a new transition was added, 0 if the prob of an existing * transition was upgraded; -1 if nothing was changed. */ SPHINXBASE_EXPORT int32 fsg_model_tag_trans_add(fsg_model_t * fsg, int32 from, int32 to, int32 logp, int32 wid); /** * Obtain transitive closure of null transitions in the given FSG. * * @param nulls List of null transitions, or NULL to find them automatically. * @return Updated list of null transitions. */ SPHINXBASE_EXPORT glist_t fsg_model_null_trans_closure(fsg_model_t * fsg, glist_t nulls); /** * Get the list of transitions (if any) from state i to j. */ SPHINXBASE_EXPORT glist_t fsg_model_trans(fsg_model_t *fsg, int32 i, int32 j); /** * Get an iterator over the outgoing transitions from state i. */ SPHINXBASE_EXPORT fsg_arciter_t *fsg_model_arcs(fsg_model_t *fsg, int32 i); /** * Get the current arc from the arc iterator. */ SPHINXBASE_EXPORT fsg_link_t *fsg_arciter_get(fsg_arciter_t *itor); /** * Move the arc iterator forward. */ SPHINXBASE_EXPORT fsg_arciter_t *fsg_arciter_next(fsg_arciter_t *itor); /** * Free the arc iterator (early termination) */ SPHINXBASE_EXPORT void fsg_arciter_free(fsg_arciter_t *itor); /** * Get the null transition (if any) from state i to j. */ SPHINXBASE_EXPORT fsg_link_t *fsg_model_null_trans(fsg_model_t *fsg, int32 i, int32 j); /** * Add silence word transitions to each state in given FSG. * * @param state state to add a self-loop to, or -1 for all states. * @param silprob probability of silence transition. */ SPHINXBASE_EXPORT int fsg_model_add_silence(fsg_model_t * fsg, char const *silword, int state, float32 silprob); /** * Add alternate pronunciation transitions for a word in given FSG. */ SPHINXBASE_EXPORT int fsg_model_add_alt(fsg_model_t * fsg, char const *baseword, char const *altword); /** * Write FSG to a file. */ SPHINXBASE_EXPORT void fsg_model_write(fsg_model_t *fsg, FILE *fp); /** * Write FSG to a file. */ SPHINXBASE_EXPORT void fsg_model_writefile(fsg_model_t *fsg, char const *file); /** * Write FSG to a file in AT&T FSM format. */ SPHINXBASE_EXPORT void fsg_model_write_fsm(fsg_model_t *fsg, FILE *fp); /** * Write FSG to a file in AT&T FSM format. */ SPHINXBASE_EXPORT void fsg_model_writefile_fsm(fsg_model_t *fsg, char const *file); /** * Write FSG symbol table to a file (for AT&T FSM) */ SPHINXBASE_EXPORT void fsg_model_write_symtab(fsg_model_t *fsg, FILE *file); /** * Write FSG symbol table to a file (for AT&T FSM) */ SPHINXBASE_EXPORT void fsg_model_writefile_symtab(fsg_model_t *fsg, char const *file); #ifdef __cplusplus } #endif #endif /* __FSG_MODEL_H__ */