1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package com.android.voicedialer; 17 18import android.util.Log; 19import android.content.Intent; 20import android.speech.srec.Recognizer; 21 22import java.io.IOException; 23import java.util.ArrayList; 24 25public class PhoneTypeChoiceRecognizerEngine extends RecognizerEngine { 26 /** 27 * Constructor. 28 */ 29 public PhoneTypeChoiceRecognizerEngine() { 30 31 } 32 33 protected void setupGrammar() throws IOException, InterruptedException { 34 if (mSrecGrammar == null) { 35 if (false) Log.d(TAG, "start new Grammar"); 36 mSrecGrammar = mSrec.new Grammar(SREC_DIR + "/grammars/phone_type_choice.g2g"); 37 mSrecGrammar.setupRecognizer(); 38 } 39 } 40 41 /** 42 * Called when recognition succeeds. It receives a list 43 * of results, builds a corresponding list of Intents, and 44 * passes them to the {@link RecognizerClient}, which selects and 45 * performs a corresponding action. 46 * @param recognizerClient the client that will be sent the results 47 */ 48 protected void onRecognitionSuccess(RecognizerClient recognizerClient) throws InterruptedException { 49 if (false) Log.d(TAG, "onRecognitionSuccess " + mSrec.getResultCount()); 50 51 if (mLogger != null) mLogger.logNbestHeader(); 52 53 ArrayList<Intent> intents = new ArrayList<Intent>(); 54 55 for (int result = 0; result < mSrec.getResultCount() && 56 intents.size() < RESULT_LIMIT; result++) { 57 58 // parse the semanticMeaning string and build an Intent 59 String conf = mSrec.getResult(result, Recognizer.KEY_CONFIDENCE); 60 String literal = mSrec.getResult(result, Recognizer.KEY_LITERAL); 61 String semantic = mSrec.getResult(result, Recognizer.KEY_MEANING); 62 String msg = "conf=" + conf + " lit=" + literal + " sem=" + semantic; 63 if (false) Log.d(TAG, msg); 64 } 65 66 // we only pay attention to the first result. 67 if (mSrec.getResultCount() > 0) { 68 // parse the semanticMeaning string and build an Intent 69 String conf = mSrec.getResult(0, Recognizer.KEY_CONFIDENCE); 70 String literal = mSrec.getResult(0, Recognizer.KEY_LITERAL); 71 String semantic = mSrec.getResult(0, Recognizer.KEY_MEANING); 72 String msg = "conf=" + conf + " lit=" + literal + " sem=" + semantic; 73 if (false) Log.d(TAG, msg); 74 if (mLogger != null) mLogger.logLine(msg); 75 76 if (("H".equalsIgnoreCase(semantic)) || 77 ("M".equalsIgnoreCase(semantic)) || 78 ("W".equalsIgnoreCase(semantic)) || 79 ("O".equalsIgnoreCase(semantic)) || 80 ("R".equalsIgnoreCase(semantic)) || 81 ("X".equalsIgnoreCase(semantic))) { 82 if (false) Log.d(TAG, " got valid response"); 83 Intent intent = new Intent(RecognizerEngine.ACTION_RECOGNIZER_RESULT, null); 84 intent.putExtra(RecognizerEngine.SENTENCE_EXTRA, literal); 85 intent.putExtra(RecognizerEngine.SEMANTIC_EXTRA, semantic); 86 addIntent(intents, intent); 87 } else { 88 // Anything besides yes or no is a failure. 89 } 90 } 91 92 // log if requested 93 if (mLogger != null) mLogger.logIntents(intents); 94 95 // bail out if cancelled 96 if (Thread.interrupted()) throw new InterruptedException(); 97 98 if (intents.size() == 0) { 99 if (false) Log.d(TAG, " no intents"); 100 recognizerClient.onRecognitionFailure("No Intents generated"); 101 } 102 else { 103 if (false) Log.d(TAG, " success"); 104 recognizerClient.onRecognitionSuccess( 105 intents.toArray(new Intent[intents.size()])); 106 } 107 } 108} 109