| /*---------------------------------------------------------------------------* |
| * dictTest.c * |
| * * |
| * Copyright 2007, 2008 Nuance Communciations, Inc. * |
| * * |
| * Licensed under the Apache License, Version 2.0 (the 'License'); * |
| * you may not use this file except in compliance with the License. * |
| * * |
| * You may obtain a copy of the License at * |
| * http://www.apache.org/licenses/LICENSE-2.0 * |
| * * |
| * Unless required by applicable law or agreed to in writing, software * |
| * distributed under the License is distributed on an 'AS IS' BASIS, * |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * |
| * See the License for the specific language governing permissions and * |
| * limitations under the License. * |
| * * |
| *---------------------------------------------------------------------------*/ |
| |
| #include "ESR_Locale.h" |
| #include "LCHAR.h" |
| #include "pstdio.h" |
| #include "PFileSystem.h" |
| #include "PANSIFileSystem.h" |
| #include "plog.h" |
| #include "pmemory.h" |
| #include "ESR_Session.h" |
| #include "SR_Session.h" |
| #include "SR_Vocabulary.h" |
| |
| #define MAX_LINE_LENGTH 512 |
| #define MAX_PRONS_LENGTH 1024 |
| |
| static ESR_ReturnCode InitSession ( LCHAR *parfilename ); |
| static ESR_ReturnCode ShutdownSession ( void ); |
| |
| void usage() |
| { |
| 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"); |
| } |
| |
| void doGetProns(SR_Vocabulary *vocab, LCHAR* phrase, size_t len, FILE* fout) |
| { |
| ESR_ReturnCode rc; |
| LCHAR prons[MAX_PRONS_LENGTH]; |
| |
| rc = SR_VocabularyGetPronunciation(vocab, phrase, prons, &len); |
| // rc = vocab->getPronunciation(vocab, phrase, prons, &len); |
| |
| if (rc != ESR_SUCCESS) |
| LFPRINTF(fout,"ERROR: %s\n", ESR_rc2str(rc)); |
| else { |
| size_t len_used; |
| LCHAR *pron = 0; |
| for(len_used=0; len_used<len; ) { |
| pron = &prons[0]+len_used; |
| len_used += LSTRLEN(pron)+1; |
| LFPRINTF(fout,"%s : %s\n", phrase, pron); |
| } |
| } |
| } |
| |
| //parses the input file, runs phoneme tests and produces output to be parsed by perl script |
| void doInputTestPhonemes(SR_Vocabulary *vocab, PFile* fin, FILE* fout) |
| { |
| #if 0 |
| //waste of space with all of these arrays, they are too large, but leave for now |
| ESR_ReturnCode rc; |
| LCHAR line[2 * MAX_PRONS_LENGTH]; |
| LCHAR phoneme[MAX_PRONS_LENGTH]; |
| LCHAR* phrase; |
| LCHAR* expectedPhoneme; |
| LCHAR** tokenArray; |
| size_t len; |
| |
| //read through the test file parsing it into the variables |
| while(!pfeof(fin)) |
| { |
| pfgets(line, MAX_LINE_LENGTH, fin); |
| |
| rc = ESR_ProcessLinearToCommandLineTokens(line, &tokenArray, &len); |
| if (rc!=ESR_SUCCESS || len!=2) |
| { |
| LFPRINTF(fout, "ERROR: INVALID FORMAT for input line\n"); |
| continue; |
| } |
| phrase = tokenArray[0]; |
| expectedPhoneme = tokenArray[1]; |
| |
| LPRINTF( "expected %s\n", expectedPhoneme); |
| |
| len = MAX_PRONS_LENGTH; |
| rc = vocab->getPronunciation(vocab, phrase, phoneme, &len); |
| |
| if(rc != ESR_SUCCESS) |
| LFPRINTF(fout,"ERROR: %s\n", ESR_rc2str(rc)); |
| else |
| { |
| LFPRINTF(fout,"%s|%s|%s|", phrase, expectedPhoneme, phoneme); |
| |
| if(LSTRCMP(expectedPhoneme, phoneme) == 0) |
| LFPRINTF(fout,"PASSED\n"); |
| else |
| LFPRINTF(fout,"FAILED\n"); |
| } |
| } |
| #endif |
| } |
| |
| int main(int argc, char **argv) |
| { |
| LCHAR phrase[MAX_LINE_LENGTH]; |
| SR_Vocabulary *vocab = 0; |
| LCHAR vocabfile[MAX_LINE_LENGTH]; |
| LCHAR outfilename[MAX_LINE_LENGTH]; |
| LCHAR testfilename[MAX_LINE_LENGTH]; |
| LCHAR parfilename[MAX_LINE_LENGTH]; |
| LCHAR wordfile[MAX_LINE_LENGTH]; |
| LCHAR locale[MAX_LINE_LENGTH]; |
| LCHAR ptemp[MAX_LINE_LENGTH]; |
| LCHAR* p; |
| ESR_ReturnCode rc; |
| int i; |
| PFile* fin = 0; |
| FILE* fout = stdout; |
| size_t len; |
| ESR_BOOL bSession = ESR_FALSE; |
| |
| LCHAR *env_sdk_path; |
| LCHAR *env_lang; |
| |
| CHKLOG(rc, PMemInit()); |
| /* CHKLOG(rc, PFileSystemCreate()); |
| CHKLOG(rc, PANSIFileSystemCreate()); |
| CHKLOG(rc, PANSIFileSystemAddPath(L("/dev/ansi"), L("/")));*/ |
| |
| /* Set ANSI file-system as default file-system */ |
| /* CHKLOG(rc, PANSIFileSystemSetDefault(ESR_TRUE));*/ |
| /* Set virtual current working directory to native current working directory */ |
| /* len = P_PATH_MAX; |
| CHKLOG(rc, PANSIFileSystemGetcwd(cwd, &len)); |
| CHKLOG(rc, PFileSystemChdir(cwd));*/ |
| |
| fout = stdout; |
| *vocabfile = 0; |
| *wordfile = 0; |
| *locale = 0; |
| *outfilename = 0; |
| *testfilename = 0; |
| *parfilename = 0; |
| |
| /* get some phrases from the user */ |
| LPRINTF("\nDictation Test Program for esr (Nuance Communications, 2007)\n"); |
| |
| if(argc != 1 && argc != 3 && argc != 5 && argc != 7 && argc != 9) |
| { |
| usage(); |
| rc = 1; |
| goto CLEANUP; |
| } |
| |
| for(i=1; i<argc; i++) |
| { |
| if(!LSTRCMP(argv[i], L("-words"))) |
| LSTRCPY(wordfile, argv[++i]); |
| else if(!LSTRCMP(argv[i], L("-vocab"))) |
| LSTRCPY(vocabfile, argv[++i]); |
| else if(!LSTRCMP(argv[i], L("-locale"))) |
| LSTRCPY(locale, argv[++i]); |
| else if(!LSTRCMP(argv[i], L("-out"))) |
| LSTRCPY(outfilename, argv[++i]); |
| else if(!LSTRCMP(argv[i], L("-itest"))) |
| LSTRCPY(testfilename, argv[++i]); |
| else if(!LSTRCMP(argv[i], L("-parfile")) || !LSTRCMP(argv[i], L("-par")) ) |
| LSTRCPY(parfilename, argv[++i]); |
| else { |
| usage(); |
| rc = 1; |
| goto CLEANUP; |
| } |
| } |
| |
| if ( *parfilename == L('\0') ) |
| { |
| LPRINTF ( "Warning: No parfile defined in the command line.\n" ); |
| LPRINTF ( "Looking for the default parfile, $ESRSDK/config/$ESRLANG/baseline.par...\n" ); |
| |
| env_sdk_path = LGETENV(L("ESRSDK")); |
| if ( env_sdk_path != NULL ) |
| { |
| LSPRINTF ( parfilename, L("%s/config/"), env_sdk_path ); |
| env_lang = LGETENV(L("ESRLANG")); |
| if ( env_lang != NULL ) |
| { |
| LSTRCAT ( parfilename, env_lang ); |
| LSTRCAT ( parfilename, L("/baseline.par") ); |
| } |
| else |
| { |
| LPRINTF("Error: An environment variable ESRLANG should be defined.\n"); |
| goto CLEANUP; |
| } |
| } |
| else |
| { |
| LPRINTF("Error: An environment variable ESRSDK should be defined.\n"); |
| goto CLEANUP; |
| } |
| } |
| |
| rc = InitSession( parfilename ); |
| if ( rc != ESR_SUCCESS ) |
| { |
| LPRINTF("Error: %s\n", ESR_rc2str(rc)); |
| goto CLEANUP; |
| } |
| bSession = ESR_TRUE; |
| |
| if (*vocabfile == 0) |
| { |
| len = sizeof(vocabfile); |
| rc = ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), vocabfile, &len ); |
| env_sdk_path = LGETENV(L("ESRSDK")); |
| if ( env_sdk_path != NULL ) |
| { |
| LSPRINTF ( parfilename, L("%s/config/"), env_sdk_path ); |
| env_lang = LGETENV(L("ESRLANG")); |
| if ( env_lang != NULL ) |
| { |
| LSTRCAT ( parfilename, env_lang ); |
| LSTRCAT ( parfilename, L("/baseline.par") ); |
| } |
| else |
| { |
| LPRINTF("Error: An environment variable ESRLANG should be defined.\n"); |
| goto CLEANUP; |
| } |
| } |
| else |
| { |
| LPRINTF("Error: An environment variable ESRSDK should be defined.\n"); |
| goto CLEANUP; |
| } |
| |
| strcpy(ptemp, env_sdk_path); |
| strcat(ptemp,"/config/"); |
| strcat(ptemp,env_lang); |
| strcat(ptemp,"/"); |
| strcat(ptemp,vocabfile); |
| strcpy(vocabfile,ptemp); |
| if ( rc == ESR_SUCCESS ) |
| { |
| len = sizeof(vocabfile); |
| rc = ESR_SessionPrefixWithBaseDirectory(vocabfile, &len); |
| } |
| else |
| { |
| *vocabfile = 0; |
| } |
| } |
| |
| if (*vocabfile) |
| rc = SR_VocabularyLoad(vocabfile, &vocab); |
| else if (*locale) |
| { |
| ESR_Locale localeTag; |
| |
| rc = ESR_str2locale(locale, &localeTag); |
| if (rc != ESR_SUCCESS) |
| { |
| LPRINTF("Error: %s\n",ESR_rc2str(rc)); |
| goto CLEANUP; |
| } |
| rc = SR_VocabularyCreate(localeTag, &vocab); |
| } |
| else |
| rc = SR_VocabularyCreate(ESR_LOCALE_EN_US, &vocab); |
| |
| if (rc != ESR_SUCCESS) |
| { |
| LPRINTF("Error: %s\n",ESR_rc2str(rc)); |
| goto CLEANUP; |
| } |
| |
| if (*outfilename) /* output file */ |
| { |
| if ((fout = fopen(outfilename,"w")) == NULL) |
| { |
| LPRINTF("Could not open file: %s\n",outfilename); |
| rc = 1; |
| goto CLEANUP; |
| } |
| } |
| |
| if (*wordfile) /* file mode */ |
| { |
| if ((fin = pfopen(wordfile,"r")) == NULL) |
| { |
| LPRINTF("Could not open file: %s\n", wordfile); |
| goto CLEANUP; |
| } |
| while (pfgets(phrase, MAX_LINE_LENGTH, fin)!=NULL) |
| { |
| lstrtrim(phrase); |
| doGetProns(vocab, phrase, MAX_PRONS_LENGTH, fout); |
| } |
| |
| } |
| else if (*testfilename) /* test file mode */ |
| { |
| if ((fin = pfopen(testfilename,"r")) == NULL) |
| { |
| LPRINTF("Could not open file: %s\n", testfilename); |
| rc = 1; |
| goto CLEANUP; |
| } |
| doInputTestPhonemes(vocab, fin, fout); |
| } |
| else /* interactive mode */ |
| { |
| LPRINTF("'qqq' to quit\n"); |
| while (ESR_TRUE) |
| { |
| LPRINTF("> "); |
| if(! pfgets(phrase, MAX_LINE_LENGTH, PSTDIN )) |
| break; |
| // remove trailing whitespace |
| for(p=&phrase[0]; *p!=0 && *p!='\n' && *p!='\r'; p++) {} |
| *p=0; |
| lstrtrim(phrase); |
| if(!LSTRCMP("qqq",phrase)) |
| break; |
| else |
| doGetProns(vocab, phrase, MAX_PRONS_LENGTH, fout); |
| } |
| } |
| |
| CLEANUP: |
| if(vocab) |
| vocab->destroy(vocab); |
| |
| if(bSession) |
| ShutdownSession(); |
| |
| if(fin) |
| pfclose(fin); |
| |
| if(fout && fout != stdout) |
| fclose(fout); |
| |
| /* PANSIFileSystemDestroy(); |
| PFileSystemDestroy();*/ |
| PMemShutdown(); |
| return rc; |
| } |
| |
| static ESR_ReturnCode InitSession ( LCHAR *parfilename ) |
| { |
| ESR_ReturnCode init_status; |
| |
| init_status = SR_SessionCreate ( parfilename ); |
| |
| return ( init_status ); |
| } |
| |
| static ESR_ReturnCode ShutdownSession ( void ) |
| { |
| ESR_ReturnCode shutdown_status; |
| |
| shutdown_status = SR_SessionDestroy ( ); |
| |
| return ( shutdown_status ); |
| } |
| |