blob: 1396204de0620e34d04997249731ce46cf44bdc5 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * ---------------------------------------------------------------------------
3 * Recognizer.java
4 *
5 * Copyright 2007 Nuance Communciations, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the 'License'); you may not
8 * use this file except in compliance with the License.
9 *
10 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16 * License for the specific language governing permissions and limitations under
17 * the License.
18 *
19 * ---------------------------------------------------------------------------
20 */
21
22
23package android.speech.srec;
24
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080025import android.util.Log;
26
27import java.io.File;
28import java.io.InputStream;
29import java.io.IOException;
30import java.util.Locale;
31
32/**
33 * Simple, synchronous speech recognizer, using the Nuance SREC package.
34 * Usages proceeds as follows:
35 *
36 * <ul>
37 * <li>Create a <code>Recognizer</code>.
38 * <li>Create a <code>Recognizer.Grammar</code>.
39 * <li>Setup the <code>Recognizer.Grammar</code>.
40 * <li>Reset the <code>Recognizer.Grammar</code> slots, if needed.
41 * <li>Fill the <code>Recognizer.Grammar</code> slots, if needed.
42 * <li>Compile the <code>Recognizer.Grammar</code>, if needed.
43 * <li>Save the filled <code>Recognizer.Grammar</code>, if needed.
44 * <li>Start the <code>Recognizer</code>.
45 * <li>Loop over <code>advance</code> and <code>putAudio</code> until recognition complete.
46 * <li>Fetch and process results, or notify of failure.
47 * <li>Stop the <code>Recognizer</code>.
48 * <li>Destroy the <code>Recognizer</code>.
49 * </ul>
50 *
51 * <p>Below is example code</p>
52 *
53 * <pre class="prettyprint">
54 *
55 * // create and start audio input
56 * InputStream audio = new MicrophoneInputStream(11025, 11025*5);
57 * // create a Recognizer
58 * String cdir = Recognizer.getConfigDir(null);
59 * Recognizer recognizer = new Recognizer(cdir + "/baseline11k.par");
60 * // create and load a Grammar
61 * Recognizer.Grammar grammar = recognizer.new Grammar(cdir + "/grammars/VoiceDialer.g2g");
62 * // setup the Grammar to work with the Recognizer
63 * grammar.setupRecognizer();
64 * // fill the Grammar slots with names and save, if required
65 * grammar.resetAllSlots();
66 * for (String name : names) grammar.addWordToSlot("@Names", name, null, 1, "V=1");
67 * grammar.compile();
68 * grammar.save(".../foo.g2g");
69 * // start the Recognizer
70 * recognizer.start();
71 * // loop over Recognizer events
72 * while (true) {
73 * switch (recognizer.advance()) {
74 * case Recognizer.EVENT_INCOMPLETE:
75 * case Recognizer.EVENT_STARTED:
76 * case Recognizer.EVENT_START_OF_VOICING:
77 * case Recognizer.EVENT_END_OF_VOICING:
78 * // let the Recognizer continue to run
79 * continue;
80 * case Recognizer.EVENT_RECOGNITION_RESULT:
81 * // success, so fetch results here!
82 * for (int i = 0; i < recognizer.getResultCount(); i++) {
83 * String result = recognizer.getResult(i, Recognizer.KEY_LITERAL);
84 * }
85 * break;
86 * case Recognizer.EVENT_NEED_MORE_AUDIO:
87 * // put more audio in the Recognizer
88 * recognizer.putAudio(audio);
89 * continue;
90 * default:
91 * notifyFailure();
92 * break;
93 * }
94 * break;
95 * }
96 * // stop the Recognizer
97 * recognizer.stop();
98 * // destroy the Recognizer
99 * recognizer.destroy();
100 * // stop the audio device
101 * audio.close();
102 *
103 * </pre>
104 */
105public final class Recognizer {
106 static {
107 System.loadLibrary("srec_jni");
108 }
109
110 private static String TAG = "Recognizer";
111
112 /**
113 * Result key corresponding to confidence score.
114 */
115 public static final String KEY_CONFIDENCE = "conf";
116
117 /**
118 * Result key corresponding to literal text.
119 */
120 public static final String KEY_LITERAL = "literal";
121
122 /**
123 * Result key corresponding to semantic meaning text.
124 */
125 public static final String KEY_MEANING = "meaning";
126
127 // handle to SR_Vocabulary object
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000128 private long mVocabulary = 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800129
130 // handle to SR_Recognizer object
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000131 private long mRecognizer = 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800132
133 // Grammar currently associated with Recognizer via SR_GrammarSetupRecognizer
134 private Grammar mActiveGrammar = null;
135
136 /**
137 * Get the pathname of the SREC configuration directory corresponding to the
138 * language indicated by the Locale.
139 * This directory contains dictionaries, speech models,
140 * configuration files, and other data needed by the Recognizer.
141 * @param locale <code>Locale</code> corresponding to the desired language,
142 * or null for default, currently <code>Locale.US</code>.
143 * @return Pathname of the configuration directory.
144 */
145 public static String getConfigDir(Locale locale) {
146 if (locale == null) locale = Locale.US;
147 String dir = "/system/usr/srec/config/" +
Elliott Hughescb64d432013-08-02 10:00:44 -0700148 locale.toString().replace('_', '.').toLowerCase(Locale.ROOT);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800149 if ((new File(dir)).isDirectory()) return dir;
150 return null;
151 }
152
153 /**
154 * Create an instance of a SREC speech recognizer.
155 *
156 * @param configFile pathname of the baseline*.par configuration file,
157 * which in turn contains references to dictionaries, speech models,
158 * and other data needed to configure and operate the recognizer.
159 * A separate config file is needed for each audio sample rate.
160 * Two files, baseline11k.par and baseline8k.par, which correspond to
161 * 11025 and 8000 hz, are present in the directory indicated by
162 * {@link #getConfigDir}.
163 * @throws IOException
164 */
165 public Recognizer(String configFile) throws IOException {
166 PMemInit();
167 SR_SessionCreate(configFile);
168 mRecognizer = SR_RecognizerCreate();
169 SR_RecognizerSetup(mRecognizer);
170 mVocabulary = SR_VocabularyLoad();
171 }
172
173 /**
174 * Represents a grammar loaded into the Recognizer.
175 */
176 public class Grammar {
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000177 private long mGrammar = 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800178
179 /**
180 * Create a <code>Grammar</code> instance.
181 * @param g2gFileName pathname of g2g file.
182 */
183 public Grammar(String g2gFileName) throws IOException {
184 mGrammar = SR_GrammarLoad(g2gFileName);
185 SR_GrammarSetupVocabulary(mGrammar, mVocabulary);
186 }
187
188 /**
189 * Reset all slots.
190 */
191 public void resetAllSlots() {
192 SR_GrammarResetAllSlots(mGrammar);
193 }
194
195 /**
196 * Add a word to a slot.
197 *
198 * @param slot slot name.
199 * @param word word to insert.
200 * @param pron pronunciation, or null to derive from word.
201 * @param weight weight to give the word. One is normal, 50 is low.
202 * @param tag semantic meaning tag string.
203 */
204 public void addWordToSlot(String slot, String word, String pron, int weight, String tag) {
205 SR_GrammarAddWordToSlot(mGrammar, slot, word, pron, weight, tag);
206 }
207
208 /**
209 * Compile all slots.
210 */
211 public void compile() {
212 SR_GrammarCompile(mGrammar);
213 }
214
215 /**
216 * Setup <code>Grammar</code> with <code>Recognizer</code>.
217 */
218 public void setupRecognizer() {
219 SR_GrammarSetupRecognizer(mGrammar, mRecognizer);
220 mActiveGrammar = this;
221 }
222
223 /**
224 * Save <code>Grammar</code> to g2g file.
225 *
226 * @param g2gFileName
227 * @throws IOException
228 */
229 public void save(String g2gFileName) throws IOException {
230 SR_GrammarSave(mGrammar, g2gFileName);
231 }
232
233 /**
234 * Release resources associated with this <code>Grammar</code>.
235 */
236 public void destroy() {
237 // TODO: need to do cleanup and disassociation with Recognizer
238 if (mGrammar != 0) {
239 SR_GrammarDestroy(mGrammar);
240 mGrammar = 0;
241 }
242 }
243
244 /**
245 * Clean up resources.
246 */
247 protected void finalize() {
248 if (mGrammar != 0) {
249 destroy();
250 throw new IllegalStateException("someone forgot to destroy Grammar");
251 }
252 }
253 }
254
255 /**
256 * Start recognition
257 */
258 public void start() {
259 // TODO: shouldn't be here?
260 SR_RecognizerActivateRule(mRecognizer, mActiveGrammar.mGrammar, "trash", 1);
261 SR_RecognizerStart(mRecognizer);
262 }
263
264 /**
265 * Process some audio and return the current status.
266 * @return recognition event, one of:
267 * <ul>
268 * <li><code>EVENT_INVALID</code>
269 * <li><code>EVENT_NO_MATCH</code>
270 * <li><code>EVENT_INCOMPLETE</code>
271 * <li><code>EVENT_STARTED</code>
272 * <li><code>EVENT_STOPPED</code>
273 * <li><code>EVENT_START_OF_VOICING</code>
274 * <li><code>EVENT_END_OF_VOICING</code>
275 * <li><code>EVENT_SPOKE_TOO_SOON</code>
276 * <li><code>EVENT_RECOGNITION_RESULT</code>
277 * <li><code>EVENT_START_OF_UTTERANCE_TIMEOUT</code>
278 * <li><code>EVENT_RECOGNITION_TIMEOUT</code>
279 * <li><code>EVENT_NEED_MORE_AUDIO</code>
280 * <li><code>EVENT_MAX_SPEECH</code>
281 * </ul>
282 */
283 public int advance() {
284 return SR_RecognizerAdvance(mRecognizer);
285 }
286
287 /**
288 * Put audio samples into the <code>Recognizer</code>.
289 * @param buf holds the audio samples.
290 * @param offset offset of the first sample.
291 * @param length number of bytes containing samples.
292 * @param isLast indicates no more audio data, normally false.
293 * @return number of bytes accepted.
294 */
295 public int putAudio(byte[] buf, int offset, int length, boolean isLast) {
296 return SR_RecognizerPutAudio(mRecognizer, buf, offset, length, isLast);
297 }
298
299 /**
300 * Read audio samples from an <code>InputStream</code> and put them in the
301 * <code>Recognizer</code>.
302 * @param audio <code>InputStream</code> containing PCM audio samples.
303 */
304 public void putAudio(InputStream audio) throws IOException {
305 // make sure the audio buffer is allocated
306 if (mPutAudioBuffer == null) mPutAudioBuffer = new byte[512];
307 // read some data
308 int nbytes = audio.read(mPutAudioBuffer);
309 // eof, so signal Recognizer
310 if (nbytes == -1) {
311 SR_RecognizerPutAudio(mRecognizer, mPutAudioBuffer, 0, 0, true);
312 }
313 // put it into the Recognizer
314 else if (nbytes != SR_RecognizerPutAudio(mRecognizer, mPutAudioBuffer, 0, nbytes, false)) {
315 throw new IOException("SR_RecognizerPutAudio failed nbytes=" + nbytes);
316 }
317 }
318
319 // audio buffer for putAudio(InputStream)
320 private byte[] mPutAudioBuffer = null;
321
322 /**
323 * Get the number of recognition results. Must be called after
324 * <code>EVENT_RECOGNITION_RESULT</code> is returned by
325 * <code>advance</code>, but before <code>stop</code>.
326 *
327 * @return number of results in nbest list.
328 */
329 public int getResultCount() {
330 return SR_RecognizerResultGetSize(mRecognizer);
331 }
332
333 /**
334 * Get a set of keys for the result. Must be called after
335 * <code>EVENT_RECOGNITION_RESULT</code> is returned by
336 * <code>advance</code>, but before <code>stop</code>.
337 *
338 * @param index index of result.
339 * @return array of keys.
340 */
341 public String[] getResultKeys(int index) {
342 return SR_RecognizerResultGetKeyList(mRecognizer, index);
343 }
344
345 /**
346 * Get a result value. Must be called after
347 * <code>EVENT_RECOGNITION_RESULT</code> is returned by
348 * <code>advance</code>, but before <code>stop</code>.
349 *
350 * @param index index of the result.
351 * @param key key of the result. This is typically one of
352 * <code>KEY_CONFIDENCE</code>, <code>KEY_LITERAL</code>, or
353 * <code>KEY_MEANING</code>, but the user can also define their own keys
354 * in a grxml file, or in the <code>tag</code> slot of
355 * <code>Grammar.addWordToSlot</code>.
356 * @return the result.
357 */
358 public String getResult(int index, String key) {
359 return SR_RecognizerResultGetValue(mRecognizer, index, key);
360 }
361
362 /**
363 * Stop the <code>Recognizer</code>.
364 */
365 public void stop() {
366 SR_RecognizerStop(mRecognizer);
367 SR_RecognizerDeactivateRule(mRecognizer, mActiveGrammar.mGrammar, "trash");
368 }
369
370 /**
371 * Reset the acoustic state vectorto it's default value.
372 *
373 * @hide
374 */
375 public void resetAcousticState() {
376 SR_AcousticStateReset(mRecognizer);
377 }
378
379 /**
380 * Set the acoustic state vector.
381 * @param state String containing the acoustic state vector.
382 *
383 * @hide
384 */
385 public void setAcousticState(String state) {
386 SR_AcousticStateSet(mRecognizer, state);
387 }
388
389 /**
390 * Get the acoustic state vector.
391 * @return String containing the acoustic state vector.
392 *
393 * @hide
394 */
395 public String getAcousticState() {
396 return SR_AcousticStateGet(mRecognizer);
397 }
398
399 /**
400 * Clean up resources.
401 */
402 public void destroy() {
403 try {
404 if (mVocabulary != 0) SR_VocabularyDestroy(mVocabulary);
405 } finally {
406 mVocabulary = 0;
407 try {
408 if (mRecognizer != 0) SR_RecognizerUnsetup(mRecognizer);
409 } finally {
410 try {
411 if (mRecognizer != 0) SR_RecognizerDestroy(mRecognizer);
412 } finally {
413 mRecognizer = 0;
414 try {
415 SR_SessionDestroy();
416 } finally {
417 PMemShutdown();
418 }
419 }
420 }
421 }
422 }
423
424 /**
425 * Clean up resources.
426 */
427 protected void finalize() throws Throwable {
428 if (mVocabulary != 0 || mRecognizer != 0) {
429 destroy();
430 throw new IllegalStateException("someone forgot to destroy Recognizer");
431 }
432 }
433
434 /* an example session captured, for reference
435 void doall() {
436 if (PMemInit ( )
437 || lhs_audioinOpen ( WAVE_MAPPER, SREC_TEST_DEFAULT_AUDIO_FREQUENCY, &audio_in_handle )
438 || srec_test_init_application_data ( &applicationData, argc, argv )
439 || SR_SessionCreate ( "/system/usr/srec/config/en.us/baseline11k.par" )
440 || SR_RecognizerCreate ( &applicationData.recognizer )
441 || SR_RecognizerSetup ( applicationData.recognizer)
442 || ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), filename, &flen )
443 || SR_VocabularyLoad ( filename, &applicationData.vocabulary )
444 || SR_VocabularyGetLanguage ( applicationData.vocabulary, &applicationData.locale )
445 || (applicationData.nametag = NULL)
446 || SR_NametagsCreate ( &applicationData.nametags )
447 || (LSTRCPY ( applicationData.grammars [0].grammar_path, "/system/usr/srec/config/en.us/grammars/VoiceDialer.g2g" ), 0)
448 || (LSTRCPY ( applicationData.grammars [0].grammarID, "BothTags" ), 0)
449 || (LSTRCPY ( applicationData.grammars [0].ruleName, "trash" ), 0)
450 || (applicationData.grammars [0].is_ve_grammar = ESR_FALSE, 0)
451 || SR_GrammarLoad (applicationData.grammars [0].grammar_path, &applicationData.grammars [applicationData.grammarCount].grammar )
452 || SR_GrammarSetupVocabulary ( applicationData.grammars [0].grammar, applicationData.vocabulary )
453 || SR_GrammarSetupRecognizer( applicationData.grammars [0].grammar, applicationData.recognizer )
454 || SR_GrammarSetDispatchFunction ( applicationData.grammars [0].grammar, L("myDSMCallback"), NULL, myDSMCallback )
455 || (applicationData.grammarCount++, 0)
456 || SR_RecognizerActivateRule ( applicationData.recognizer, applicationData.grammars [0].grammar,
457 applicationData.grammars [0].ruleName, 1 )
458 || (applicationData.active_grammar_num = 0, 0)
459 || lhs_audioinStart ( audio_in_handle )
460 || SR_RecognizerStart ( applicationData.recognizer )
461 || strl ( applicationData.grammars [0].grammar, &applicationData, audio_in_handle, &recognition_count )
462 || SR_RecognizerStop ( applicationData.recognizer )
463 || lhs_audioinStop ( audio_in_handle )
464 || SR_RecognizerDeactivateRule ( applicationData.recognizer, applicationData.grammars [0].grammar, applicationData.grammars [0].ruleName )
465 || (applicationData.active_grammar_num = -1, 0)
466 || SR_GrammarDestroy ( applicationData.grammars [0].grammar )
467 || (applicationData.grammarCount--, 0)
468 || SR_NametagsDestroy ( applicationData.nametags )
469 || (applicationData.nametags = NULL, 0)
470 || SR_VocabularyDestroy ( applicationData.vocabulary )
471 || (applicationData.vocabulary = NULL)
472 || SR_RecognizerUnsetup ( applicationData.recognizer) // releases acoustic models
473 || SR_RecognizerDestroy ( applicationData.recognizer )
474 || (applicationData.recognizer = NULL)
475 || SR_SessionDestroy ( )
476 || srec_test_shutdown_application_data ( &applicationData )
477 || lhs_audioinClose ( &audio_in_handle )
478 || PMemShutdown ( )
479 }
480 */
481
482
483 //
484 // PMem native methods
485 //
486 private static native void PMemInit();
487 private static native void PMemShutdown();
488
489
490 //
491 // SR_Session native methods
492 //
493 private static native void SR_SessionCreate(String filename);
494 private static native void SR_SessionDestroy();
495
496
497 //
498 // SR_Recognizer native methods
499 //
500
501 /**
502 * Reserved value.
503 */
504 public final static int EVENT_INVALID = 0;
505
506 /**
507 * <code>Recognizer</code> could not find a match for the utterance.
508 */
509 public final static int EVENT_NO_MATCH = 1;
510
511 /**
512 * <code>Recognizer</code> processed one frame of audio.
513 */
514 public final static int EVENT_INCOMPLETE = 2;
515
516 /**
517 * <code>Recognizer</code> has just been started.
518 */
519 public final static int EVENT_STARTED = 3;
520
521 /**
522 * <code>Recognizer</code> is stopped.
523 */
524 public final static int EVENT_STOPPED = 4;
525
526 /**
527 * Beginning of speech detected.
528 */
529 public final static int EVENT_START_OF_VOICING = 5;
530
531 /**
532 * End of speech detected.
533 */
534 public final static int EVENT_END_OF_VOICING = 6;
535
536 /**
537 * Beginning of utterance occured too soon.
538 */
539 public final static int EVENT_SPOKE_TOO_SOON = 7;
540
541 /**
542 * Recognition match detected.
543 */
544 public final static int EVENT_RECOGNITION_RESULT = 8;
545
546 /**
547 * Timeout occured before beginning of utterance.
548 */
549 public final static int EVENT_START_OF_UTTERANCE_TIMEOUT = 9;
550
551 /**
552 * Timeout occured before speech recognition could complete.
553 */
554 public final static int EVENT_RECOGNITION_TIMEOUT = 10;
555
556 /**
557 * Not enough samples to process one frame.
558 */
559 public final static int EVENT_NEED_MORE_AUDIO = 11;
560
561 /**
562 * More audio encountered than is allowed by 'swirec_max_speech_duration'.
563 */
564 public final static int EVENT_MAX_SPEECH = 12;
565
566 /**
567 * Produce a displayable string from an <code>advance</code> event.
568 * @param event
569 * @return String representing the event.
570 */
571 public static String eventToString(int event) {
572 switch (event) {
573 case EVENT_INVALID:
574 return "EVENT_INVALID";
575 case EVENT_NO_MATCH:
576 return "EVENT_NO_MATCH";
577 case EVENT_INCOMPLETE:
578 return "EVENT_INCOMPLETE";
579 case EVENT_STARTED:
580 return "EVENT_STARTED";
581 case EVENT_STOPPED:
582 return "EVENT_STOPPED";
583 case EVENT_START_OF_VOICING:
584 return "EVENT_START_OF_VOICING";
585 case EVENT_END_OF_VOICING:
586 return "EVENT_END_OF_VOICING";
587 case EVENT_SPOKE_TOO_SOON:
588 return "EVENT_SPOKE_TOO_SOON";
589 case EVENT_RECOGNITION_RESULT:
590 return "EVENT_RECOGNITION_RESULT";
591 case EVENT_START_OF_UTTERANCE_TIMEOUT:
592 return "EVENT_START_OF_UTTERANCE_TIMEOUT";
593 case EVENT_RECOGNITION_TIMEOUT:
594 return "EVENT_RECOGNITION_TIMEOUT";
595 case EVENT_NEED_MORE_AUDIO:
596 return "EVENT_NEED_MORE_AUDIO";
597 case EVENT_MAX_SPEECH:
598 return "EVENT_MAX_SPEECH";
599 }
600 return "EVENT_" + event;
601 }
602
603 //
604 // SR_Recognizer methods
605 //
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000606 private static native void SR_RecognizerStart(long recognizer);
607 private static native void SR_RecognizerStop(long recognizer);
608 private static native long SR_RecognizerCreate();
609 private static native void SR_RecognizerDestroy(long recognizer);
610 private static native void SR_RecognizerSetup(long recognizer);
611 private static native void SR_RecognizerUnsetup(long recognizer);
612 private static native boolean SR_RecognizerIsSetup(long recognizer);
613 private static native String SR_RecognizerGetParameter(long recognizer, String key);
614 private static native int SR_RecognizerGetSize_tParameter(long recognizer, String key);
615 private static native boolean SR_RecognizerGetBoolParameter(long recognizer, String key);
616 private static native void SR_RecognizerSetParameter(long recognizer, String key, String value);
617 private static native void SR_RecognizerSetSize_tParameter(long recognizer,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800618 String key, int value);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000619 private static native void SR_RecognizerSetBoolParameter(long recognizer, String key,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800620 boolean value);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000621 private static native void SR_RecognizerSetupRule(long recognizer, long grammar,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800622 String ruleName);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000623 private static native boolean SR_RecognizerHasSetupRules(long recognizer);
624 private static native void SR_RecognizerActivateRule(long recognizer, long grammar,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800625 String ruleName, int weight);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000626 private static native void SR_RecognizerDeactivateRule(long recognizer, long grammar,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800627 String ruleName);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000628 private static native void SR_RecognizerDeactivateAllRules(long recognizer);
629 private static native boolean SR_RecognizerIsActiveRule(long recognizer, long grammar,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800630 String ruleName);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000631 private static native boolean SR_RecognizerCheckGrammarConsistency(long recognizer,
632 long grammar);
633 private static native int SR_RecognizerPutAudio(long recognizer, byte[] buffer, int offset,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800634 int length, boolean isLast);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000635 private static native int SR_RecognizerAdvance(long recognizer);
636 // private static native void SR_RecognizerLoadUtterance(long recognizer,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800637 // const LCHAR* filename);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000638 // private static native void SR_RecognizerLoadWaveFile(long recognizer,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800639 // const LCHAR* filename);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000640 // private static native void SR_RecognizerSetLockFunction(long recognizer,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800641 // SR_RecognizerLockFunction function, void* data);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000642 private static native boolean SR_RecognizerIsSignalClipping(long recognizer);
643 private static native boolean SR_RecognizerIsSignalDCOffset(long recognizer);
644 private static native boolean SR_RecognizerIsSignalNoisy(long recognizer);
645 private static native boolean SR_RecognizerIsSignalTooQuiet(long recognizer);
646 private static native boolean SR_RecognizerIsSignalTooFewSamples(long recognizer);
647 private static native boolean SR_RecognizerIsSignalTooManySamples(long recognizer);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800648 // private static native void SR_Recognizer_Change_Sample_Rate (size_t new_sample_rate);
649
650
651 //
652 // SR_AcousticState native methods
653 //
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000654 private static native void SR_AcousticStateReset(long recognizer);
655 private static native void SR_AcousticStateSet(long recognizer, String state);
656 private static native String SR_AcousticStateGet(long recognizer);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800657
658
659 //
660 // SR_Grammar native methods
661 //
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000662 private static native void SR_GrammarCompile(long grammar);
663 private static native void SR_GrammarAddWordToSlot(long grammar, String slot,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800664 String word, String pronunciation, int weight, String tag);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000665 private static native void SR_GrammarResetAllSlots(long grammar);
666 // private static native void SR_GrammarAddNametagToSlot(long grammar, String slot,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800667 // const struct SR_Nametag_t* nametag, int weight, String tag);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000668 private static native void SR_GrammarSetupVocabulary(long grammar, long vocabulary);
669 // private static native void SR_GrammarSetupModels(long grammar, SR_AcousticModels* models);
670 private static native void SR_GrammarSetupRecognizer(long grammar, long recognizer);
671 private static native void SR_GrammarUnsetupRecognizer(long grammar);
672 // private static native void SR_GrammarGetModels(long grammar,SR_AcousticModels** models);
673 private static native long SR_GrammarCreate();
674 private static native void SR_GrammarDestroy(long grammar);
675 private static native long SR_GrammarLoad(String filename);
676 private static native void SR_GrammarSave(long grammar, String filename);
677 // private static native void SR_GrammarSetDispatchFunction(long grammar,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800678 // const LCHAR* name, void* userData, SR_GrammarDispatchFunction function);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000679 // private static native void SR_GrammarSetParameter(long grammar, const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800680 // LCHAR* key, void* value);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000681 // private static native void SR_GrammarSetSize_tParameter(long grammar,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800682 // const LCHAR* key, size_t value);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000683 // private static native void SR_GrammarGetParameter(long grammar, const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800684 // LCHAR* key, void** value);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000685 // private static native void SR_GrammarGetSize_tParameter(long grammar,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800686 // const LCHAR* key, size_t* value);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000687 // private static native void SR_GrammarCheckParse(long grammar, const LCHAR*
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800688 // transcription, SR_SemanticResult** result, size_t* resultCount);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000689 private static native void SR_GrammarAllowOnly(long grammar, String transcription);
690 private static native void SR_GrammarAllowAll(long grammar);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800691
692
693 //
694 // SR_Vocabulary native methods
695 //
696 // private static native int SR_VocabularyCreate();
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000697 private static native long SR_VocabularyLoad();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800698 // private static native void SR_VocabularySave(SR_Vocabulary* self,
699 // const LCHAR* filename);
700 // private static native void SR_VocabularyAddWord(SR_Vocabulary* self,
701 // const LCHAR* word);
702 // private static native void SR_VocabularyGetLanguage(SR_Vocabulary* self,
703 // ESR_Locale* locale);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000704 private static native void SR_VocabularyDestroy(long vocabulary);
705 private static native String SR_VocabularyGetPronunciation(long vocabulary, String word);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800706
707
708 //
709 // SR_RecognizerResult native methods
710 //
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000711 private static native byte[] SR_RecognizerResultGetWaveform(long recognizer);
712 private static native int SR_RecognizerResultGetSize(long recognizer);
713 private static native int SR_RecognizerResultGetKeyCount(long recognizer, int nbest);
714 private static native String[] SR_RecognizerResultGetKeyList(long recognizer, int nbest);
715 private static native String SR_RecognizerResultGetValue(long recognizer,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800716 int nbest, String key);
Ashok Bhatbdebe1a2014-01-06 11:35:32 +0000717 // private static native void SR_RecognizerResultGetLocale(long recognizer, ESR_Locale* locale);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800718}