14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * swicms.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#include <string.h> 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"swicms.h" 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"srec_sizes.h" 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"prelib.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Session.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_SessionType.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "IntArrayList.h" 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h" 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 31b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland#define printf_vector(HEAD, FMT, PTR, NN) { int i; LCHAR buffer[256]; sprintf(buffer, HEAD); sprintf(buffer + LSTRLEN(buffer), " %p", (void *)PTR); for (i=0; i<(NN); ++i) sprintf(buffer + LSTRLEN(buffer), FMT, PTR[i]); PLogMessage(buffer); } 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Cross-utterance CMN calculation: 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project We try to normalize the speech frames before they get to the recognizer. 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project The speech frames are LDA-processed mfcc-with-dynamic feature vectors. 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project We collect these speech frames during recognition. At the end of 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recognition we exclude the silence frames from the collected data, and 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project generate a new channel average based on the previous average and the new 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data, using an exponential decay formula. 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project In-utterance CMN calculation: 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project A new short-term average mechanism was introduced, with faster update, 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project to improve recognition on the very first recognition after init or reset. 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project We wait for a minimum number of new data frames to apply this. We also 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project disable the fast updater after some frames, because we assume the 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cross-utterance estimator to be more reliable, particularly in its 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ability to exclude silence frames from the calculation. 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/ 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* default settings for cross-utterance cms */ 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_FORGET_FACTOR_DEFAULT 400 /* effective frms of history */ 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_SBINDEX_DEFAULT 100 /* use speech frames only */ 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* #define SWICMS_CACHE_RESOLUTION_DEFAULT see swicms.h */ 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* #define SWICMS_CACHE_SIZE_DEFAULT see swicms.h */ 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* default settings for in-utterance cms */ 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_INUTT_FORGET_FACTOR2_DISABLE 65535 /* any large number */ 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_INUTT_FORGET_FACTOR2_DEFAULT SWICMS_INUTT_FORGET_FACTOR2_DISABLE 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* disable this when cross-utt become more reliable */ 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_INUTT_DISABLE_AFTER_FRAMES 200 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* wait while the estimate is poor */ 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_INUTT_ENABLE_AFTER_FRAMES 10 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Logging Stuff 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LOG_LEVEL 2 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MODULE_NAME L("swicms.c") 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//static const char* MTAG = MODULE_NAME; 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const char *rcsid = 0 ? (const char *) &rcsid : 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project "$Id: swicms.c,v 1.21.6.16 2008/06/05 19:00:55 stever Exp $"; 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_BOOL SWICMS_DEBUG = ESR_FALSE; 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* these are good values from cmn/tmn files */ 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const imeldata gswicms_cmn1_8 [MAX_CHAN_DIM] = 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 158, 141, 99, 125, 101, 162, 113, 138, 128, 143, 123, 141, 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const imeldata gswicms_cmn1_11 [MAX_CHAN_DIM] = 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 163, 121, 120, 114, 124, 139, 144, 108, 150, 119, 146, 124, 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const imeldata gswicms_tmn1_8 [MAX_CHAN_DIM] = 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 108, 138, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const imeldata gswicms_tmn1_11 [MAX_CHAN_DIM] = 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 108, 138, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode GetSomeIntsIfAny( const LCHAR* parname, imeldata* parvalue, size_t reqSize) 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i, size; 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL exists; 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project IntArrayList* intList = 0; 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, ESR_SessionContains(parname, &exists)); 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (exists) { 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_SessionGetProperty(parname, (void**)&intList, TYPES_INTARRAYLIST); 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS && rc != ESR_NO_MATCH_ERROR) { 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* no match will revert to default data already in static array */ 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("Error reading %s from session: %s"), parname, ESR_rc2str(rc)); 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_FATAL_ERROR; 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc == ESR_SUCCESS) { 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, IntArrayListGetSize(intList, &size)); 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(size != reqSize) { 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("Error reading %s from session, expected len %d: %s"), parname, reqSize, ESR_rc2str(rc)); 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_FATAL_ERROR; 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(reqSize == 1) 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, IntArrayListGet(intList, 0, parvalue)); 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else { 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i=0; i<size; ++i) 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, IntArrayListGet(intList, i, &parvalue[i])); 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP: 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_init(swicms_norm_info* swicms) 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i; 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL exists, sessionExists; 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t sample_rate; 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* defaults */ 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->sbindex = SWICMS_SBINDEX_DEFAULT; 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->cached_num_frames = 0; 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->forget_factor = SWICMS_FORGET_FACTOR_DEFAULT; 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->cache_resolution = SWICMS_CACHE_RESOLUTION_DEFAULT; 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->num_frames_in_cmn = 0; 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, ESR_SessionExists(&sessionExists)); 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (sessionExists) 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { /* We'll assume this rate is valid or someone else will be complaining. SteveR */ 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_SessionGetSize_t ( L ( "CREC.Frontend.samplerate" ), &sample_rate ); 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( rc != ESR_SUCCESS ) 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ( rc ); 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project sample_rate = 11025; 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* init the data structures by copying the static data so that we can have a copy if we need to reset */ 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( sample_rate == 8000 ) 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for ( i = 0; i < MAX_CHAN_DIM; i++ ) 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->cmn [i] = gswicms_cmn1_8 [i]; 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->tmn [i] = gswicms_tmn1_8 [i]; 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// _lda_*mn below are OK, but are recalculated in swicms_lda_process() 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->lda_cmn [i] = 0; /* calculated by swicms_lda_process() */ 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->lda_tmn [i] = 0; /* calculated by swicms_lda_process() */ 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for ( i = 0; i < MAX_CHAN_DIM; i++ ) 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->cmn [i] = gswicms_cmn1_11 [i]; 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->tmn [i] = gswicms_tmn1_11 [i]; 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// _lda_*mn below are OK, but are recalculated in swicms_lda_process() 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->lda_cmn [i] = 0; /* calculated by swicms_lda_process() */ 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->lda_tmn [i] = 0; /* calculated by swicms_lda_process() */ 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, ESR_SessionExists(&sessionExists)); 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (sessionExists) 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const LCHAR* parname = L("CREC.Frontend.swicms.debug"); 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, ESR_SessionContains(parname, &exists)); 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (exists) { 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_SessionGetBool(parname, &SWICMS_DEBUG); 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS && rc != ESR_NO_MATCH_ERROR) { 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLOG_DBG_ERROR((L("Error reading %s from session: %s"), parname, ESR_rc2str(rc))); 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.forget_factor"), 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &swicms->forget_factor, 1); 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) return rc; 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.sbindex"), 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &swicms->sbindex, 1); 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) return rc; 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.cmn"), 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &swicms->cmn[0], MAX_CHAN_DIM); 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) return rc; 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( sample_rate == 8000 ) 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.cmn8"), &swicms->cmn[0], MAX_CHAN_DIM); 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.cmn11"), &swicms->cmn[0], MAX_CHAN_DIM); 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.tmn"), 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &swicms->tmn[0], MAX_CHAN_DIM); 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) return rc; 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->is_valid = 0; 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_CHAN_DIM; i++) 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->adjust[i] = 255; 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage("swicms->forget_factor = %d\n", swicms->forget_factor); 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage("swicms->cache_resolution = %d\n", swicms->cache_resolution); 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage("swicms->sbindex = %d\n", swicms->sbindex); 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* in-utt cms parameters */ 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.forget_factor2 = SWICMS_INUTT_FORGET_FACTOR2_DEFAULT; 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.disable_after = 200; 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.enable_after = 10; /* in-utt is less reliable */ 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.num_bou_frames_to_skip = 20; /* silence frames! see windback */ 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.num_frames_since_bou = 0; 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.num_frames_in_accum = 0; 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0; i<MAX_CHAN_DIM; i++) swicms->inutt.accum[i] = 0; 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (sessionExists) { 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = GetSomeIntsIfAny(L("CREC.Frontend.swicms.inutt.forget_factor2"), 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &swicms->inutt.forget_factor2, 1); 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) return rc; 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = GetSomeIntsIfAny(L("CREC.Frontend.swicms.inutt.disable_after"), 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &swicms->inutt.disable_after, 1); 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) return rc; 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = GetSomeIntsIfAny(L("CREC.Frontend.swicms.inutt.enable_after"), 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &swicms->inutt.enable_after, 1); 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) return rc; 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* we need to estimate the in-utt cmn from speech frames only! so let's 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project make sure to skip some frames before collecting data, */ 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_SessionContains(L("CREC.Frontend.start_windback"), &exists); 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (exists) { 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL do_skip_even_frames = ESR_TRUE; 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_SessionGetBool(L("CREC.Frontend.do_skip_even_frames"), &do_skip_even_frames); 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_SessionGetInt(L("CREC.Frontend.start_windback"), &swicms->inutt.num_bou_frames_to_skip); 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if( do_skip_even_frames) 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.num_bou_frames_to_skip /= 2; 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.num_bou_frames_to_skip -= 5; /* ensure spch frames only */ 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP: 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode swicms_get_cmn ( swicms_norm_info* swicms, LCHAR *cmn_params, size_t* len ) 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int dim_count; 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project imeldata temp[MAX_CHAN_DIM]; 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const size_t INT_LENGTH = 12; 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( swicms->_prep != NULL ) /* lda exists give them transformed lda. */ 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ ) 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project temp [dim_count] = swicms->lda_cmn [dim_count]; 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/); 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else /* lda does not exist give them raw cmn values */ 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ ) 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project temp [dim_count] = swicms->cmn [dim_count]; 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for ( dim_count = 0, i = 0; dim_count < MAX_CHAN_DIM; dim_count++ ) 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project i += sprintf( cmn_params + i, dim_count==0 ? "%d" : ",%d", temp [dim_count] ); 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (i + INT_LENGTH >= *len) { 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *len = MAX_CHAN_DIM * (INT_LENGTH + 2) * sizeof(LCHAR); 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_BUFFER_OVERFLOW; 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode swicms_set_cmn ( swicms_norm_info* swicms, const char *cmn_params ) 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode set_status; 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int length_of_params; 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int dim_count; 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int got_word; 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int current_position; 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char *copy_of_params; 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char *parsed_strings [MAX_CHAN_DIM]; 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int temp_cmn [MAX_CHAN_DIM]; 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project length_of_params = strlen ( cmn_params ) + 1; 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project copy_of_params = (char*)MALLOC ( length_of_params, NULL ); 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( copy_of_params != NULL ) 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_SUCCESS; 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project memcpy ( copy_of_params, cmn_params, length_of_params ); 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dim_count = 0; 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project current_position = 0; 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project got_word = 0; 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project parsed_strings [dim_count] = copy_of_params + current_position; 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while ( ( dim_count < MAX_CHAN_DIM ) && ( set_status == ESR_SUCCESS ) ) 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch ( *( copy_of_params + current_position ) ) 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '\0': 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( got_word == 1 ) 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( dim_count == ( MAX_CHAN_DIM - 1 ) ) 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dim_count++; 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "Channel Normalization : Missing Params Must Contain %d Params\n", MAX_CHAN_DIM ); 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_INVALID_ARGUMENT; 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "Channel Normalization : Missing Params Mus Contain %d Params\n", MAX_CHAN_DIM ); 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_INVALID_ARGUMENT; 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case ',': 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( got_word == 1 ) 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( dim_count < ( MAX_CHAN_DIM - 1 ) ) 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dim_count++; 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *( copy_of_params + current_position) = '\0'; 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project current_position++; 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( current_position == length_of_params ) 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "Channel Normalization : Delimiter At End Of Param String\n" ); 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_INVALID_ARGUMENT; 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project parsed_strings [dim_count] = copy_of_params + current_position; 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project got_word = 0; 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "Channel Normalization : Too Many Params Must Contain %d Params\n", MAX_CHAN_DIM ); 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_INVALID_ARGUMENT; 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "Channel Normalization : Too Many Params Must Contain %d Params\n", MAX_CHAN_DIM ); 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_INVALID_ARGUMENT; 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '0': 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '1': 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '2': 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '3': 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '4': 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '5': 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '6': 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '7': 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '8': 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case '9': 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project got_word = 1; 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project current_position++; 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( current_position == length_of_params ) 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "Channel Normalization : Too Many Params Must Contain %d Params\n", MAX_CHAN_DIM ); 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_INVALID_ARGUMENT; 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "Channel Normalization : Invalid Param : %c : Params Must Contain Only Digits\n" ); 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_INVALID_ARGUMENT; 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( set_status == ESR_SUCCESS ) 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dim_count = 0; 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while ( ( dim_count < MAX_CHAN_DIM ) && ( set_status == ESR_SUCCESS ) ) 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project temp_cmn [dim_count] = atoi ( parsed_strings [dim_count] ); 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( ( temp_cmn [dim_count] < 0 ) || ( temp_cmn [dim_count] > 255 ) ) 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_INVALID_ARGUMENT; 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 430451b70dd901181b96a027b1d44e4764a156c0330Christer Fletcher 431451b70dd901181b96a027b1d44e4764a156c0330Christer Fletcher dim_count++; 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( set_status == ESR_SUCCESS ) 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ ) 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->cmn [dim_count] = temp_cmn [dim_count]; 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( swicms->_prep != NULL ) /* Set now if NULL it will automatically be set on first utterance */ 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project linear_transform_frame(swicms->_prep, swicms->lda_cmn, 1 /*do_shift*/); 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE ( copy_of_params ); 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "Channel Normalization Out Of Memory Error\n" ); 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project set_status = ESR_OUT_OF_MEMORY; 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->num_frames_in_cmn = 0; 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ( set_status ); 4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_cache_frame(swicms_norm_info* swicms, imeldata* frame, int dimen) 4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project imeldata *pcache, *pframe; 4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(dimen == MAX_CHAN_DIM); 4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project i = swicms->cached_num_frames / swicms->cache_resolution; 4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (i < SWICMS_CACHE_SIZE_DEFAULT) 4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pcache = swicms->cached_sections[ i]; 4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (swicms->cached_num_frames % swicms->cache_resolution == 0) 4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_CHAN_DIM; i++) *pcache++ = 0; 4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pcache -= MAX_CHAN_DIM; 4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pframe = frame; 4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_CHAN_DIM; i++) *pcache++ += *pframe++; 4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->cached_num_frames++; 4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint apply_channel_normalization_in_swicms(swicms_norm_info *swicms, 4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project imeldata* oframe, 4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project imeldata* iframe, int dimen) 4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii; 4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(dimen == MAX_CHAN_DIM); 4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* IF inutt is activated at all */ 4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(swicms->inutt.forget_factor2 != SWICMS_INUTT_FORGET_FACTOR2_DISABLE) { 4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* AND IF we have not disabled it (due to x-utt more reliable) */ 4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(swicms->inutt.num_frames_in_accum < swicms->inutt.disable_after) { 4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* AND IF we have skipped past the silence frames */ 4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if( swicms->inutt.num_frames_since_bou >= swicms->inutt.num_bou_frames_to_skip){ 4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.num_frames_in_accum++; 4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(ii=0;ii<dimen;ii++) swicms->inutt.accum[ii] += iframe[ii]; 4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* AND IF we've already seen at least 10 frames (presumably) of speech */ 4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(swicms->inutt.num_frames_in_accum>swicms->inutt.enable_after) { 4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* THEN we update the adjustment in-line with the current utterance! */ 4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(ii=0;ii<dimen;ii++) { 4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project imeldata denom = ( swicms->inutt.forget_factor2 4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project + swicms->inutt.num_frames_in_accum ); 4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* tmp: weighted average of the old lda_cmn and the new accum */ 4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project imeldata tmp=(swicms->lda_cmn[ii]*swicms->inutt.forget_factor2 4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project + swicms->inutt.accum[ii] + denom/2) / denom; 5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->adjust[ii] = swicms->lda_tmn[ii] - tmp; 5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->adjust2 "," %d",swicms->adjust, dimen); 5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.num_frames_since_bou++; 5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii = 0; ii < dimen; ii++) 5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project oframe[ii] = MAKEBYTE(iframe[ii] + swicms->adjust[ii]); 5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_update(swicms_norm_info* swicms, int speech_start, int speech_end) 5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i, j; 5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project asr_int32_t speech_avg[MAX_CHAN_DIM], backgr_avg[MAX_CHAN_DIM], avg[MAX_CHAN_DIM]; 5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ff; 5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int nn, speech_nn, backgr_nn; 5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int num_frames = swicms->cached_num_frames; 5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int cache_start, cache_end, backgr_cache_end; 5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int sbindex = swicms->sbindex; 5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* init for utterance */ 5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->inutt.num_frames_since_bou = 0; 5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->cached_num_frames = 0; 5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cache_start = speech_start; 5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cache_start -= (cache_start % swicms->cache_resolution); 5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cache_start /= swicms->cache_resolution; 5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (speech_end == MAXframeID) 5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cache_end = SWICMS_CACHE_SIZE_DEFAULT; 5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (speech_end < num_frames) 5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cache_end = speech_end; 5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cache_end = num_frames; 5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cache_end -= (cache_end % swicms->cache_resolution); 5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cache_end /= swicms->cache_resolution; 5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (num_frames == 0 || speech_end == 0 || speech_start == speech_end || speech_end == MAXframeID) 5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (speech_end != 0 || speech_start != 0) 5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError("Warning: speech_bounds (%d,%d) swicms->cached_num_frames (%d)\n", 5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project speech_start, speech_end, num_frames); 5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (SWICMS_DEBUG) { 5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->adjust.rep", " %d", swicms->adjust, MAX_CHAN_DIM); 5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backgr_cache_end = (num_frames - num_frames % swicms->cache_resolution) / swicms->cache_resolution; 5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project speech_nn = (cache_end - cache_start) * swicms->cache_resolution; 5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backgr_nn = backgr_cache_end * swicms->cache_resolution - speech_nn; 5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_CHAN_DIM; i++) 5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project speech_avg[i] = 0; 5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backgr_avg[i] = 0; 5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (j = cache_start; j < cache_end; j++) 5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project speech_avg[i] += swicms->cached_sections[j][i]; 5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (j = 0; j < cache_start; j++) 5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backgr_avg[i] += swicms->cached_sections[j][i]; 5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (j = cache_end; j < backgr_cache_end; j++) 5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backgr_avg[i] += swicms->cached_sections[j][i]; 5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (speech_nn == 0 && backgr_nn > 0) 5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backgr_avg[i] /= backgr_nn; 5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project speech_avg[i] = backgr_avg[i]; 5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project speech_nn = backgr_nn; 5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (speech_nn > 0 && backgr_nn == 0) 5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project speech_avg[i] /= speech_nn; 5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backgr_avg[i] = speech_avg[i]; 5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backgr_nn = speech_nn; 5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (speech_nn > 0 && backgr_nn > 0) 5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project speech_avg[i] /= speech_nn; 5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backgr_avg[i] /= backgr_nn; 5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project avg[i] = (sbindex * speech_avg[i] + (100 - sbindex) * backgr_avg[i] + 50) / 100; 5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nn = (sbindex * speech_nn + (100 - sbindex) * backgr_nn + 50) / 100; 5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0, ff = 0; i < MAX_CHAN_DIM; i++) 5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ff += (swicms->lda_tmn[i] - avg[i]); 6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ff /= MAX_CHAN_DIM; /* sum is now the average offset from TMN */ 6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ff > 5) 6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError("Warning: bad utt mean during swicms_update() (moffs=%d)\n", ff); 6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->adjust.rep", " %d", swicms->adjust, MAX_CHAN_DIM); 6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ff = swicms->forget_factor; 6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ff < 9999) 6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_CHAN_DIM; i++) 6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->lda_cmn[i] = (swicms->lda_cmn[i] * ff + avg[i] * nn + (ff + nn) / 2) / (ff + nn); 6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->adjust[i] = swicms->lda_tmn[i] - swicms->lda_cmn[i]; 6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (SWICMS_DEBUG) 6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project imeldata temp[MAX_CHAN_DIM]; 6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage("swicms_update() used %d frames (%d-%d)", nn, speech_start, speech_end); 6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0;i<MAX_CHAN_DIM;i++) temp[i]=swicms->lda_cmn[i]; 6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/); 6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* use this dump, to put back into CREC.Frontend.swicms.cmn */ 6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf_vector("swicms.cmn(r) ", " %d", temp, MAX_CHAN_DIM); 6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms.lda_cmn ", " %d", &swicms.lda_cmn [0], MAX_CHAN_DIM); 6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms.lda_tmn ", " %d", &swicms.lda_tmn [0], MAX_CHAN_DIM); 6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->adjust", " %d", swicms->adjust, MAX_CHAN_DIM); 6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("avg.speech ", " %d", avg, MAX_CHAN_DIM); 6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NDEBUG 6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->adjust", " %d", swicms->adjust, MAX_CHAN_DIM); 6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->num_frames_in_cmn += nn; 6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_lda_process(swicms_norm_info* swicms, preprocessed* prep) 6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_CHAN_DIM; i++) swicms->lda_tmn[i] = swicms->tmn[i]; 6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_CHAN_DIM; i++) swicms->lda_cmn[i] = swicms->cmn[i]; 6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project linear_transform_frame(prep, swicms->lda_tmn, 1 /*do_shift*/); 6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project linear_transform_frame(prep, swicms->lda_cmn, 1 /*do_shift*/); 6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_CHAN_DIM; i++) 6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->adjust[i] = swicms->lda_tmn[i] - swicms->lda_cmn[i]; 6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NDEBUG 6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->adjust", " %d", swicms->adjust, MAX_CHAN_DIM); 6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->is_valid = 1; 6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project swicms->_prep = prep; 6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(SWICMS_DEBUG) { 6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project imeldata temp[MAX_CHAN_DIM]; 6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf_vector("swicms->cmn ", " %d", swicms->cmn, MAX_CHAN_DIM); 6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf_vector("swicms->lda_cmn ", " %d", swicms->lda_cmn, MAX_CHAN_DIM); 6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->tmn ", " %d", swicms->tmn, MAX_CHAN_DIM); 6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->lda_tmn ", " %d", swicms->lda_tmn, MAX_CHAN_DIM); 6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->adjust ", " %d", swicms->adjust, MAX_CHAN_DIM); 6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //for(i=0;i<MAX_CHAN_DIM;i++) temp[i]=swicms->lda_tmn[i]; 6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/); 6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf_vector("swicms->tmn(r) ", " %d", temp, MAX_CHAN_DIM); 6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0;i<MAX_CHAN_DIM;i++) temp[i]=swicms->lda_cmn[i]; 6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/); 6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf_vector("swicms->cmn(r) ", " %d", temp, MAX_CHAN_DIM); 6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 685