1 /*---------------------------------------------------------------------------* 2 * cnfd_scr.c * 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 /* Mark - Jan 2002 */ 21 22 #include "math.h" 23 #include "stdlib.h" 24 #include "stdio.h" 25 #include "simapi.h" 26 #include "pendian.h" 27 #include "portable.h" 28 #include "srec_results.h" 29 #include "ESR_Session.h" 30 31 #if USE_CONFIDENCE_SCORER 32 33 #ifdef SREC_ENGINE_VERBOSE_LOGGING 34 static const char* const conf_feature_names[12] = 35 { "gdiff", "sd", "sd13", "spf", "abs", "gdiffpf", "gv" }; 36 #endif 37 38 #define CONF_FEATURE_GDIFF 0 39 #define CONF_FEATURE_SCORE_DIFF 1 40 #define CONF_FEATURE_SCORE_DIFF13 2 41 #define CONF_FEATURE_SCORE_PER_FRAME 3 42 #define CONF_FEATURE_ABSOLUTE_SCORE 4 43 #define CONF_FEATURE_GDIFF_PER_FRAME 5 44 #define NUM_CONF_FEATURES 6 45 #if NUM_CONF_FEATURES != NCONFPARS 46 #error allocate difference in simapi.h 47 #endif 48 49 CA_ConfidenceScorer* CA_AllocateConfidenceScorer(void) 50 { 51 CA_ConfidenceScorer *hConfidenceScorer; 52 hConfidenceScorer = NULL; 53 54 TRY_CA_EXCEPT 55 56 hConfidenceScorer = (CA_ConfidenceScorer *) CALLOC_CLR(1, 57 sizeof(CA_ConfidenceScorer), "ca.hConfidenceScorer"); 58 59 return (hConfidenceScorer); 60 61 BEG_CATCH_CA_EXCEPT 62 END_CATCH_CA_EXCEPT(hConfidenceScorer) 63 64 } 65 66 67 void CA_FreeConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer) 68 { 69 TRY_CA_EXCEPT 70 71 ASSERT(hConfidenceScorer); 72 73 CA_UnloadConfidenceScorer(hConfidenceScorer); 74 75 FREE((char *) hConfidenceScorer); 76 return; 77 78 BEG_CATCH_CA_EXCEPT 79 END_CATCH_CA_EXCEPT(hConfidenceScorer); 80 } 81 82 83 int CA_LoadConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer) 84 { 85 static char const * const names[NUM_CONF_FEATURES] = { 86 "gdiff", 87 "sd", 88 "sd13", 89 "spf", 90 "abs", 91 "gdiffpf", 92 }; 93 int i, j; 94 95 for (j = 0; j < 2; j++) { 96 for (i = 0; i < NUM_CONF_FEATURES; i++) { 97 char name[256]; 98 char value[256]; 99 Confidence_model_parameters* params; 100 size_t len; 101 102 if (j == 0) { 103 params = &hConfidenceScorer->one_nbest; 104 sprintf(name, "SREC.Confidence.sigmoid_param.%s.one_nbest", names[i]); 105 } 106 else { 107 params = &hConfidenceScorer->many_nbest; 108 sprintf(name, "SREC.Confidence.sigmoid_param.%s.many_nbest", names[i]); 109 } 110 len = P_PATH_MAX; 111 if (ESR_SUCCESS != ESR_SessionGetLCHAR(name, (LCHAR*) value, &len)) { 112 return ESR_FALSE; 113 } 114 if (3 != sscanf(value, "%lg %lg %lg", 115 ¶ms->scale[i], ¶ms->offset[i], ¶ms->weight[i])) { 116 return ESR_FALSE; 117 } 118 } 119 } 120 return ESR_TRUE; 121 } 122 123 124 void CA_UnloadConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer) 125 { 126 ASSERT(hConfidenceScorer); 127 } 128 129 130 131 static int CA_ConfScorerGetFeatures(CA_Recog* recog, CA_NBestList *nbestlist, float* features, int *num_features, 132 int choice_number, int num_choices_left); 133 134 int CA_ComputeConfidenceValues(CA_ConfidenceScorer* hConfidenceScorer, CA_Recog* recog, 135 CA_NBestList *nbestlist) 136 { 137 float features[12]; 138 double value=1.0, final_value, confidence_value; 139 double confidence_feature, confidence_feature_weighted; 140 int i, num_features,current_choice; 141 int rc, error_check; 142 int num_choices,num_choices_left; 143 144 confidence_value = 1.0; 145 num_choices_left = num_choices = srec_nbest_get_num_choices(nbestlist); 146 147 for(current_choice=0;current_choice<num_choices;current_choice++) 148 { 149 confidence_value = 1.0; 150 rc = CA_ConfScorerGetFeatures(recog, nbestlist, features, &num_features, current_choice, num_choices_left); 151 if (rc) 152 { 153 PLogError("confscor failed\n"); 154 error_check = srec_nbest_put_confidence_value(nbestlist, current_choice, 0); 155 if(error_check) 156 return 1; 157 num_choices_left--; 158 continue; 159 } 160 161 if (num_choices_left == 1) 162 { 163 for (i=0;i<NUM_CONF_FEATURES;i++) { 164 if(i==CONF_FEATURE_SCORE_DIFF || i==CONF_FEATURE_SCORE_DIFF13) { 165 confidence_feature_weighted = 1.0; 166 } 167 else { 168 confidence_feature = 1.0/(1.0 + exp((hConfidenceScorer->one_nbest.scale[i] * 169 features[i]) + hConfidenceScorer->one_nbest.offset[i])); 170 confidence_feature_weighted = pow(confidence_feature,hConfidenceScorer->one_nbest.weight[i]); 171 } 172 confidence_value = confidence_value * confidence_feature_weighted; 173 } 174 } 175 else 176 { 177 for (i=0;i<NUM_CONF_FEATURES;i++) { 178 confidence_feature = 1.0/(1.0 + exp((hConfidenceScorer->many_nbest.scale[i] * 179 features[i]) + hConfidenceScorer->many_nbest.offset[i])); 180 confidence_value = confidence_value * pow(confidence_feature, hConfidenceScorer->many_nbest.weight[i]); 181 } 182 } 183 184 value *= confidence_value; 185 final_value = 1000.0 * value; 186 error_check = srec_nbest_put_confidence_value(nbestlist, current_choice, (int)final_value); 187 if(error_check) 188 return 1; 189 num_choices_left--; 190 } 191 num_choices_left = srec_nbest_fix_homonym_confidence_values( nbestlist); 192 #ifdef SREC_ENGINE_VERBOSE_LOGGING 193 PLogMessage("confidence %d features ", (int)final_value); 194 for (i = 0; i < num_features; i++) 195 PLogMessage(" %s %f", conf_feature_names[i], features[i]); 196 #endif 197 198 return 0; 199 } 200 201 int CA_ConfScorerGetFeatures(CA_Recog* recog, CA_NBestList *nbestlist, float* features, int *num_features, 202 int choice_number, int num_choices_left) 203 { 204 //static char* rejfeat_type = (char*) - 1; 205 int rc; 206 asr_int32_t num_speech_frames = 400; 207 #define MAX_ENTRY_LENGTH 512 208 char label0[MAX_ENTRY_LENGTH]; 209 char label1[MAX_ENTRY_LENGTH]; 210 asr_int32_t cost0, cost1, cost2; 211 asr_int32_t speech_cost0; 212 asr_int32_t gsm_cost = 0, am_index = 0, num_words = 0; 213 214 if (!nbestlist) 215 return 1; 216 217 ASSERT(features); 218 ASSERT(num_features); 219 ASSERT(nbestlist); 220 ASSERT(recog); 221 222 /* @F=(,"gdiff","sdiff12","sdiff13","spf1","speechcost0","gdiffpf"); 223 0 1 2 3 4 5 */ 224 if (num_choices_left > 0) 225 { 226 rc = srec_nbest_get_result(nbestlist, choice_number, label0, MAX_ENTRY_LENGTH, &cost0, choice_number); 227 if (rc) return rc; 228 rc = srec_nbest_get_choice_info(nbestlist, choice_number, &num_speech_frames, "num_speech_frames"); 229 if (rc) return rc; 230 rc = srec_nbest_get_choice_info(nbestlist, choice_number, &speech_cost0, "speech_frames_cost"); 231 if (rc) return rc; 232 ASSERT(!rc); 233 features[CONF_FEATURE_ABSOLUTE_SCORE] = ((float)(speech_cost0)); 234 features[CONF_FEATURE_SCORE_PER_FRAME] = ((float)(speech_cost0)) / (float)num_speech_frames; 235 if (num_choices_left> 1) 236 { 237 rc = srec_nbest_get_result(nbestlist, choice_number+1, label1, MAX_ENTRY_LENGTH, &cost1, choice_number); 238 if (rc) return rc; 239 features[CONF_FEATURE_SCORE_DIFF] = ((float)cost1 - (float)cost0); 240 if (num_choices_left > 2) 241 { 242 rc = srec_nbest_get_result(nbestlist, choice_number+2, label1, MAX_ENTRY_LENGTH, &cost2, choice_number); 243 if (rc) return rc; 244 features[CONF_FEATURE_SCORE_DIFF13] = ((float)cost2 - (float)cost0); 245 } 246 else 247 { 248 cost2 = (-1); 249 features[CONF_FEATURE_SCORE_DIFF13] = ((float)cost1 - (float)cost0); 250 } 251 } 252 else 253 { 254 features[CONF_FEATURE_SCORE_DIFF] = 400; 255 features[CONF_FEATURE_SCORE_DIFF13] = 400; 256 cost1 = cost2 = (-1); 257 } 258 259 260 srec_nbest_get_choice_info(nbestlist, choice_number, &gsm_cost, "gsm_cost"); 261 srec_nbest_get_choice_info(nbestlist, choice_number, &am_index, "acoustic_model_index"); 262 srec_nbest_get_choice_info(nbestlist, choice_number, &num_words, "num_words"); 263 264 features[CONF_FEATURE_GDIFF] = (float)(speech_cost0 - gsm_cost); 265 /* should never happen */ 266 if (num_speech_frames == 0) num_speech_frames = 1; 267 features[CONF_FEATURE_GDIFF_PER_FRAME] = ((float)(speech_cost0 - gsm_cost)) / (float)num_speech_frames; 268 // features[CONF_FEATURE_GENDER_VALUE] = (float)am_index; 269 *num_features = NUM_CONF_FEATURES; 270 rc = 0; 271 } 272 else 273 { 274 *num_features = 0; 275 rc = 1; 276 } 277 278 #define DUMP_FEATURES_FOR_RETRAIN 0 279 #if DUMP_FEATURES_FOR_RETRAIN 280 srec_nbest_get_choice_info(nbestlist, 0, &gsm_cost, "gsm_cost"); 281 srec_nbest_get_choice_info(nbestlist, 0, &am_index, "acoustic_model_index"); 282 srec_nbest_get_choice_info(nbestlist, 0, &num_words, "num_words"); 283 284 printf("REJFEATS:"); 285 printf(" cost0(%d)", cost0); 286 printf(" cost1(%d)", cost1); 287 printf(" cost2(%d)", cost2); 288 printf(" speechcost0(%d)", speech_cost0); 289 printf(" nframes0(%d)", num_speech_frames); 290 printf(" nwords0(%d)", num_words); 291 printf(" gsmcost(%d)", gsm_cost); 292 printf(" amindex(%d)", am_index); 293 /* printf(" glmcost(%d)", glm_cost);*/ 294 printf("\n"); 295 #endif 296 return rc; /* no error reported */ 297 } 298 299 300 #endif /* #if USE_CONFIDENCE_SCORER */ 301 302