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