14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * test_g2g.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 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pstdio.h" 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h" 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "HashMap.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_Grammar.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_Vocabulary.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticResult.h" 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Session.h" 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Locale.h" 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_CommandLine.h" 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "LCHAR.h" 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PFileSystem.h" 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PANSIFileSystem.h" 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_GrammarImpl.h" 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "simapi.h" 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec_context.h" 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec_arb.h" 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @todo document 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef struct 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unsigned short nnodes; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unsigned long size; 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project long phoneme; 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unsigned short node_pos; 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unsigned long node_off; 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project short low_genone_no; 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project short high_genone_no; 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project short low_pel_no; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project short high_pel_no; 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttree_head; 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint usage(LCHAR* exename) 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT,"usage: %s -base <basefilename> \n",exename); 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT,"<basefilename> can be a file.g2g or @g2gfilelist\n"); 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT,"[-checkword id] .. also checks word id in the file\n"); 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT,"[-swiarb esr/config/lang/models/generic.swiarb] ... enables word check\n"); 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* protos */ 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode find_phonemes_for_ihmms( CA_Arbdata* ca_arbdata, modelID* ihmms, int num_hmms); 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode Parse(SR_Grammar* grammar, LCHAR* trans, PFile* fout); 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint CheckG2G(CA_Arbdata* arbdata, int* p4pTable, const char* base, int wordid, char* outbase); 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid load_filelist(char* filelist, char*** pfiles, int *pnum_files); 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint *phonemecode_for_pel_table(CA_Arbdata* arbdata); 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint debug = 0; 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_LINE_LENGTH 256 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_STR_LENGTH 80 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_SEM_RESULTS 3 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_KEYS 30 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* main */ 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint main (int argc, char **argv) 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR base[P_PATH_MAX] = L(""); 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_Arbdata* ca_arbdata; 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char* arbfile = NULL; 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char** g2glist; 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int g2glist_len; 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char* outbase = NULL; 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *p4pTable; 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int wordid = 0; 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int log_level = 0; 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Initialize portable library. 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PMemInit()); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* CHKLOG(rc, PFileSystemCreate()); 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PANSIFileSystemCreate()); 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PANSIFileSystemAddPath(L("/dev/ansi"), L("/")));*/ 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Set ANSI file-system as default file-system */ 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* CHKLOG(rc, PANSIFileSystemSetDefault(ESR_TRUE));*/ 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Set virtual current working directory to native current working directory */ 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* len = P_PATH_MAX; 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PANSIFileSystemGetcwd(cwd, &len)); 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PFileSystemChdir(cwd));*/ 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if( argc <= 1) 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project usage(argv[0]); 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project exit(EXIT_FAILURE); 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 1; i < argc; ++i) 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(!LSTRCMP(argv[i], L("-base"))) 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ++i; 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(base, argv[i]); 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if(!LSTRCMP(argv[i],L("-out"))) 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project outbase = argv[++i]; 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if(!LSTRCMP(argv[i],L("-swiarb"))) 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arbfile = argv[++i]; 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if(!LSTRCMP(argv[i],L("-checkword"))) 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project wordid = atoi(argv[++i]); 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if(!LSTRCMP(argv[i],L("-log"))) 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_level = 10; 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf("unrecog'd argument %s\n", argv[i]); 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project exit(1); 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHK(rc, PLogInit(NULL, log_level)); 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(arbfile) { 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ca_arbdata = CA_LoadArbdata(arbfile); 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(!ca_arbdata) { 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "Error: loading arbfile %s\n", arbfile); 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "arbdata done\n"); 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project p4pTable = phonemecode_for_pel_table(ca_arbdata); 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "p4pTable done\n"); 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ca_arbdata = 0; 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project p4pTable = 0; 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(base[0] == '@') { 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project load_filelist(base+1, &g2glist, &g2glist_len); 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "g2glist %s .. %d entries\n", g2glist_len); 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0; i<g2glist_len; i++) 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CheckG2G( ca_arbdata, p4pTable, g2glist[i], wordid, outbase); 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else { 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CheckG2G( ca_arbdata, p4pTable, base, wordid, outbase); 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogShutdown(); 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* PANSIFileSystemDestroy(); 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PFileSystemDestroy();*/ 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PMemSetLogFile(PSTDOUT); 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PMemDumpLogFile(); 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PMemShutdown(); 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint CheckG2G(CA_Arbdata* ca_arbdata, int* p4pTable, const char* base, int wordid, char* outbase) 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl *grammarImpl; 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_Grammar* grammar = NULL; 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project srec_context* fst; 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_Syntax* syntax; 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project modelID ilabels_preceding[64], num_ilabels_preceding; 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project modelID ilabels_following[64], num_ilabels_following; 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project modelID ilabels[128], num_ilabels; 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i,j; 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unsigned long g2gsize; 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(1) { 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FILE* fp; 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fp = fopen(base, "rb"); 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(!fp) g2gsize = 0; 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else { 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fseek(fp, 0, SEEK_END); 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project g2gsize = ftell(fp); 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fclose(fp); 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = SR_GrammarLoad(base, &grammar); 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) { 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s failed at load\n", base); 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project grammarImpl = (SR_GrammarImpl*)grammar; 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project syntax = grammarImpl->syntax; 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(outbase) { 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_DumpSyntax( syntax, outbase); 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst = syntax->synx; 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s %d arcs %d/%d/%d nodes %d/%d/%d words %d/%d chars %d/%d modelver %d\n", 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project base, g2gsize, 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->num_arcs, fst->num_base_arcs, fst->FSMarc_list_len, 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->num_nodes, fst->num_base_nodes, fst->FSMnode_list_len, 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->olabels->num_words, fst->olabels->max_words, 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->olabels->next_chars-fst->olabels->chars, 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->olabels->max_chars, 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef IMAGE_FORMAT_V2 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->modelid 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project -1 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ); 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(wordid == 0 || ca_arbdata == 0) 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(wordid >= fst->olabels->num_words) { 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s failed 'cuz numwords(%d) < %d\n", base, 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->olabels->num_words, wordid); 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0; i<fst->num_arcs; i++) { 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(fst->FSMarc_list[i].olabel == wordid) { 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FSMnode* node; 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FSMarc* arc = &fst->FSMarc_list[i]; 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nodeID fr_node = arc->fr_node; 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arcID iarc; 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ilabels_following[0] = arc->ilabel; 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_ilabels_following = 1; 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_ilabels_preceding = 0; 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for( ; fr_node!=fst->start_node; fr_node=arc->fr_node) { 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project node = &fst->FSMnode_list[fr_node]; 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project iarc = node->first_prev_arc; 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for( ; iarc!=MAXarcID; iarc=arc->linkl_prev_arc) { 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc = &fst->FSMarc_list[iarc]; 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(arc->fr_node != fr_node) break; 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(iarc == MAXarcID) { 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s failed at 11\n", base); 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(arc->ilabel == WORD_BOUNDARY) break; 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ilabels_preceding[num_ilabels_preceding++] = arc->ilabel; 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc = &fst->FSMarc_list[i]; 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fr_node = arc->to_node; 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for( ; fr_node!=fst->end_node; fr_node=arc->to_node) { 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project node = &fst->FSMnode_list[fr_node]; 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project iarc = node->un_ptr.first_next_arc; 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for( ; iarc!=MAXarcID; iarc=arc->linkl_next_arc) { 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc = &fst->FSMarc_list[iarc]; 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(arc->to_node != fr_node) break; 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(iarc == MAXarcID) { 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s failed at 12\n", base); 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ilabels_following[num_ilabels_following++] = arc->ilabel; 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(arc->ilabel == WORD_BOUNDARY) break; 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_ilabels = 0; 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(j=0; j<num_ilabels_preceding; j++) 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ilabels[num_ilabels++] = ilabels_preceding[num_ilabels_preceding-1-j]; 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(j=0; j<num_ilabels_following; j++) 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ilabels[num_ilabels++] = ilabels_following[j]; 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(ilabels[num_ilabels-1] == WORD_BOUNDARY) 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_ilabels--; 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(j=0; j<num_ilabels; j++) { 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(ilabels[j]<fst->hmm_ilabel_offset) { 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s failed at 15\n", base); 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ilabels[j] = ilabels[j] - (labelID)fst->hmm_ilabel_offset; 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s (W%d) ihmms ", fst->olabels->words[wordid], wordid); 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(j=0;j<num_ilabels;j++) 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, " %d", ilabels[j]); 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "\n"); 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(num_ilabels < 2) { 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s failed at 1\n", base); 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(p4pTable) 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = find_phonemes_for_ihmms( ca_arbdata, ilabels, num_ilabels); 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else { 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_SUCCESS; 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(j=0; j<num_ilabels; j++) { 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(p4pTable[ ilabels[j]]<0) { 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_NO_MATCH_ERROR; 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ilabels[j] = MAXmodelID; 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ilabels[j] = (modelID)p4pTable[ ilabels[j]]; 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc) { 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s failed at 2\n", base); 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s ", fst->olabels->words[wordid]); 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(j=0;j<num_ilabels;j++) pfprintf(PSTDOUT, "%c", ilabels[j]); 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "\n"); 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = Parse( grammar, fst->olabels->words[wordid], PSTDOUT); 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc) { 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s failed at 3\n", base); 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "%s PASSED (on %s)\n", base, fst->olabels->words[wordid]); 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP: 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(grammar) SR_GrammarDestroy(grammar); 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 1; 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint traverse_tree(tree_node* node, tree_head *tree_topo, int *num_terminal_nodes) 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(node) 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project tree_topo->nnodes++; 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(node->node.quest_index < 0) { 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(num_terminal_nodes) 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (*num_terminal_nodes)++; 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if( node->term.pelid < tree_topo->low_pel_no) 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project tree_topo->low_pel_no = tree_topo->low_genone_no = node->term.pelid; 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if( node->term.pelid > tree_topo->high_pel_no) 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project tree_topo->high_pel_no = tree_topo->high_genone_no = node->term.pelid; 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project traverse_tree( (tree_node*)node->node.fail, tree_topo, num_terminal_nodes); 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project traverse_tree( (tree_node*)node->node.pass, tree_topo, num_terminal_nodes); 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint num_nodes_in_tree(tree_node* node, int *num_terminal_nodes) 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project tree_head topo; 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *num_terminal_nodes = 0; 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project topo.nnodes = 0; 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project traverse_tree(node, &topo, num_terminal_nodes); 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return topo.nnodes; 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode find_phonemes_for_ihmms( CA_Arbdata* ca_arbdata, modelID* ihmms, int num_ihmms) 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii, i; 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int num_hmms_in_phoneme; 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project tree_head topo; 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project srec_arbdata* a = (srec_arbdata*)ca_arbdata; 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int num_phonemes_for_ihmms = 0; 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(ii=0; ii<num_ihmms; ii++) { 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0; i<a->num_phonemes; i++) { 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_hmms_in_phoneme = 0; 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project topo.low_pel_no = 32567; 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project topo.high_pel_no = 0; 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project traverse_tree(a->pdata[i].model_nodes, &topo, &num_hmms_in_phoneme); 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(debug)printf("phoneme %d num_hmms %d (%d-%d)\n", i, num_hmms_in_phoneme, 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project topo.low_pel_no, topo.high_pel_no); 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(ihmms[ii] >= topo.low_pel_no && ihmms[ii]<= topo.high_pel_no) { 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ihmms[ii] = (modelID)i; 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_phonemes_for_ihmms++; 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if( i==a->num_phonemes) { 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(ihmms[ii]<=5) { 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ihmms[ii] = 0; 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_phonemes_for_ihmms++; 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError("error: could not find hmm%d under any phoneme! ",ihmms[ii]); 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(num_phonemes_for_ihmms != num_ihmms) 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else { 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(ii=0; ii<num_ihmms; ii++) ihmms[ii] = a->pdata[ ihmms[ii]].code; 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid display_results(SR_SemanticResult *result, PFile* fout) 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i, size, len; 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR* keys[MAX_KEYS]; /* array of pointers to strings */ 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR value[MAX_STR_LENGTH]; 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size = MAX_KEYS; 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = result->getKeyList(result, (LCHAR**) &keys, &size); /* get the key list */ 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc == ESR_SUCCESS) 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0; i<size; i++) 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project len = MAX_STR_LENGTH; 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = result->getValue(result,keys[i],value,&len)) == ESR_SUCCESS) 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(fout,"{%s : %s}\n",keys[i],value); 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(fout,"Error: %s\n",ESR_rc2str(rc)); 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(fout,"Error: %s\n",ESR_rc2str(rc)); 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode Parse(SR_Grammar* grammar, LCHAR* trans, PFile* fout) 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i, result_count; 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_SemanticResult* semanticResults[MAX_SEM_RESULTS]; 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result_count = MAX_SEM_RESULTS; /* initially not greater than MAX */ 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i =0; i<result_count; i++) 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_SemanticResultCreate(&semanticResults[i]); /* create the result holders */ 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lstrtrim(trans); 4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = grammar->checkParse(grammar, trans, semanticResults, (size_t*) &result_count); 4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) 4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(result_count < 1) 4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(fout,"no parse\n\n"); 4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_NO_MATCH_ERROR; 4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(fout,"parse ok (%d results)\n", result_count); 4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0; i < result_count; i++) 4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project display_results(semanticResults[i],fout); 4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0; i < MAX_SEM_RESULTS; i++) 4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = semanticResults[i]->destroy(semanticResults[i]); 4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS) 4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid load_filelist(char* filelist, char*** pfiles, int *pnum_files) 4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i = 0; 4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FILE* fp; 4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char line[512]; 4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char **files = 0, *file; 4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int num_files = 0; 4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fp = fopen(filelist, "r"); 4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(!fp) { 4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDOUT, "failed to open %s\n", filelist); 4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto DONE; 4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while( fgets(line, sizeof(line), fp)) { 4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(line[0] == '#') continue; 4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project i++; 4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fclose(fp); 4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_files = i; 4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *files = CALLOC( num_files, sizeof(char*), __FILE__); 4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fp = fopen(filelist, "r"); 4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0; fgets(line,sizeof(line),fp) && i<num_files; i++) { 5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(line[0] == '#') continue; 5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project strtok(line,"\n\r\t"); 5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project file = files[i++] = CALLOC(strlen(line)+1,sizeof(char),__FILE__); 5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project strcpy( file, line); 5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fclose(fp); 5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_files = i; 5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DONE: 5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *pfiles = files; 5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *pnum_files = num_files; 5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint* phonemecode_for_pel_table(CA_Arbdata* ca_arbdata) 5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static int table[2048]; 5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i,j; 5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project tree_head topo; 5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project srec_arbdata* a = (srec_arbdata*)ca_arbdata; 5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int num_hmms_in_phoneme; 5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(j=0; j< (int)(sizeof(table)/sizeof(int)); j++) 5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project table[j] = 0; 5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(i=0; i<a->num_phonemes; i++) { 5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project num_hmms_in_phoneme = 0; 5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project topo.low_pel_no = 32567; 5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project topo.high_pel_no = 0; 5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project traverse_tree(a->pdata[i].model_nodes, &topo, &num_hmms_in_phoneme); 5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(debug)printf("phoneme %d num_hmms %d (%d-%d)\n", i, num_hmms_in_phoneme, 5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project topo.low_pel_no, topo.high_pel_no); 5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for(j=topo.low_pel_no; j<=topo.high_pel_no; j++) 5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project table[j] = a->pdata[i].code; 5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return &table[0]; 5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 537