From 5e4e0f8884a748dd09acbfa23a11a378f7aabb47 Mon Sep 17 00:00:00 2001 From: Carlo Benussi Date: Tue, 18 Jul 2017 14:23:58 +0200 Subject: [PATCH 1/8] added jsgf support for tags --- include/sphinxbase/fsg_model.h | 4 +++- src/libsphinxbase/lm/fsg_model.c | 9 +++++---- src/libsphinxbase/lm/jsgf.c | 2 +- swig/fsg_model.i | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/include/sphinxbase/fsg_model.h b/include/sphinxbase/fsg_model.h index 40cb7494..51a3c446 100644 --- a/include/sphinxbase/fsg_model.h +++ b/include/sphinxbase/fsg_model.h @@ -76,12 +76,14 @@ typedef struct fsg_link_s { int32 to_state; int32 logs2prob; /**< log(transition probability)*lw */ int32 wid; /**< Word-ID; <0 if epsilon or null transition */ + glist_t tags; /**< List containig tags (char *) associated with the link */ } 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_tags(l) ((l)->tags) #define fsg_link_logs2prob(l) ((l)->logs2prob) /** @@ -239,7 +241,7 @@ int fsg_model_word_id(fsg_model_t *fsg, char const *word); */ SPHINXBASE_EXPORT void fsg_model_trans_add(fsg_model_t * fsg, - int32 from, int32 to, int32 logp, int32 wid); + int32 from, int32 to, int32 logp, int32 wid, glist_t tags); /** * Add a null transition between the given states. diff --git a/src/libsphinxbase/lm/fsg_model.c b/src/libsphinxbase/lm/fsg_model.c index ac80ef9a..ce140f5e 100644 --- a/src/libsphinxbase/lm/fsg_model.c +++ b/src/libsphinxbase/lm/fsg_model.c @@ -111,7 +111,7 @@ nextline_str2words(FILE * fp, int32 * lineno, void fsg_model_trans_add(fsg_model_t * fsg, - int32 from, int32 to, int32 logp, int32 wid) + int32 from, int32 to, int32 logp, int32 wid, glist_t tags) { fsg_link_t *link; glist_t gl; @@ -136,6 +136,7 @@ fsg_model_trans_add(fsg_model_t * fsg, link->to_state = to; link->logs2prob = logp; link->wid = wid; + link->tags = tags; /* Add it to the list of transitions and update the hash table */ gl = glist_add_ptr(gl, (void *) link); @@ -431,12 +432,12 @@ fsg_model_add_silence(fsg_model_t * fsg, char const *silword, n_trans = 0; if (state == -1) { for (src = 0; src < fsg->n_state; src++) { - fsg_model_trans_add(fsg, src, src, logsilp, silwid); + fsg_model_trans_add(fsg, src, src, logsilp, silwid, NULL); ++n_trans; } } else { - fsg_model_trans_add(fsg, state, state, logsilp, silwid); + fsg_model_trans_add(fsg, state, state, logsilp, silwid, NULL); ++n_trans; } @@ -684,7 +685,7 @@ fsg_model_read(FILE * fp, logmath_t * lmath, float32 lw) wid = lastwid; ++lastwid; } - fsg_model_trans_add(fsg, i, j, tprob, wid); + fsg_model_trans_add(fsg, i, j, tprob, wid, NULL); ++n_trans; } else { diff --git a/src/libsphinxbase/lm/jsgf.c b/src/libsphinxbase/lm/jsgf.c index 73d1d17b..a6af1464 100644 --- a/src/libsphinxbase/lm/jsgf.c +++ b/src/libsphinxbase/lm/jsgf.c @@ -566,7 +566,7 @@ jsgf_build_fsg_internal(jsgf_t * grammar, jsgf_rule_t * rule, int wid = fsg_model_word_add(fsg, link->atom->name); fsg_model_trans_add(fsg, link->from, link->to, logmath_log(lmath, link->atom->weight), - wid); + wid, link->atom->tags); } } else { diff --git a/swig/fsg_model.i b/swig/fsg_model.i index 6d7952d5..6146bee2 100644 --- a/swig/fsg_model.i +++ b/swig/fsg_model.i @@ -60,7 +60,7 @@ } void trans_add(int src, int dst, int logp, int wid) { - fsg_model_trans_add($self, src, dst, logp, wid); + fsg_model_trans_add($self, src, dst, logp, wid, NULL); } int null_trans_add(int src, int dst, int logp) { From 7d268a9895cd81ade8b73d033741ef61c3d905d8 Mon Sep 17 00:00:00 2001 From: Carlo Benussi Date: Fri, 28 Jul 2017 12:20:19 +0200 Subject: [PATCH 2/8] fixed memory leak --- include/sphinxbase/fsg_model.h | 36 ++++++++++++------------ src/libsphinxbase/lm/fsg_model.c | 25 ++++++++++------- src/libsphinxbase/lm/jsgf.c | 37 +++++++++++++++---------- src/libsphinxbase/lm/jsgf_internal.h | 20 ++++++------- src/libsphinxbase/util/listelem_alloc.c | 24 ++++++++-------- 5 files changed, 78 insertions(+), 64 deletions(-) diff --git a/include/sphinxbase/fsg_model.h b/include/sphinxbase/fsg_model.h index 51a3c446..c2782c96 100644 --- a/include/sphinxbase/fsg_model.h +++ b/include/sphinxbase/fsg_model.h @@ -8,7 +8,7 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * 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 @@ -16,16 +16,16 @@ * distribution. * * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * 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 + * 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. * * ==================================================================== @@ -34,7 +34,7 @@ /* * fsg_model.h -- Word-level finite state graph - * + * * ********************************************** * CMU ARPA Speech Project * @@ -76,14 +76,14 @@ typedef struct fsg_link_s { int32 to_state; int32 logs2prob; /**< log(transition probability)*lw */ int32 wid; /**< Word-ID; <0 if epsilon or null transition */ - glist_t tags; /**< List containig tags (char *) associated with the link */ + char tag[50]; /**< List containig tags (char *) associated with the link */ } 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_tags(l) ((l)->tags) +#define fsg_link_tag(l) ((l)->tag) #define fsg_link_logs2prob(l) ((l)->logs2prob) /** @@ -156,9 +156,9 @@ fsg_model_t *fsg_model_init(char const *name, logmath_t *lmath, /** * 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 []
@@ -171,24 +171,24 @@ fsg_model_t *fsg_model_init(char const *name, logmath_t *lmath,
  *   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. */ diff --git a/src/libsphinxbase/lm/fsg_model.c b/src/libsphinxbase/lm/fsg_model.c index ce140f5e..a09e2735 100644 --- a/src/libsphinxbase/lm/fsg_model.c +++ b/src/libsphinxbase/lm/fsg_model.c @@ -8,7 +8,7 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * 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 @@ -16,16 +16,16 @@ * distribution. * * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * 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 + * 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. * * ==================================================================== @@ -136,7 +136,12 @@ fsg_model_trans_add(fsg_model_t * fsg, link->to_state = to; link->logs2prob = logp; link->wid = wid; - link->tags = tags; + + gnode_t *gnt = tags; + if(gnt) + { + strncpy(link->tag,(char *)gnode_ptr(gnt),50); + } /* Add it to the list of transitions and update the hash table */ gl = glist_add_ptr(gl, (void *) link); @@ -209,7 +214,7 @@ fsg_model_null_trans_closure(fsg_model_t * fsg, glist_t nulls) E_INFO("Computing transitive closure for null transitions\n"); /* If our caller didn't give us a list of null-transitions, - make such a list. Just loop through all the FSG states, + make such a list. Just loop through all the FSG states, and all the null-transitions in that state (which are kept in their own hash table). */ if (nulls == NULL) { diff --git a/src/libsphinxbase/lm/jsgf.c b/src/libsphinxbase/lm/jsgf.c index a6af1464..4aa0301c 100644 --- a/src/libsphinxbase/lm/jsgf.c +++ b/src/libsphinxbase/lm/jsgf.c @@ -8,27 +8,27 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * 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 work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * 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 + * 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. * * ==================================================================== @@ -77,6 +77,15 @@ jsgf_atom_free(jsgf_atom_t * atom) { if (atom == NULL) return 0; + + gnode_t *gn; + for(gn = atom->tags;gn;gn = gnode_next(gn)){ + char *tag = (char *)gnode_ptr(gn); + if(tag){ + ckd_free(tag); + } + } + glist_free(atom->tags); ckd_free(atom->name); ckd_free(atom); return 0; @@ -252,7 +261,7 @@ jsgf_fullname_from_rule(jsgf_rule_t * rule, const char *name) return fullname; } -/* Extract as rulename everything after the secondlast dot, if existent. +/* Extract as rulename everything after the secondlast dot, if existent. * Because everything before the secondlast dot is the path-specification. */ static char * importname2rulename(char *importname) @@ -311,9 +320,9 @@ expand_rhs(jsgf_t * grammar, jsgf_rule_t * rule, jsgf_rhs_t * rhs, gnode_t *subnode; jsgf_rule_stack_t *rule_stack_entry = NULL; - /* Special case for and pseudo-rules - If this is the only atom in the rhs, and it's the - first rhs in the rule, then emit a null transition, + /* Special case for and pseudo-rules + If this is the only atom in the rhs, and it's the + first rhs in the rule, then emit a null transition, creating an exit state if needed. */ if (0 == strcmp(atom->name, "")) { if (gn == rhs->atoms && gnode_next(gn) == NULL) { diff --git a/src/libsphinxbase/lm/jsgf_internal.h b/src/libsphinxbase/lm/jsgf_internal.h index a5cbc983..867deab8 100644 --- a/src/libsphinxbase/lm/jsgf_internal.h +++ b/src/libsphinxbase/lm/jsgf_internal.h @@ -8,27 +8,27 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * 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 work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * 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 + * 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. * * ==================================================================== diff --git a/src/libsphinxbase/util/listelem_alloc.c b/src/libsphinxbase/util/listelem_alloc.c index d6b4ceda..9bde0cb8 100644 --- a/src/libsphinxbase/util/listelem_alloc.c +++ b/src/libsphinxbase/util/listelem_alloc.c @@ -8,27 +8,27 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * 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 work was supported in part by funding from the Defense Advanced - * Research Projects Agency and the National Science Foundation of the + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * - * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND - * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * 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 + * 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. * * ==================================================================== @@ -45,7 +45,7 @@ /** * Fast linked list allocator. - * + * * We keep a separate linked list for each element-size. Element-size * must be a multiple of pointer-size. * @@ -124,7 +124,7 @@ listelem_alloc_free(listelem_alloc_t *list) if (list == NULL) return; for (gn = list->blocks; gn; gn = gnode_next(gn)) - ckd_free(gnode_ptr(gn)); + if(gn) ckd_free(gnode_ptr(gn)); glist_free(list->blocks); glist_free(list->blocksize); ckd_free(list); From 1a0e622fc5fdb8295668c59cfe0c962f23403ade Mon Sep 17 00:00:00 2001 From: Carlo Benussi Date: Fri, 28 Jul 2017 12:44:16 +0200 Subject: [PATCH 3/8] defined TAG MAX SIZE --- include/sphinxbase/fsg_model.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/sphinxbase/fsg_model.h b/include/sphinxbase/fsg_model.h index c2782c96..c59954be 100644 --- a/include/sphinxbase/fsg_model.h +++ b/include/sphinxbase/fsg_model.h @@ -68,6 +68,8 @@ extern "C" { } #endif +#define MAX_TAG_SIZE 50 + /* * A single transition in the FSG. */ @@ -76,7 +78,7 @@ typedef struct fsg_link_s { int32 to_state; int32 logs2prob; /**< log(transition probability)*lw */ int32 wid; /**< Word-ID; <0 if epsilon or null transition */ - char tag[50]; /**< List containig tags (char *) associated with the link */ + char tag[MAX_TAG_SIZE]; /**< List containig tags (char *) associated with the link */ } fsg_link_t; /* Access macros */ From e2d6bcd180c3cd9609f52875a570b65f7d30f540 Mon Sep 17 00:00:00 2001 From: Carlo Benussi Date: Mon, 21 Aug 2017 16:47:35 +0200 Subject: [PATCH 4/8] fixed null hyp --- include/sphinxbase/jsgf.h | 66 ++++++++++++++++++++++ src/libsphinxbase/lm/jsgf.c | 83 ++++++++++++++++++++++++++++ src/libsphinxbase/lm/jsgf_internal.h | 18 ------ 3 files changed, 149 insertions(+), 18 deletions(-) diff --git a/include/sphinxbase/jsgf.h b/include/sphinxbase/jsgf.h index 3c3de1de..30fea3e9 100644 --- a/include/sphinxbase/jsgf.h +++ b/include/sphinxbase/jsgf.h @@ -63,6 +63,10 @@ extern "C" { typedef struct jsgf_s jsgf_t; typedef struct jsgf_rule_s jsgf_rule_t; +typedef struct jsgf_rhs_s jsgf_rhs_t; +typedef struct jsgf_atom_s jsgf_atom_t; +typedef struct jsgf_link_s jsgf_link_t; +typedef struct jsgf_rule_stack_s jsgf_rule_stack_t; /** * Create a new JSGF grammar. @@ -201,6 +205,68 @@ fsg_model_t *jsgf_read_string(const char *string, logmath_t * lmath, float32 lw) SPHINXBASE_EXPORT int jsgf_write_fsg(jsgf_t *grammar, jsgf_rule_t *rule, FILE *outfh); +/* ------------ MOVED FROM jsgf_internal.h ---------- */ +#define jsgf_atom_is_rule(atom) ((atom)->name[0] == '<') + +void jsgf_add_link(jsgf_t *grammar, jsgf_atom_t *atom, int from, int to); +jsgf_atom_t *jsgf_atom_new(char *name, float weight); +jsgf_atom_t *jsgf_kleene_new(jsgf_t *jsgf, jsgf_atom_t *atom, int plus); +jsgf_rule_t *jsgf_optional_new(jsgf_t *jsgf, jsgf_rhs_t *exp); +jsgf_rule_t *jsgf_define_rule(jsgf_t *jsgf, char *name, jsgf_rhs_t *rhs, int is_public); +jsgf_rule_t *jsgf_import_rule(jsgf_t *jsgf, char *name); + +int jsgf_atom_free(jsgf_atom_t *atom); +int jsgf_rule_free(jsgf_rule_t *rule); +jsgf_rule_t *jsgf_rule_retain(jsgf_rule_t *rule); + +/* ------------ MY FUNCTIONS ----------- */ + +/** + * Creates a new atom with single tag. + * + */ +SPHINXBASE_EXPORT +jsgf_atom_t *jsgf_atom_with_tag_new(char *name, float weight, char *tag); + +/** + * Creates a new rhs struct. + * + */ +SPHINXBASE_EXPORT +jsgf_rhs_t *jsgf_rhs_new(); + +/** + * Some getters and setters put to allow the single inclusion of jsgf.h. + * + */ + +SPHINXBASE_EXPORT +jsgf_rhs_t *jsgf_get_rule_rhs(jsgf_rule_t *rule); + +SPHINXBASE_EXPORT +jsgf_rhs_t *jsgf_get_rhs_alt(jsgf_rhs_t *rhs); + +SPHINXBASE_EXPORT +gnode_t *jsgf_get_rhs_atom(jsgf_rhs_t *rhs); + +SPHINXBASE_EXPORT +char *jsgf_get_atom_name(jsgf_atom_t *atom); + +SPHINXBASE_EXPORT +void jsgf_set_rule_rhs(jsgf_rule_t *rule, jsgf_rhs_t *rhs); + +SPHINXBASE_EXPORT +void jsgf_set_rhs_alt(jsgf_rhs_t *rhs, jsgf_rhs_t *alt); + +SPHINXBASE_EXPORT +void jsgf_set_rhs_atom(jsgf_rhs_t *rhs, gnode_t* gn); + +SPHINXBASE_EXPORT +void jsgf_set_atom_name(jsgf_atom_t *atom, char *name); + +SPHINXBASE_EXPORT +int jsgf_is_atom_rule(jsgf_atom_t *atom); + #ifdef __cplusplus } #endif diff --git a/src/libsphinxbase/lm/jsgf.c b/src/libsphinxbase/lm/jsgf.c index 4aa0301c..02163954 100644 --- a/src/libsphinxbase/lm/jsgf.c +++ b/src/libsphinxbase/lm/jsgf.c @@ -970,3 +970,86 @@ jsgf_parse_string(const char *string, jsgf_t * parent) return jsgf; } + +jsgf_rhs_t * +jsgf_get_rule_rhs(jsgf_rule_t *rule) +{ + if(!rule) + return NULL; + + return rule->rhs; +} + +jsgf_rhs_t * +jsgf_get_rhs_alt(jsgf_rhs_t *rhs) +{ + if(!rhs) + return NULL; + + return rhs->alt; +} + +gnode_t * +jsgf_get_rhs_atom(jsgf_rhs_t *rhs) +{ + if(!rhs) + return NULL; + + return rhs->atoms; +} + +char * +jsgf_get_atom_name(jsgf_atom_t *atom) +{ + if(!atom) + return NULL; + + return atom->name; +} + +void +jsgf_set_rule_rhs(jsgf_rule_t *rule, jsgf_rhs_t *rhs) +{ + if(rule) + rule->rhs = rhs; +} + +void +jsgf_set_rhs_alt(jsgf_rhs_t *rhs, jsgf_rhs_t *alt) +{ + if(rhs) + rhs->alt = alt; +} + +void +jsgf_set_rhs_atom(jsgf_rhs_t *rhs, gnode_t* gn) +{ + if(rhs) + rhs->atoms = gn; +} + +void +jsgf_set_atom_name(jsgf_atom_t *atom, char *name) +{ + if(atom) + atom->name = name; +} + +int +jsgf_is_atom_rule(jsgf_atom_t *atom) +{ + if(!atom) + return -1; + + if(atom->name[0] == '<'){ + return 1; + } else { + return 0; + } +} + +jsgf_rhs_t * +jsgf_rhs_new() +{ + return (jsgf_rhs_t *) ckd_calloc(1, sizeof(jsgf_rhs_t)); +} diff --git a/src/libsphinxbase/lm/jsgf_internal.h b/src/libsphinxbase/lm/jsgf_internal.h index 867deab8..87b7888e 100644 --- a/src/libsphinxbase/lm/jsgf_internal.h +++ b/src/libsphinxbase/lm/jsgf_internal.h @@ -67,11 +67,6 @@ extern "C" { #define YY_NO_INPUT /* Silence a compiler warning. */ -typedef struct jsgf_rhs_s jsgf_rhs_t; -typedef struct jsgf_atom_s jsgf_atom_t; -typedef struct jsgf_link_s jsgf_link_t; -typedef struct jsgf_rule_stack_s jsgf_rule_stack_t; - struct jsgf_s { char *version; /**< JSGF version (from header) */ char *charset; /**< JSGF charset (default UTF-8) */ @@ -119,19 +114,6 @@ struct jsgf_link_s { int to; /**< To state */ }; -#define jsgf_atom_is_rule(atom) ((atom)->name[0] == '<') - -void jsgf_add_link(jsgf_t *grammar, jsgf_atom_t *atom, int from, int to); -jsgf_atom_t *jsgf_atom_new(char *name, float weight); -jsgf_atom_t *jsgf_kleene_new(jsgf_t *jsgf, jsgf_atom_t *atom, int plus); -jsgf_rule_t *jsgf_optional_new(jsgf_t *jsgf, jsgf_rhs_t *exp); -jsgf_rule_t *jsgf_define_rule(jsgf_t *jsgf, char *name, jsgf_rhs_t *rhs, int is_public); -jsgf_rule_t *jsgf_import_rule(jsgf_t *jsgf, char *name); - -int jsgf_atom_free(jsgf_atom_t *atom); -int jsgf_rule_free(jsgf_rule_t *rule); -jsgf_rule_t *jsgf_rule_retain(jsgf_rule_t *rule); - #ifdef __cplusplus } #endif From f5238221b2039985f58fd30728126695e782b6c6 Mon Sep 17 00:00:00 2001 From: Carlo Benussi Date: Mon, 21 Aug 2017 17:01:21 +0200 Subject: [PATCH 5/8] fixed null hyp, and atom with tag --- src/libsphinxbase/lm/jsgf.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/libsphinxbase/lm/jsgf.c b/src/libsphinxbase/lm/jsgf.c index 02163954..b7849cb3 100644 --- a/src/libsphinxbase/lm/jsgf.c +++ b/src/libsphinxbase/lm/jsgf.c @@ -61,6 +61,21 @@ extern int yyparse(void *scanner, jsgf_t * jsgf); static int expand_rule(jsgf_t * grammar, jsgf_rule_t * rule, int rule_entry, int rule_exit); +jsgf_atom_t * +jsgf_atom_with_tag_new(char *name, float weight, char *tag) +{ + jsgf_atom_t *atom; + + atom = ckd_calloc(1, sizeof(*atom)); + atom->name = ckd_salloc(name); + atom->weight = weight; + + glist_t tags = NULL; + tags = glist_add_ptr(tags,(void *)tag); + atom->tags = tags; + return atom; +} + jsgf_atom_t * jsgf_atom_new(char *name, float weight) { From be156cb3587ba6724525b593ee4f841335e2f2f2 Mon Sep 17 00:00:00 2001 From: Carlo Benussi Date: Tue, 22 Aug 2017 11:25:29 +0200 Subject: [PATCH 6/8] =?UTF-8?q?rule=20clean=20a=C3=ACfunc=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/sphinxbase/jsgf.h | 3 +++ src/libsphinxbase/lm/jsgf.c | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/sphinxbase/jsgf.h b/include/sphinxbase/jsgf.h index 30fea3e9..142e7797 100644 --- a/include/sphinxbase/jsgf.h +++ b/include/sphinxbase/jsgf.h @@ -267,6 +267,9 @@ void jsgf_set_atom_name(jsgf_atom_t *atom, char *name); SPHINXBASE_EXPORT int jsgf_is_atom_rule(jsgf_atom_t *atom); +SPHINXBASE_EXPORT +int jsgf_rule_clean(jsgf_rule_t *rule); + #ifdef __cplusplus } #endif diff --git a/src/libsphinxbase/lm/jsgf.c b/src/libsphinxbase/lm/jsgf.c index b7849cb3..9c0bcf19 100644 --- a/src/libsphinxbase/lm/jsgf.c +++ b/src/libsphinxbase/lm/jsgf.c @@ -1068,3 +1068,14 @@ jsgf_rhs_new() { return (jsgf_rhs_t *) ckd_calloc(1, sizeof(jsgf_rhs_t)); } + +int +jsgf_rule_clean(jsgf_rule_t *rule) +{ + if (rule == NULL) + return 0; + if (--rule->refcnt > 0) + return rule->refcnt; + jsgf_rhs_free(rule->rhs); + return 1; +} From a0af62ef1fe894fcfd123964f5c4fbc8ab547963 Mon Sep 17 00:00:00 2001 From: Carlo Benussi Date: Tue, 22 Aug 2017 11:29:15 +0200 Subject: [PATCH 7/8] =?UTF-8?q?rule=20clean=20a=C3=ACfunc=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libsphinxbase/lm/jsgf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsphinxbase/lm/jsgf.c b/src/libsphinxbase/lm/jsgf.c index 9c0bcf19..aabef3ff 100644 --- a/src/libsphinxbase/lm/jsgf.c +++ b/src/libsphinxbase/lm/jsgf.c @@ -1077,5 +1077,5 @@ jsgf_rule_clean(jsgf_rule_t *rule) if (--rule->refcnt > 0) return rule->refcnt; jsgf_rhs_free(rule->rhs); - return 1; + return 0; } From 5d28c311184f169125fd8c1ebd388fa520659d4b Mon Sep 17 00:00:00 2001 From: Carlo Benussi Date: Tue, 22 Aug 2017 16:54:54 +0200 Subject: [PATCH 8/8] tag freeing seems clean now --- src/libsphinxbase/lm/jsgf.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/libsphinxbase/lm/jsgf.c b/src/libsphinxbase/lm/jsgf.c index aabef3ff..f6c45d97 100644 --- a/src/libsphinxbase/lm/jsgf.c +++ b/src/libsphinxbase/lm/jsgf.c @@ -69,9 +69,9 @@ jsgf_atom_with_tag_new(char *name, float weight, char *tag) atom = ckd_calloc(1, sizeof(*atom)); atom->name = ckd_salloc(name); atom->weight = weight; + const char *tagC = ckd_salloc(tag); - glist_t tags = NULL; - tags = glist_add_ptr(tags,(void *)tag); + glist_t tags = glist_add_ptr(NULL,(void *)tagC); atom->tags = tags; return atom; } @@ -84,6 +84,7 @@ jsgf_atom_new(char *name, float weight) atom = ckd_calloc(1, sizeof(*atom)); atom->name = ckd_salloc(name); atom->weight = weight; + atom->tags = NULL; return atom; } @@ -328,7 +329,6 @@ expand_rhs(jsgf_t * grammar, jsgf_rule_t * rule, jsgf_rhs_t * rhs, /* Iterate over atoms in rhs and generate links/nodes */ for (gn = rhs->atoms; gn; gn = gnode_next(gn)) { jsgf_atom_t *atom = gnode_ptr(gn); - if (jsgf_atom_is_rule(atom)) { jsgf_rule_t *subrule; char *fullname; @@ -1069,7 +1069,7 @@ jsgf_rhs_new() return (jsgf_rhs_t *) ckd_calloc(1, sizeof(jsgf_rhs_t)); } -int +int jsgf_rule_clean(jsgf_rule_t *rule) { if (rule == NULL) @@ -1079,3 +1079,4 @@ jsgf_rule_clean(jsgf_rule_t *rule) jsgf_rhs_free(rule->rhs); return 0; } +