1 /*---------------------------------------------------------------------------* 2 * dictTest.c * 3 * * 4 * Copyright 2007, 2008 Nuance Communciations, Inc. * 5 * * 6 * Licensed under the Apache License, Version 2.0 (the 'License'); * 7 * you may not use this file except in compliance with the License. * 8 * * 9 * You may obtain a copy of the License at * 10 * http://www.apache.org/licenses/LICENSE-2.0 * 11 * * 12 * Unless required by applicable law or agreed to in writing, software * 13 * distributed under the License is distributed on an 'AS IS' BASIS, * 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 15 * See the License for the specific language governing permissions and * 16 * limitations under the License. * 17 * * 18 *---------------------------------------------------------------------------*/ 19 20 #include "ESR_Locale.h" 21 #include "LCHAR.h" 22 #include "pstdio.h" 23 #include "PFileSystem.h" 24 #include "PANSIFileSystem.h" 25 #include "plog.h" 26 #include "pmemory.h" 27 #include "ESR_Session.h" 28 #include "SR_Session.h" 29 #include "SR_Vocabulary.h" 30 31 #define MAX_LINE_LENGTH 512 32 #define MAX_PRONS_LENGTH 1024 33 34 static ESR_ReturnCode InitSession ( LCHAR *parfilename ); 35 static ESR_ReturnCode ShutdownSession ( void ); 36 37 void usage() 38 { 39 LPRINTF("usage: dictTest [-words words.txt] [-vocab dictionary.ok] [-itest input.tst] [-out output.txt] [-locale en-us|en-gb|fr-fr|de-de] [-parfile baseline.par]\n"); 40 } 41 42 void doGetProns(SR_Vocabulary *vocab, LCHAR* phrase, size_t len, FILE* fout) 43 { 44 ESR_ReturnCode rc; 45 LCHAR prons[MAX_PRONS_LENGTH]; 46 47 rc = SR_VocabularyGetPronunciation(vocab, phrase, prons, &len); 48 // rc = vocab->getPronunciation(vocab, phrase, prons, &len); 49 50 if (rc != ESR_SUCCESS) 51 LFPRINTF(fout,"ERROR: %s\n", ESR_rc2str(rc)); 52 else { 53 size_t len_used; 54 LCHAR *pron = 0; 55 for(len_used=0; len_used<len; ) { 56 pron = &prons[0]+len_used; 57 len_used += LSTRLEN(pron)+1; 58 LFPRINTF(fout,"%s : %s\n", phrase, pron); 59 } 60 } 61 } 62 63 //parses the input file, runs phoneme tests and produces output to be parsed by perl script 64 void doInputTestPhonemes(SR_Vocabulary *vocab, PFile* fin, FILE* fout) 65 { 66 #if 0 67 //waste of space with all of these arrays, they are too large, but leave for now 68 ESR_ReturnCode rc; 69 LCHAR line[2 * MAX_PRONS_LENGTH]; 70 LCHAR phoneme[MAX_PRONS_LENGTH]; 71 LCHAR* phrase; 72 LCHAR* expectedPhoneme; 73 LCHAR** tokenArray; 74 size_t len; 75 76 //read through the test file parsing it into the variables 77 while(!pfeof(fin)) 78 { 79 pfgets(line, MAX_LINE_LENGTH, fin); 80 81 rc = ESR_ProcessLinearToCommandLineTokens(line, &tokenArray, &len); 82 if (rc!=ESR_SUCCESS || len!=2) 83 { 84 LFPRINTF(fout, "ERROR: INVALID FORMAT for input line\n"); 85 continue; 86 } 87 phrase = tokenArray[0]; 88 expectedPhoneme = tokenArray[1]; 89 90 LPRINTF( "expected %s\n", expectedPhoneme); 91 92 len = MAX_PRONS_LENGTH; 93 rc = vocab->getPronunciation(vocab, phrase, phoneme, &len); 94 95 if(rc != ESR_SUCCESS) 96 LFPRINTF(fout,"ERROR: %s\n", ESR_rc2str(rc)); 97 else 98 { 99 LFPRINTF(fout,"%s|%s|%s|", phrase, expectedPhoneme, phoneme); 100 101 if(LSTRCMP(expectedPhoneme, phoneme) == 0) 102 LFPRINTF(fout,"PASSED\n"); 103 else 104 LFPRINTF(fout,"FAILED\n"); 105 } 106 } 107 #endif 108 } 109 110 int main(int argc, char **argv) 111 { 112 LCHAR phrase[MAX_LINE_LENGTH]; 113 SR_Vocabulary *vocab = 0; 114 LCHAR vocabfile[MAX_LINE_LENGTH]; 115 LCHAR outfilename[MAX_LINE_LENGTH]; 116 LCHAR testfilename[MAX_LINE_LENGTH]; 117 LCHAR parfilename[MAX_LINE_LENGTH]; 118 LCHAR wordfile[MAX_LINE_LENGTH]; 119 LCHAR locale[MAX_LINE_LENGTH]; 120 LCHAR ptemp[MAX_LINE_LENGTH]; 121 LCHAR* p; 122 ESR_ReturnCode rc; 123 int i; 124 PFile* fin = 0; 125 FILE* fout = stdout; 126 size_t len; 127 ESR_BOOL bSession = ESR_FALSE; 128 129 LCHAR *env_sdk_path; 130 LCHAR *env_lang; 131 132 CHKLOG(rc, PMemInit()); 133 /* CHKLOG(rc, PFileSystemCreate()); 134 CHKLOG(rc, PANSIFileSystemCreate()); 135 CHKLOG(rc, PANSIFileSystemAddPath(L("/dev/ansi"), L("/")));*/ 136 137 /* Set ANSI file-system as default file-system */ 138 /* CHKLOG(rc, PANSIFileSystemSetDefault(ESR_TRUE));*/ 139 /* Set virtual current working directory to native current working directory */ 140 /* len = P_PATH_MAX; 141 CHKLOG(rc, PANSIFileSystemGetcwd(cwd, &len)); 142 CHKLOG(rc, PFileSystemChdir(cwd));*/ 143 144 fout = stdout; 145 *vocabfile = 0; 146 *wordfile = 0; 147 *locale = 0; 148 *outfilename = 0; 149 *testfilename = 0; 150 *parfilename = 0; 151 152 /* get some phrases from the user */ 153 LPRINTF("\nDictation Test Program for esr (Nuance Communications, 2007)\n"); 154 155 if(argc != 1 && argc != 3 && argc != 5 && argc != 7 && argc != 9) 156 { 157 usage(); 158 rc = 1; 159 goto CLEANUP; 160 } 161 162 for(i=1; i<argc; i++) 163 { 164 if(!LSTRCMP(argv[i], L("-words"))) 165 LSTRCPY(wordfile, argv[++i]); 166 else if(!LSTRCMP(argv[i], L("-vocab"))) 167 LSTRCPY(vocabfile, argv[++i]); 168 else if(!LSTRCMP(argv[i], L("-locale"))) 169 LSTRCPY(locale, argv[++i]); 170 else if(!LSTRCMP(argv[i], L("-out"))) 171 LSTRCPY(outfilename, argv[++i]); 172 else if(!LSTRCMP(argv[i], L("-itest"))) 173 LSTRCPY(testfilename, argv[++i]); 174 else if(!LSTRCMP(argv[i], L("-parfile")) || !LSTRCMP(argv[i], L("-par")) ) 175 LSTRCPY(parfilename, argv[++i]); 176 else { 177 usage(); 178 rc = 1; 179 goto CLEANUP; 180 } 181 } 182 183 if ( *parfilename == L('\0') ) 184 { 185 LPRINTF ( "Warning: No parfile defined in the command line.\n" ); 186 LPRINTF ( "Looking for the default parfile, $ESRSDK/config/$ESRLANG/baseline.par...\n" ); 187 188 env_sdk_path = LGETENV(L("ESRSDK")); 189 if ( env_sdk_path != NULL ) 190 { 191 LSPRINTF ( parfilename, L("%s/config/"), env_sdk_path ); 192 env_lang = LGETENV(L("ESRLANG")); 193 if ( env_lang != NULL ) 194 { 195 LSTRCAT ( parfilename, env_lang ); 196 LSTRCAT ( parfilename, L("/baseline.par") ); 197 } 198 else 199 { 200 LPRINTF("Error: An environment variable ESRLANG should be defined.\n"); 201 goto CLEANUP; 202 } 203 } 204 else 205 { 206 LPRINTF("Error: An environment variable ESRSDK should be defined.\n"); 207 goto CLEANUP; 208 } 209 } 210 211 rc = InitSession( parfilename ); 212 if ( rc != ESR_SUCCESS ) 213 { 214 LPRINTF("Error: %s\n", ESR_rc2str(rc)); 215 goto CLEANUP; 216 } 217 bSession = ESR_TRUE; 218 219 if (*vocabfile == 0) 220 { 221 len = sizeof(vocabfile); 222 rc = ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), vocabfile, &len ); 223 env_sdk_path = LGETENV(L("ESRSDK")); 224 if ( env_sdk_path != NULL ) 225 { 226 LSPRINTF ( parfilename, L("%s/config/"), env_sdk_path ); 227 env_lang = LGETENV(L("ESRLANG")); 228 if ( env_lang != NULL ) 229 { 230 LSTRCAT ( parfilename, env_lang ); 231 LSTRCAT ( parfilename, L("/baseline.par") ); 232 } 233 else 234 { 235 LPRINTF("Error: An environment variable ESRLANG should be defined.\n"); 236 goto CLEANUP; 237 } 238 } 239 else 240 { 241 LPRINTF("Error: An environment variable ESRSDK should be defined.\n"); 242 goto CLEANUP; 243 } 244 245 strcpy(ptemp, env_sdk_path); 246 strcat(ptemp,"/config/"); 247 strcat(ptemp,env_lang); 248 strcat(ptemp,"/"); 249 strcat(ptemp,vocabfile); 250 strcpy(vocabfile,ptemp); 251 if ( rc == ESR_SUCCESS ) 252 { 253 len = sizeof(vocabfile); 254 rc = ESR_SessionPrefixWithBaseDirectory(vocabfile, &len); 255 } 256 else 257 { 258 *vocabfile = 0; 259 } 260 } 261 262 if (*vocabfile) 263 rc = SR_VocabularyLoad(vocabfile, &vocab); 264 else if (*locale) 265 { 266 ESR_Locale localeTag; 267 268 rc = ESR_str2locale(locale, &localeTag); 269 if (rc != ESR_SUCCESS) 270 { 271 LPRINTF("Error: %s\n",ESR_rc2str(rc)); 272 goto CLEANUP; 273 } 274 rc = SR_VocabularyCreate(localeTag, &vocab); 275 } 276 else 277 rc = SR_VocabularyCreate(ESR_LOCALE_EN_US, &vocab); 278 279 if (rc != ESR_SUCCESS) 280 { 281 LPRINTF("Error: %s\n",ESR_rc2str(rc)); 282 goto CLEANUP; 283 } 284 285 if (*outfilename) /* output file */ 286 { 287 if ((fout = fopen(outfilename,"w")) == NULL) 288 { 289 LPRINTF("Could not open file: %s\n",outfilename); 290 rc = 1; 291 goto CLEANUP; 292 } 293 } 294 295 if (*wordfile) /* file mode */ 296 { 297 if ((fin = pfopen(wordfile,"r")) == NULL) 298 { 299 LPRINTF("Could not open file: %s\n", wordfile); 300 goto CLEANUP; 301 } 302 while (pfgets(phrase, MAX_LINE_LENGTH, fin)!=NULL) 303 { 304 lstrtrim(phrase); 305 doGetProns(vocab, phrase, MAX_PRONS_LENGTH, fout); 306 } 307 308 } 309 else if (*testfilename) /* test file mode */ 310 { 311 if ((fin = pfopen(testfilename,"r")) == NULL) 312 { 313 LPRINTF("Could not open file: %s\n", testfilename); 314 rc = 1; 315 goto CLEANUP; 316 } 317 doInputTestPhonemes(vocab, fin, fout); 318 } 319 else /* interactive mode */ 320 { 321 LPRINTF("'qqq' to quit\n"); 322 while (ESR_TRUE) 323 { 324 LPRINTF("> "); 325 if(! pfgets(phrase, MAX_LINE_LENGTH, PSTDIN )) 326 break; 327 // remove trailing whitespace 328 for(p=&phrase[0]; *p!=0 && *p!='\n' && *p!='\r'; p++) {} 329 *p=0; 330 lstrtrim(phrase); 331 if(!LSTRCMP("qqq",phrase)) 332 break; 333 else 334 doGetProns(vocab, phrase, MAX_PRONS_LENGTH, fout); 335 } 336 } 337 338 CLEANUP: 339 if(vocab) 340 vocab->destroy(vocab); 341 342 if(bSession) 343 ShutdownSession(); 344 345 if(fin) 346 pfclose(fin); 347 348 if(fout && fout != stdout) 349 fclose(fout); 350 351 /* PANSIFileSystemDestroy(); 352 PFileSystemDestroy();*/ 353 PMemShutdown(); 354 return rc; 355 } 356 357 static ESR_ReturnCode InitSession ( LCHAR *parfilename ) 358 { 359 ESR_ReturnCode init_status; 360 361 init_status = SR_SessionCreate ( parfilename ); 362 363 return ( init_status ); 364 } 365 366 static ESR_ReturnCode ShutdownSession ( void ) 367 { 368 ESR_ReturnCode shutdown_status; 369 370 shutdown_status = SR_SessionDestroy ( ); 371 372 return ( shutdown_status ); 373 } 374 375