1/*---------------------------------------------------------------------------*
2 *  srec_arb.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#ifndef __SREC_ARB_H__
21#define __SREC_ARB_H__
22
23#include"sizes.h"
24#include"hmm_desc.h"           /* 'cuz we're still using the old tree nodes */
25#include"search_network.h"     /* for EPSILON_OFFSET */
26
27#define PSET_BIT_ARRAY_SIZE 7  /* max phonemes is 7*16 (128) */
28typedef asr_uint16_t phonemeID;
29#define MAXphonemeID 255
30#define SILENCE_CODE '#'
31#define OPTSILENCE_CODE '&'
32#define SILENCE_CODE_STR "#"
33#define OPTSILENCE_CODE_STR "&"
34#define HMM_COUNTER_OFFSET EPSILON_OFFSET
35#define NUM_SILENCE_HMMS 3
36#define WBPHONEME_CODE '_'
37#define USE_WWTRIPHONE 0
38
39#define QUESTION_LEFT  1
40#define QUESTION_RIGHT 2
41#define QUESTION_WBLEFT  3
42#define QUESTION_WBRIGHT 4
43#define ANSWER_FAIL    0
44#define ANSWER_PASS    1
45
46/**
47 * @todo document
48 */
49typedef struct
50{
51  asr_uint16_t qtype;
52  asr_uint16_t membership_bits[PSET_BIT_ARRAY_SIZE];
53}
54srec_question;
55#define BIT_ADDRESS(K,A,B) { A=(K)/16; B=1<<((K)%16); }
56
57#define MAX_PHONEME_NAME_LEN 8/BYTES_PER_ATOM
58
59/**
60 * @todo document
61 */
62typedef struct
63{
64  char   name[MAX_PHONEME_NAME_LEN];
65  asr_uint16_t code;
66  tree_node* model_nodes; /* pelid at the bottom, is really a HMM model ID */
67  asr_uint16_t num_states;
68  tree_node* state_nodes[MAX_PHONE_STATES];
69}
70phoneme_data;
71
72/**
73 * @todo document
74 */
75typedef struct
76{
77  char name[MAX_PHONEME_NAME_LEN]; /* 6400 bytes to free up here */
78  asr_int16_t num_states;
79  asr_int16_t* state_indices; /* only the first HMMInfo owns the pointer data */
80}
81HMMInfo;
82
83#define NUM_PHONEME_INDICES 256
84/**
85 * @todo document
86 */
87typedef struct
88{
89  char* image;
90  asr_uint16_t image_size;
91  asr_int16_t num_phonemes;
92  phoneme_data* pdata;
93  asr_int16_t num_questions;
94  srec_question* questions;
95  asr_int16_t num_states; /* total number of states, all allophones, phonemes */
96  asr_int16_t num_hmms;
97  HMMInfo* hmm_infos;
98  phonemeID phoneme_index[NUM_PHONEME_INDICES]; /* from short code to phoneme index */
99  /* later add a data member called 'hmm_ilabel_offset', such that
100     for graphs prepared with OSR/SGC, the ilabels on that graph
101     must be offset by this number to get hmms */
102  // struct PCPinfo* pcpinfo;
103  void* pcpinfo;
104}
105srec_arbdata;
106
107/*---------------------------------------------------------------------------*
108 *                                                                           *
109 *                                                                           *
110 *                                                                           *
111 *---------------------------------------------------------------------------*/
112
113#if defined(__cplusplus) /*&& !defined(_ASCPP)*/
114extern "C"
115{
116#endif
117
118  int get_modelid_for_pic(srec_arbdata* allotree,
119                          phonemeID lphon, phonemeID cphon, phonemeID rphon);
120
121  int get_modelids_for_pron(srec_arbdata* allotree, const char* phonemes,
122                            int num_phonemes, modelID* acoustic_model_ids);
123
124  int read_arbdata_from_stream(srec_arbdata** pallotree, char* buffer, int buffer_size);
125  unsigned int version_arbdata_models(srec_arbdata* a);
126
127#if defined(__cplusplus) /*&& !defined(_ASCPP)*/
128}
129#endif
130
131#endif
132