PocketSphinx  0.6
bin_mdef.h
Go to the documentation of this file.
1 /* -*- c-file-style: "linux" -*- */
2 /* ====================================================================
3  * Copyright (c) 2005 Carnegie Mellon University. All rights
4  * reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in
15  * the documentation and/or other materials provided with the
16  * distribution.
17  *
18  * This work was supported in part by funding from the Defense Advanced
19  * Research Projects Agency and the National Science Foundation of the
20  * United States of America, and the CMU Sphinx Speech Consortium.
21  *
22  * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND
23  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY
26  * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  *
34  * ====================================================================
35  *
36  */
45 #ifndef __BIN_MDEF_H__
46 #define __BIN_MDEF_H__
47 
48 #ifdef __cplusplus
49 extern "C" {
50 #if 0
51 }; /* Fool Emacs */
52 #endif
53 #endif /* __cplusplus */
54 
55 /* SphinxBase headers. */
56 #include <sphinxbase/mmio.h>
57 #include <sphinxbase/cmd_ln.h>
58 
59 #include "mdef.h"
60 
61 #define BIN_MDEF_FORMAT_VERSION 1
62 /* Little-endian machines will write "BMDF" to disk, big-endian ones "FDMB". */
63 #define BIN_MDEF_NATIVE_ENDIAN 0x46444d42 /* 'BMDF' in little-endian order */
64 #define BIN_MDEF_OTHER_ENDIAN 0x424d4446 /* 'BMDF' in big-endian order */
65 #ifdef __GNUC__
66 #define ATTRIBUTE_PACKED __attribute__((packed))
67 #else
68 #define ATTRIBUTE_PACKED
69 #endif
70 
74 typedef struct mdef_entry_s mdef_entry_t;
75 struct mdef_entry_s {
76  int32 ssid;
77  int32 tmat;
78  /* FIXME: is any of this actually necessary? */
79  union {
81  struct {
82  int8 filler;
83  int8 reserved[3];
84  } ci;
86  struct {
87  int8 wpos;
88  int8 ctx[3];
89  } cd;
90  } info;
91 } ATTRIBUTE_PACKED;
92 
96 #define BAD_SSID 0xffff
97 
100 #define BAD_SENID 0xffff
101 
105 typedef struct cd_tree_s cd_tree_t;
106 struct cd_tree_s {
107  int16 ctx;
108  int16 n_down;
109  union {
110  int32 pid;
111  int32 down;
112  } c;
113 };
114 
118 typedef struct bin_mdef_s bin_mdef_t;
119 struct bin_mdef_s {
120  int refcnt;
121  int32 n_ciphone;
122  int32 n_phone;
123  int32 n_emit_state;
124  int32 n_ci_sen;
125  int32 n_sen;
126  int32 n_tmat;
127  int32 n_sseq;
128  int32 n_ctx;
129  int32 n_cd_tree;
130  int16 sil;
132  mmio_file_t *filemap;
133  char **ciname;
136  uint16 **sseq;
137  uint8 *sseq_len;
139  /* These two are not stored on disk, but are generated at load time. */
140  int16 *cd2cisen;
141  int16 *sen2cimap;
144  enum { BIN_MDEF_FROM_TEXT, BIN_MDEF_IN_MEMORY, BIN_MDEF_ON_DISK } alloc_mode;
145 };
146 
147 #define bin_mdef_is_fillerphone(m,p) (((p) < (m)->n_ciphone) \
148  ? (m)->phone[p].info.ci.filler \
149  : (m)->phone[(m)->phone[p].info.cd.ctx[0]].info.ci.filler)
150 #define bin_mdef_is_ciphone(m,p) ((p) < (m)->n_ciphone)
151 #define bin_mdef_n_ciphone(m) ((m)->n_ciphone)
152 #define bin_mdef_n_phone(m) ((m)->n_phone)
153 #define bin_mdef_n_sseq(m) ((m)->n_sseq)
154 #define bin_mdef_n_emit_state(m) ((m)->n_emit_state)
155 #define bin_mdef_n_emit_state_phone(m,p) ((m)->n_emit_state ? (m)->n_emit_state \
156  : (m)->sseq_len[(m)->phone[p].ssid])
157 #define bin_mdef_n_sen(m) ((m)->n_sen)
158 #define bin_mdef_n_tmat(m) ((m)->n_tmat)
159 #define bin_mdef_pid2ssid(m,p) ((m)->phone[p].ssid)
160 #define bin_mdef_pid2tmatid(m,p) ((m)->phone[p].tmat)
161 #define bin_mdef_silphone(m) ((m)->sil)
162 #define bin_mdef_sen2cimap(m,s) ((m)->sen2cimap[s])
163 #define bin_mdef_sseq2sen(m,ss,pos) ((m)->sseq[ss][pos])
164 #define bin_mdef_pid2ci(m,p) (((p) < (m)->n_ciphone) ? (p) \
165  : (m)->phone[p].info.cd.ctx[0])
166 
170 bin_mdef_t *bin_mdef_read(cmd_ln_t *config, const char *filename);
174 bin_mdef_t *bin_mdef_read_text(cmd_ln_t *config, const char *filename);
178 int bin_mdef_write(bin_mdef_t *m, const char *filename);
182 int bin_mdef_write_text(bin_mdef_t *m, const char *filename);
186 bin_mdef_t *bin_mdef_retain(bin_mdef_t *m);
190 int bin_mdef_free(bin_mdef_t *m);
191 
196 int bin_mdef_ciphone_id(bin_mdef_t *m,
197  const char *ciphone);
203 int bin_mdef_ciphone_id_nocase(bin_mdef_t *m,
204  const char *ciphone);
206 /* Return value: READ-ONLY ciphone string name for the given ciphone id */
207 const char *bin_mdef_ciphone_str(bin_mdef_t *m,
208  int32 ci);
210 /* Return value: phone id for the given constituents if found, else -1 */
211 int bin_mdef_phone_id(bin_mdef_t *m,
212  int32 b,
213  int32 l,
214  int32 r,
215  int32 pos);
217 /* Look up a phone id, backing off to other word positions. */
218 int bin_mdef_phone_id_nearest(bin_mdef_t * m, int32 b,
219  int32 l, int32 r, int32 pos);
220 
226 int bin_mdef_phone_str(bin_mdef_t *m,
227  int pid,
228  char *buf);
230 #ifdef __cplusplus
231 }; /* extern "C" */
232 #endif /* __cplusplus */
233 
234 #endif /* __BIN_MDEF_H__ */