19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ---------------------------------------------------------------------------
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recognizer.java
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2007 Nuance Communciations, Inc.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); you may not
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use this file except in compliance with the License.
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * License for the specific language governing permissions and limitations under
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License.
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ---------------------------------------------------------------------------
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.speech.srec;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Locale;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Simple, synchronous speech recognizer, using the Nuance SREC package.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Usages proceeds as follows:
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Create a <code>Recognizer</code>.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Create a <code>Recognizer.Grammar</code>.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Setup the <code>Recognizer.Grammar</code>.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Reset the <code>Recognizer.Grammar</code> slots, if needed.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Fill the <code>Recognizer.Grammar</code> slots, if needed.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Compile the <code>Recognizer.Grammar</code>, if needed.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Save the filled <code>Recognizer.Grammar</code>, if needed.
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Start the <code>Recognizer</code>.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Loop over <code>advance</code> and <code>putAudio</code> until recognition complete.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Fetch and process results, or notify of failure.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Stop the <code>Recognizer</code>.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Destroy the <code>Recognizer</code>.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Below is example code</p>
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // create and start audio input
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * InputStream audio = new MicrophoneInputStream(11025, 11025*5);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // create a Recognizer
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * String cdir = Recognizer.getConfigDir(null);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recognizer recognizer = new Recognizer(cdir + "/baseline11k.par");
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // create and load a Grammar
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recognizer.Grammar grammar = recognizer.new Grammar(cdir + "/grammars/VoiceDialer.g2g");
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // setup the Grammar to work with the Recognizer
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * grammar.setupRecognizer();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // fill the Grammar slots with names and save, if required
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * grammar.resetAllSlots();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for (String name : names) grammar.addWordToSlot("@Names", name, null, 1, "V=1");
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * grammar.compile();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * grammar.save(".../foo.g2g");
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // start the Recognizer
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recognizer.start();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // loop over Recognizer events
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * while (true) {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     switch (recognizer.advance()) {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     case Recognizer.EVENT_INCOMPLETE:
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     case Recognizer.EVENT_STARTED:
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     case Recognizer.EVENT_START_OF_VOICING:
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     case Recognizer.EVENT_END_OF_VOICING:
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         // let the Recognizer continue to run
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         continue;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     case Recognizer.EVENT_RECOGNITION_RESULT:
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         // success, so fetch results here!
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         for (int i = 0; i < recognizer.getResultCount(); i++) {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *             String result = recognizer.getResult(i, Recognizer.KEY_LITERAL);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         break;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     case Recognizer.EVENT_NEED_MORE_AUDIO:
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         // put more audio in the Recognizer
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         recognizer.putAudio(audio);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         continue;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     default:
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         notifyFailure();
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         break;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     break;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // stop the Recognizer
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recognizer.stop();
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // destroy the Recognizer
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recognizer.destroy();
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // stop the audio device
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * audio.close();
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Recognizer {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.loadLibrary("srec_jni");
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String TAG = "Recognizer";
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Result key corresponding to confidence score.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String KEY_CONFIDENCE = "conf";
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Result key corresponding to literal text.
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String KEY_LITERAL = "literal";
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Result key corresponding to semantic meaning text.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String KEY_MEANING = "meaning";
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // handle to SR_Vocabulary object
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mVocabulary = 0;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // handle to SR_Recognizer object
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRecognizer = 0;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Grammar currently associated with Recognizer via SR_GrammarSetupRecognizer
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Grammar mActiveGrammar = null;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the pathname of the SREC configuration directory corresponding to the
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * language indicated by the Locale.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This directory contains dictionaries, speech models,
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * configuration files, and other data needed by the Recognizer.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param locale <code>Locale</code> corresponding to the desired language,
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or null for default, currently <code>Locale.US</code>.
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Pathname of the configuration directory.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String getConfigDir(Locale locale) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (locale == null) locale = Locale.US;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String dir = "/system/usr/srec/config/" +
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                locale.toString().replace('_', '.').toLowerCase();
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((new File(dir)).isDirectory()) return dir;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create an instance of a SREC speech recognizer.
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param configFile pathname of the baseline*.par configuration file,
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which in turn contains references to dictionaries, speech models,
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and other data needed to configure and operate the recognizer.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A separate config file is needed for each audio sample rate.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Two files, baseline11k.par and baseline8k.par, which correspond to
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 11025 and 8000 hz, are present in the directory indicated by
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getConfigDir}.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IOException
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Recognizer(String configFile) throws IOException {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PMemInit();
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SR_SessionCreate(configFile);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRecognizer = SR_RecognizerCreate();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SR_RecognizerSetup(mRecognizer);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVocabulary = SR_VocabularyLoad();
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Represents a grammar loaded into the Recognizer.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public class Grammar {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mGrammar = 0;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Create a <code>Grammar</code> instance.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param g2gFileName pathname of g2g file.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Grammar(String g2gFileName) throws IOException {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGrammar = SR_GrammarLoad(g2gFileName);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SR_GrammarSetupVocabulary(mGrammar, mVocabulary);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Reset all slots.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void resetAllSlots() {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SR_GrammarResetAllSlots(mGrammar);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Add a word to a slot.
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param slot slot name.
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param word word to insert.
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param pron pronunciation, or null to derive from word.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param weight weight to give the word.  One is normal, 50 is low.
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param tag semantic meaning tag string.
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void addWordToSlot(String slot, String word, String pron, int weight, String tag) {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SR_GrammarAddWordToSlot(mGrammar, slot, word, pron, weight, tag);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Compile all slots.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void compile() {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SR_GrammarCompile(mGrammar);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Setup <code>Grammar</code> with <code>Recognizer</code>.
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setupRecognizer() {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SR_GrammarSetupRecognizer(mGrammar, mRecognizer);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActiveGrammar = this;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Save <code>Grammar</code> to g2g file.
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param g2gFileName
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @throws IOException
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void save(String g2gFileName) throws IOException {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SR_GrammarSave(mGrammar, g2gFileName);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Release resources associated with this <code>Grammar</code>.
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void destroy() {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: need to do cleanup and disassociation with Recognizer
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mGrammar != 0) {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SR_GrammarDestroy(mGrammar);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mGrammar = 0;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Clean up resources.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected void finalize() {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mGrammar != 0) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                destroy();
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalStateException("someone forgot to destroy Grammar");
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start recognition
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void start() {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: shouldn't be here?
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SR_RecognizerActivateRule(mRecognizer, mActiveGrammar.mGrammar, "trash", 1);
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SR_RecognizerStart(mRecognizer);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Process some audio and return the current status.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return recognition event, one of:
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_INVALID</code>
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_NO_MATCH</code>
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_INCOMPLETE</code>
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_STARTED</code>
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_STOPPED</code>
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_START_OF_VOICING</code>
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_END_OF_VOICING</code>
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_SPOKE_TOO_SOON</code>
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_RECOGNITION_RESULT</code>
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_START_OF_UTTERANCE_TIMEOUT</code>
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_RECOGNITION_TIMEOUT</code>
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_NEED_MORE_AUDIO</code>
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li><code>EVENT_MAX_SPEECH</code>
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int advance() {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SR_RecognizerAdvance(mRecognizer);
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Put audio samples into the <code>Recognizer</code>.
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param buf holds the audio samples.
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset offset of the first sample.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length number of bytes containing samples.
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param isLast indicates no more audio data, normally false.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return number of bytes accepted.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int putAudio(byte[] buf, int offset, int length, boolean isLast) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SR_RecognizerPutAudio(mRecognizer, buf, offset, length, isLast);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Read audio samples from an <code>InputStream</code> and put them in the
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>Recognizer</code>.
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param audio <code>InputStream</code> containing PCM audio samples.
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void putAudio(InputStream audio) throws IOException {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // make sure the audio buffer is allocated
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPutAudioBuffer == null) mPutAudioBuffer = new byte[512];
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // read some data
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nbytes = audio.read(mPutAudioBuffer);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // eof, so signal Recognizer
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nbytes == -1) {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SR_RecognizerPutAudio(mRecognizer, mPutAudioBuffer, 0, 0, true);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // put it into the Recognizer
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else if (nbytes != SR_RecognizerPutAudio(mRecognizer, mPutAudioBuffer, 0, nbytes, false)) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IOException("SR_RecognizerPutAudio failed nbytes=" + nbytes);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // audio buffer for putAudio(InputStream)
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private byte[] mPutAudioBuffer = null;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the number of recognition results.  Must be called after
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>EVENT_RECOGNITION_RESULT</code> is returned by
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>advance</code>, but before <code>stop</code>.
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return number of results in nbest list.
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getResultCount() {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SR_RecognizerResultGetSize(mRecognizer);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get a set of keys for the result.  Must be called after
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>EVENT_RECOGNITION_RESULT</code> is returned by
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>advance</code>, but before <code>stop</code>.
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index index of result.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return array of keys.
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] getResultKeys(int index) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SR_RecognizerResultGetKeyList(mRecognizer, index);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get a result value.  Must be called after
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>EVENT_RECOGNITION_RESULT</code> is returned by
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>advance</code>, but before <code>stop</code>.
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param index index of the result.
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param key key of the result.  This is typically one of
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>KEY_CONFIDENCE</code>, <code>KEY_LITERAL</code>, or
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>KEY_MEANING</code>, but the user can also define their own keys
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in a grxml file, or in the <code>tag</code> slot of
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>Grammar.addWordToSlot</code>.
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the result.
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResult(int index, String key) {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SR_RecognizerResultGetValue(mRecognizer, index, key);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stop the <code>Recognizer</code>.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stop() {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SR_RecognizerStop(mRecognizer);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SR_RecognizerDeactivateRule(mRecognizer, mActiveGrammar.mGrammar, "trash");
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reset the acoustic state vectorto it's default value.
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resetAcousticState() {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SR_AcousticStateReset(mRecognizer);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the acoustic state vector.
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param state String containing the acoustic state vector.
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAcousticState(String state) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SR_AcousticStateSet(mRecognizer, state);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the acoustic state vector.
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String containing the acoustic state vector.
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getAcousticState() {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SR_AcousticStateGet(mRecognizer);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clean up resources.
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void destroy() {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mVocabulary != 0) SR_VocabularyDestroy(mVocabulary);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVocabulary = 0;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mRecognizer != 0) SR_RecognizerUnsetup(mRecognizer);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRecognizer != 0) SR_RecognizerDestroy(mRecognizer);
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRecognizer = 0;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SR_SessionDestroy();
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } finally {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PMemShutdown();
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clean up resources.
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mVocabulary != 0 || mRecognizer != 0) {
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroy();
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("someone forgot to destroy Recognizer");
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* an example session captured, for reference
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void doall() {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (PMemInit ( )
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || lhs_audioinOpen ( WAVE_MAPPER, SREC_TEST_DEFAULT_AUDIO_FREQUENCY, &audio_in_handle )
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || srec_test_init_application_data ( &applicationData, argc, argv )
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_SessionCreate ( "/system/usr/srec/config/en.us/baseline11k.par" )
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_RecognizerCreate ( &applicationData.recognizer )
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_RecognizerSetup ( applicationData.recognizer)
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), filename, &flen )
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_VocabularyLoad ( filename, &applicationData.vocabulary )
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_VocabularyGetLanguage ( applicationData.vocabulary, &applicationData.locale )
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (applicationData.nametag = NULL)
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_NametagsCreate ( &applicationData.nametags )
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (LSTRCPY ( applicationData.grammars [0].grammar_path, "/system/usr/srec/config/en.us/grammars/VoiceDialer.g2g" ), 0)
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (LSTRCPY ( applicationData.grammars [0].grammarID, "BothTags" ), 0)
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (LSTRCPY ( applicationData.grammars [0].ruleName, "trash" ), 0)
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (applicationData.grammars [0].is_ve_grammar = ESR_FALSE, 0)
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_GrammarLoad (applicationData.grammars [0].grammar_path, &applicationData.grammars [applicationData.grammarCount].grammar )
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_GrammarSetupVocabulary ( applicationData.grammars [0].grammar, applicationData.vocabulary )
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_GrammarSetupRecognizer( applicationData.grammars [0].grammar, applicationData.recognizer )
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_GrammarSetDispatchFunction ( applicationData.grammars [0].grammar, L("myDSMCallback"), NULL, myDSMCallback )
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (applicationData.grammarCount++, 0)
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_RecognizerActivateRule ( applicationData.recognizer, applicationData.grammars [0].grammar,
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           applicationData.grammars [0].ruleName, 1 )
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (applicationData.active_grammar_num = 0, 0)
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || lhs_audioinStart ( audio_in_handle )
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_RecognizerStart ( applicationData.recognizer )
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || strl ( applicationData.grammars [0].grammar, &applicationData, audio_in_handle, &recognition_count )
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_RecognizerStop ( applicationData.recognizer )
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || lhs_audioinStop ( audio_in_handle )
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_RecognizerDeactivateRule ( applicationData.recognizer, applicationData.grammars [0].grammar, applicationData.grammars [0].ruleName )
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (applicationData.active_grammar_num = -1, 0)
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_GrammarDestroy ( applicationData.grammars [0].grammar )
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (applicationData.grammarCount--, 0)
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_NametagsDestroy ( applicationData.nametags )
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (applicationData.nametags = NULL, 0)
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_VocabularyDestroy ( applicationData.vocabulary )
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (applicationData.vocabulary = NULL)
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_RecognizerUnsetup ( applicationData.recognizer) // releases acoustic models
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_RecognizerDestroy ( applicationData.recognizer )
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || (applicationData.recognizer = NULL)
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || SR_SessionDestroy ( )
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || srec_test_shutdown_application_data ( &applicationData )
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || lhs_audioinClose ( &audio_in_handle )
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           || PMemShutdown ( )
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // PMem native methods
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void PMemInit();
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void PMemShutdown();
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // SR_Session native methods
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_SessionCreate(String filename);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_SessionDestroy();
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // SR_Recognizer native methods
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reserved value.
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_INVALID = 0;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>Recognizer</code> could not find a match for the utterance.
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_NO_MATCH = 1;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>Recognizer</code> processed one frame of audio.
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_INCOMPLETE = 2;
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>Recognizer</code> has just been started.
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_STARTED = 3;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>Recognizer</code> is stopped.
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_STOPPED = 4;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Beginning of speech detected.
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_START_OF_VOICING = 5;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * End of speech detected.
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_END_OF_VOICING = 6;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Beginning of utterance occured too soon.
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_SPOKE_TOO_SOON = 7;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognition match detected.
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_RECOGNITION_RESULT = 8;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Timeout occured before beginning of utterance.
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_START_OF_UTTERANCE_TIMEOUT = 9;
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Timeout occured before speech recognition could complete.
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_RECOGNITION_TIMEOUT = 10;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Not enough samples to process one frame.
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_NEED_MORE_AUDIO = 11;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * More audio encountered than is allowed by 'swirec_max_speech_duration'.
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int EVENT_MAX_SPEECH = 12;
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Produce a displayable string from an <code>advance</code> event.
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String representing the event.
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String eventToString(int event) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (event) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_INVALID:
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_INVALID";
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_NO_MATCH:
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_NO_MATCH";
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_INCOMPLETE:
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_INCOMPLETE";
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_STARTED:
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_STARTED";
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_STOPPED:
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_STOPPED";
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_START_OF_VOICING:
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_START_OF_VOICING";
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_END_OF_VOICING:
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_END_OF_VOICING";
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_SPOKE_TOO_SOON:
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_SPOKE_TOO_SOON";
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_RECOGNITION_RESULT:
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_RECOGNITION_RESULT";
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_START_OF_UTTERANCE_TIMEOUT:
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_START_OF_UTTERANCE_TIMEOUT";
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_RECOGNITION_TIMEOUT:
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_RECOGNITION_TIMEOUT";
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_NEED_MORE_AUDIO:
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_NEED_MORE_AUDIO";
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_MAX_SPEECH:
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "EVENT_MAX_SPEECH";
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "EVENT_" + event;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // SR_Recognizer methods
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerStart(int recognizer);
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerStop(int recognizer);
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int SR_RecognizerCreate();
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerDestroy(int recognizer);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerSetup(int recognizer);
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerUnsetup(int recognizer);
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerIsSetup(int recognizer);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native String SR_RecognizerGetParameter(int recognizer, String key);
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int SR_RecognizerGetSize_tParameter(int recognizer, String key);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerGetBoolParameter(int recognizer, String key);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerSetParameter(int recognizer, String key, String value);
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerSetSize_tParameter(int recognizer,
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String key, int value);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerSetBoolParameter(int recognizer, String key,
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean value);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerSetupRule(int recognizer, int grammar,
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String ruleName);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerHasSetupRules(int recognizer);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerActivateRule(int recognizer, int grammar,
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String ruleName, int weight);
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerDeactivateRule(int recognizer, int grammar,
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String ruleName);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_RecognizerDeactivateAllRules(int recognizer);
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerIsActiveRule(int recognizer, int grammar,
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String ruleName);
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerCheckGrammarConsistency(int recognizer,
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int grammar);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int SR_RecognizerPutAudio(int recognizer, byte[] buffer, int offset,
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int length, boolean isLast);
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int SR_RecognizerAdvance(int recognizer);
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_RecognizerLoadUtterance(int recognizer,
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         const LCHAR* filename);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_RecognizerLoadWaveFile(int recognizer,
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         const LCHAR* filename);
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_RecognizerSetLockFunction(int recognizer,
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         SR_RecognizerLockFunction function, void* data);
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerIsSignalClipping(int recognizer);
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerIsSignalDCOffset(int recognizer);
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerIsSignalNoisy(int recognizer);
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerIsSignalTooQuiet(int recognizer);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerIsSignalTooFewSamples(int recognizer);
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean SR_RecognizerIsSignalTooManySamples(int recognizer);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_Recognizer_Change_Sample_Rate (size_t new_sample_rate);
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // SR_AcousticState native methods
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_AcousticStateReset(int recognizer);
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_AcousticStateSet(int recognizer, String state);
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native String SR_AcousticStateGet(int recognizer);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // SR_Grammar native methods
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarCompile(int grammar);
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarAddWordToSlot(int grammar, String slot,
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String word, String pronunciation, int weight, String tag);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarResetAllSlots(int grammar);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_GrammarAddNametagToSlot(int grammar, String slot,
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // const struct SR_Nametag_t* nametag, int weight, String tag);
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarSetupVocabulary(int grammar, int vocabulary);
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_GrammarSetupModels(int grammar, SR_AcousticModels* models);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarSetupRecognizer(int grammar, int recognizer);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarUnsetupRecognizer(int grammar);
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_GrammarGetModels(int grammar,SR_AcousticModels** models);
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int SR_GrammarCreate();
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarDestroy(int grammar);
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int SR_GrammarLoad(String filename);
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarSave(int grammar, String filename);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_GrammarSetDispatchFunction(int grammar,
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         const LCHAR* name, void* userData, SR_GrammarDispatchFunction function);
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_GrammarSetParameter(int grammar, const
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         LCHAR* key, void* value);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_GrammarSetSize_tParameter(int grammar,
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         const LCHAR* key, size_t value);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_GrammarGetParameter(int grammar, const
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         LCHAR* key, void** value);
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_GrammarGetSize_tParameter(int grammar,
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         const LCHAR* key, size_t* value);
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_GrammarCheckParse(int grammar, const LCHAR*
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         transcription, SR_SemanticResult** result, size_t* resultCount);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarAllowOnly(int grammar, String transcription);
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_GrammarAllowAll(int grammar);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // SR_Vocabulary native methods
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native int SR_VocabularyCreate();
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int SR_VocabularyLoad();
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_VocabularySave(SR_Vocabulary* self,
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         const LCHAR* filename);
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_VocabularyAddWord(SR_Vocabulary* self,
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         const LCHAR* word);
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_VocabularyGetLanguage(SR_Vocabulary* self,
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //         ESR_Locale* locale);
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void SR_VocabularyDestroy(int vocabulary);
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native String SR_VocabularyGetPronunciation(int vocabulary, String word);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // SR_RecognizerResult native methods
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native byte[] SR_RecognizerResultGetWaveform(int recognizer);
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int SR_RecognizerResultGetSize(int recognizer);
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int SR_RecognizerResultGetKeyCount(int recognizer, int nbest);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native String[] SR_RecognizerResultGetKeyList(int recognizer, int nbest);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native String SR_RecognizerResultGetValue(int recognizer,
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int nbest, String key);
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private static native void SR_RecognizerResultGetLocale(int recognizer, ESR_Locale* locale);
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
719