14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  cnfd_scr.c  *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Mark - Jan 2002 */
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "math.h"
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "stdlib.h"
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "stdio.h"
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "simapi.h"
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pendian.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h"
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec_results.h"
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Session.h"
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if USE_CONFIDENCE_SCORER
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const char* const conf_feature_names[12] =
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  { "gdiff", "sd", "sd13", "spf", "abs", "gdiffpf", "gv" };
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CONF_FEATURE_GDIFF           0
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CONF_FEATURE_SCORE_DIFF      1
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CONF_FEATURE_SCORE_DIFF13    2
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CONF_FEATURE_SCORE_PER_FRAME 3
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CONF_FEATURE_ABSOLUTE_SCORE  4
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CONF_FEATURE_GDIFF_PER_FRAME 5
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define NUM_CONF_FEATURES            6
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if NUM_CONF_FEATURES != NCONFPARS
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#error allocate difference in simapi.h
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCA_ConfidenceScorer* CA_AllocateConfidenceScorer(void)
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_ConfidenceScorer *hConfidenceScorer;
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hConfidenceScorer = NULL;
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  TRY_CA_EXCEPT
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hConfidenceScorer = (CA_ConfidenceScorer *) CALLOC_CLR(1,
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                      sizeof(CA_ConfidenceScorer), "ca.hConfidenceScorer");
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return (hConfidenceScorer);
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  BEG_CATCH_CA_EXCEPT
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  END_CATCH_CA_EXCEPT(hConfidenceScorer)
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_FreeConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer)
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  TRY_CA_EXCEPT
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hConfidenceScorer);
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_UnloadConfidenceScorer(hConfidenceScorer);
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) hConfidenceScorer);
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  BEG_CATCH_CA_EXCEPT
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  END_CATCH_CA_EXCEPT(hConfidenceScorer);
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint CA_LoadConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer)
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  static char const * const names[NUM_CONF_FEATURES] = {
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      "gdiff",
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      "sd",
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      "sd13",
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      "spf",
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      "abs",
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      "gdiffpf",
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  };
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i, j;
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (j = 0; j < 2; j++) {
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; i < NUM_CONF_FEATURES; i++) {
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      char name[256];
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      char value[256];
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      Confidence_model_parameters* params;
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      size_t len;
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (j == 0) {
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        params = &hConfidenceScorer->one_nbest;
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        sprintf(name, "SREC.Confidence.sigmoid_param.%s.one_nbest", names[i]);
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else {
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        params = &hConfidenceScorer->many_nbest;
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        sprintf(name, "SREC.Confidence.sigmoid_param.%s.many_nbest", names[i]);
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      len = P_PATH_MAX;
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (ESR_SUCCESS != ESR_SessionGetLCHAR(name, (LCHAR*) value, &len)) {
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_FALSE;
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (3 != sscanf(value, "%lg %lg %lg",
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          &params->scale[i], &params->offset[i], &params->weight[i])) {
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_FALSE;
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_TRUE;
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_UnloadConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer)
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hConfidenceScorer);
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int CA_ConfScorerGetFeatures(CA_Recog* recog, CA_NBestList *nbestlist, float* features, int *num_features,
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project									int choice_number, int num_choices_left);
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint CA_ComputeConfidenceValues(CA_ConfidenceScorer* hConfidenceScorer, CA_Recog* recog,
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                                            CA_NBestList *nbestlist)
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  float features[12];
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  double value=1.0, final_value, confidence_value;
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  double confidence_feature, confidence_feature_weighted;
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i, num_features,current_choice;
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int rc, error_check;
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_choices,num_choices_left;
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  confidence_value = 1.0;
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  num_choices_left = num_choices = srec_nbest_get_num_choices(nbestlist);
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(current_choice=0;current_choice<num_choices;current_choice++)
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      confidence_value = 1.0;
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = CA_ConfScorerGetFeatures(recog, nbestlist, features, &num_features, current_choice, num_choices_left);
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc)
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError("confscor failed\n");
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          error_check = srec_nbest_put_confidence_value(nbestlist, current_choice, 0);
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if(error_check)
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            return 1;
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          num_choices_left--;
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          continue;
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (num_choices_left == 1)
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          for (i=0;i<NUM_CONF_FEATURES;i++) {
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if(i==CONF_FEATURE_SCORE_DIFF || i==CONF_FEATURE_SCORE_DIFF13) {
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              confidence_feature_weighted = 1.0;
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            else {
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              confidence_feature = 1.0/(1.0 + exp((hConfidenceScorer->one_nbest.scale[i] *
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                                   features[i]) + hConfidenceScorer->one_nbest.offset[i]));
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              confidence_feature_weighted = pow(confidence_feature,hConfidenceScorer->one_nbest.weight[i]);
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            confidence_value = confidence_value * confidence_feature_weighted;
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          for (i=0;i<NUM_CONF_FEATURES;i++) {
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            confidence_feature = 1.0/(1.0 + exp((hConfidenceScorer->many_nbest.scale[i] *
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                                 features[i]) + hConfidenceScorer->many_nbest.offset[i]));
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            confidence_value = confidence_value * pow(confidence_feature, hConfidenceScorer->many_nbest.weight[i]);
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      value *= confidence_value;
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      final_value = 1000.0 * value;
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      error_check = srec_nbest_put_confidence_value(nbestlist, current_choice, (int)final_value);
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(error_check)
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return 1;
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      num_choices_left--;
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	num_choices_left = srec_nbest_fix_homonym_confidence_values( nbestlist);
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogMessage("confidence %d features ", (int)final_value);
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < num_features; i++)
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogMessage(" %s %f", conf_feature_names[i], features[i]);
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint CA_ConfScorerGetFeatures(CA_Recog* recog, CA_NBestList *nbestlist, float* features, int *num_features,
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project							 int choice_number, int num_choices_left)
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //static char* rejfeat_type = (char*) - 1;
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int rc;
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  asr_int32_t num_speech_frames = 400;
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_ENTRY_LENGTH 512
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char label0[MAX_ENTRY_LENGTH];
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char label1[MAX_ENTRY_LENGTH];
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  asr_int32_t cost0, cost1, cost2;
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  asr_int32_t speech_cost0;
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  asr_int32_t gsm_cost = 0, am_index = 0, num_words = 0;
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!nbestlist)
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(features);
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(num_features);
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(nbestlist);
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(recog);
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* @F=(,"gdiff","sdiff12","sdiff13","spf1","speechcost0","gdiffpf");
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            0       1          2        3         4           5      */
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (num_choices_left > 0)
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = srec_nbest_get_result(nbestlist, choice_number, label0, MAX_ENTRY_LENGTH, &cost0, choice_number);
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc) return rc;
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = srec_nbest_get_choice_info(nbestlist, choice_number, &num_speech_frames, "num_speech_frames");
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc) return rc;
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = srec_nbest_get_choice_info(nbestlist, choice_number, &speech_cost0, "speech_frames_cost");
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc) return rc;
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ASSERT(!rc);
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    features[CONF_FEATURE_ABSOLUTE_SCORE] = ((float)(speech_cost0));
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    features[CONF_FEATURE_SCORE_PER_FRAME] = ((float)(speech_cost0)) / (float)num_speech_frames;
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (num_choices_left> 1)
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = srec_nbest_get_result(nbestlist, choice_number+1, label1, MAX_ENTRY_LENGTH, &cost1, choice_number);
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc) return rc;
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      features[CONF_FEATURE_SCORE_DIFF] = ((float)cost1 - (float)cost0);
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (num_choices_left > 2)
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = srec_nbest_get_result(nbestlist, choice_number+2, label1, MAX_ENTRY_LENGTH, &cost2, choice_number);
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (rc) return rc;
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        features[CONF_FEATURE_SCORE_DIFF13] = ((float)cost2 - (float)cost0);
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        cost2 = (-1);
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        features[CONF_FEATURE_SCORE_DIFF13] = ((float)cost1 - (float)cost0);
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      features[CONF_FEATURE_SCORE_DIFF] = 400;
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      features[CONF_FEATURE_SCORE_DIFF13] = 400;
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      cost1 = cost2 = (-1);
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    srec_nbest_get_choice_info(nbestlist, choice_number, &gsm_cost, "gsm_cost");
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    srec_nbest_get_choice_info(nbestlist, choice_number, &am_index, "acoustic_model_index");
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    srec_nbest_get_choice_info(nbestlist, choice_number, &num_words, "num_words");
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    features[CONF_FEATURE_GDIFF] = (float)(speech_cost0 - gsm_cost);
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* should never happen */
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (num_speech_frames == 0) num_speech_frames = 1;
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    features[CONF_FEATURE_GDIFF_PER_FRAME] = ((float)(speech_cost0 - gsm_cost)) / (float)num_speech_frames;
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // features[CONF_FEATURE_GENDER_VALUE] = (float)am_index;
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *num_features = NUM_CONF_FEATURES;
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = 0;
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *num_features = 0;
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = 1;
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DUMP_FEATURES_FOR_RETRAIN 0
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DUMP_FEATURES_FOR_RETRAIN
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  srec_nbest_get_choice_info(nbestlist, 0, &gsm_cost, "gsm_cost");
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  srec_nbest_get_choice_info(nbestlist, 0, &am_index, "acoustic_model_index");
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  srec_nbest_get_choice_info(nbestlist, 0, &num_words, "num_words");
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf("REJFEATS:");
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf(" cost0(%d)", cost0);
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf(" cost1(%d)", cost1);
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf(" cost2(%d)", cost2);
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf(" speechcost0(%d)", speech_cost0);
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf(" nframes0(%d)", num_speech_frames);
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf(" nwords0(%d)", num_words);
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf(" gsmcost(%d)", gsm_cost);
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf(" amindex(%d)", am_index);
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* printf(" glmcost(%d)", glm_cost);*/
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  printf("\n");
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc; /* no error reported */
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* #if USE_CONFIDENCE_SCORER */
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
302