1/*---------------------------------------------------------------------------*
2 *  hmm_desc.h  *
3 *                                                                           *
4 *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
5 *                                                                           *
6 *  Licensed under the Apache License, Version 2.0 (the 'License');          *
7 *  you may not use this file except in compliance with the License.         *
8 *                                                                           *
9 *  You may obtain a copy of the License at                                  *
10 *      http://www.apache.org/licenses/LICENSE-2.0                           *
11 *                                                                           *
12 *  Unless required by applicable law or agreed to in writing, software      *
13 *  distributed under the License is distributed on an 'AS IS' BASIS,        *
14 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15 *  See the License for the specific language governing permissions and      *
16 *  limitations under the License.                                           *
17 *                                                                           *
18 *---------------------------------------------------------------------------*/
19
20
21
22#ifndef _h_hmm_desc_
23#define _h_hmm_desc_
24
25#ifdef SET_RCSID
26static const char hmm_desc_h[] = "$Id: hmm_desc.h,v 1.2.10.6 2008/01/21 20:30:05 dahan Exp $";
27#endif
28
29#include "creccons.h"   /* CREC Public Constants    */
30
31#include "all_defs.h"
32#include "hmm_type.h"
33#include "sizes.h"
34
35
36
37#define PDTYP(X)        ((X) & 0x0f)
38
39#define DIAG            (1<<4) /* Diagonal covariance model */
40#define FULL            (2<<4) /* Full covariance model */
41#define VARTYP(X)       ((X) & 0x30)
42
43#define EXPDUR  (1<<6) /* Exponential duration model */
44#define DURTYP(X) ((X) & 0xc0)
45
46/**
47 * @todo document
48 */
49typedef struct
50{
51  unsigned char phone; /*  Internal phoneme symbol */
52  unsigned char pr_code[4]; /*  Printable phone code */
53  unsigned char near_phone;
54  int  num_states;
55  unsigned char dict_code;    /*  single char printable code */
56}
57phoneme_info;
58
59/**
60 * @todo document
61 */
62typedef struct
63{
64  int  num_phones;
65  phoneme_info *phoneme;
66  int  index[256];
67}
68phoneme_set;
69
70/**
71 * The space_filler var here is to make sure that this structure is
72 * always the same size on different platforms.  ARM unix appears to
73 * want structures to by a multiple of 4 bytes, hence the filler.
74 */
75typedef struct
76{
77  unsigned char left_phone[MAX_PHONEMES];
78  unsigned char right_phone[MAX_PHONEMES];
79  short  apply;
80  short  space_filler; /* TODO: revisit this issue */
81}
82question;
83
84#define NON_GENERIC 0
85#define RIGHT_GENERIC 1
86#define LEFT_GENERIC 2 /*  Was the other way */
87#define BOTH_GENERIC 3
88#define DIPHONE  9
89
90/* the terminal_tree_node structure is used in a union with tree_branch_info
91   resulting in a "tree_node".  We must initialize "tree_node"s of both
92   both types in large static array, which is hard.  So instead we initialize
93   a static array of terminal_tree_node's but need to fill that structure up
94   with dummies to be the same size as the full "tree_node".  For 2-byte
95   pointer configurations this may not be memory efficient :( */
96
97/**
98 * @todo document
99 */
100typedef struct terminal_tree_node_info
101{
102  asr_int16_t    quest_index;
103  asr_int16_t   pelid;
104  asr_int16_t   avg_durn;
105  asr_int16_t          dummy_filler1, dummy_filler2, dummy_filler3;
106}
107terminal_tree_node;
108
109/**
110 * @todo document
111 */
112typedef struct tree_branch_info
113{
114  asr_int16_t  quest_index;
115  struct tree_branch_info  *fail;
116  struct tree_branch_info  *pass;
117}
118tree_branch_info;
119
120/**
121 * @todo document
122 */
123typedef union {
124  struct tree_branch_info    node;
125  struct terminal_tree_node_info term;
126} tree_node;
127
128/**
129 * @todo document
130 */
131typedef struct
132{
133  int       no_states;
134  /*    int       phoneme; */
135  tree_node *root[MAX_PHONE_STATES];
136}
137tree_info;
138
139/**
140 * holds the body of a sorted .ok dictionary file
141 */
142typedef struct
143{
144  char* ok_file_data; /* data in the .ok file */
145  int ok_file_data_length; /* length of data ok_file_data */
146  const char* first_entry; /* first entry in the dictionary */
147  const char* last_entry; /* last entry in the dictionary */
148  int hasUpper; /* nonzero if upper case present in dictionary (usually not) */
149}
150vocab_info;
151
152#endif
153