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
usage()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
doGetProns(SR_Vocabulary * vocab,LCHAR * phrase,size_t len,FILE * fout)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
doInputTestPhonemes(SR_Vocabulary * vocab,PFile * fin,FILE * fout)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
main(int argc,char ** argv)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
InitSession(LCHAR * parfilename)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
ShutdownSession(void)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