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 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 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