1 /*---------------------------------------------------------------------------*
2 * swimodel.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 __SWIMODEL_H__
21 #define __SWIMODEL_H__
22
23 #include "hmm_type.h"
24 #include "pre_desc.h"
25 #include "srec_sizes.h"
26 #include "PortExport.h"
27
28
29 /**
30 * @todo document
31 */
32 typedef struct
33 {
34 short num_pdfs; /* number of pdfs for this state */
35 /* featdata avg_durn; average state duration, belongs here but stored
36 elsewhere to avoid paging back to memory of acoustic models, c54!! */
37 const featdata *means; /* pointer to block of means for the set
38 of pdfs (points into the allmeans array)*/
39 const wtdata *weights; /*pointer to weights*/
40 }
41 SWIhmmState;
42
43 /**
44 * Model loading storage structures.
45 */
46 typedef struct
47 {
48 void* mmap_zip_data; /* mmap file in one chunk */
49 size_t mmap_zip_size; /* size of above */
50 modelID num_hmmstates; /* number of hmm states ~ 800 */
51 short num_dims; /* feature vector dimensions ~ 36 or 28 */
52 modelID num_pdfs; /* total number of pdfs ~ 4800 */
53 const SWIhmmState *hmmstates; /* size num_hmmstates ~ 800*/
54 const featdata *allmeans; /* size num_dims*num_pdfs ~ 36*4800 */
55 const wtdata *allweights; /* size num_pdfs ~ 4800 */
56 const featdata *avg_state_durations; /* average duration of this acoustic model state */
57 }
58 SWIModel;
59
60 #ifdef __cplusplus
61 extern "C"
62 {
63 #endif
64
65 /* SpeechWorks compact acoustic models */
66 const SWIModel *load_swimodel(const char *filename);
67 void free_swimodel(const SWIModel* swimodel);
68 scodata mixture_diagonal_gaussian_swimodel(const preprocessed *prep, const SWIhmmState *spd, short num_dims);
69
70 extern const char loop_cost_table [128][6];
71 extern const char trans_cost_table [128][6];
72
73 #ifdef __cplusplus
74 }
75 #endif
76
77
78 /* the looping cost for the new duration model. In this new duration model,
79 the looping probability is multiplied by a sigmoid function having the
80 following form: sigm(-scale(duration_so_far-offset)) so that the looping
81 cost increases as the duration_so_far increases and encouraging to
82 stay within a given state for a duration approx. equal to the average state
83 duration. The looping cost values are implemented as a lookup table.*/
84
duration_penalty_loop(frameID average_duration,frameID duration_so_far)85 static PINLINE costdata duration_penalty_loop(frameID average_duration, frameID duration_so_far)
86 {
87 if (average_duration > 127) average_duration = 127;
88 if(duration_so_far> 6) duration_so_far = 6;
89 return (costdata)loop_cost_table[average_duration][duration_so_far-1];
90 }
91
92 /* the transition cost for the new duration model. In this new duration model,
93 the transition probability is multiplied by a sigmoid function having the
94 following form: sigm(scale(duration_so_far-offset)) so that the transition
95 cost decreases as the duration_so_far increases thus encouraging to leave
96 a given state when the duration exceeds the average state duration. The transition
97 cost values are implemented as a lookup table*/
98
duration_penalty_depart(frameID average_duration,frameID duration_so_far)99 static PINLINE costdata duration_penalty_depart(frameID average_duration, frameID duration_so_far)
100 {
101 if (average_duration > 127) average_duration = 127;
102 if(duration_so_far> 6) duration_so_far = 6;
103 return (costdata) trans_cost_table[average_duration][duration_so_far-1];
104 }
105
106 #endif /* __SWIMODEL_H__ */
107
108