/* * Copyright (C) 2015-present, osfans * waxaca@163.com https://github.com/osfans * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.osfans.trime; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.speech.RecognitionListener; import android.speech.RecognizerIntent; import android.speech.SpeechRecognizer; import android.util.Log; import android.widget.Toast; import java.util.ArrayList; /** {@link RecognitionListener 語音輸入} */ class Speech implements RecognitionListener { private SpeechRecognizer speech = null; private Intent recognizerIntent; private String TAG = "Speech"; private Context context; public Speech(Context context) { this.context = context; speech = SpeechRecognizer.createSpeechRecognizer(context); speech.setRecognitionListener(this); recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); //recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en"); //recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, context.getPackageName()); //recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); //recognizerIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "開始語音"); } private void alert(String text) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); } public void start() { speech.startListening(recognizerIntent); } private void stop() { speech.stopListening(); } private void destory() { if (speech != null) { speech.destroy(); } } @Override public void onBeginningOfSpeech() { Log.i(TAG, "onBeginningOfSpeech"); } @Override public void onBufferReceived(byte[] buffer) { Log.i(TAG, "onBufferReceived: " + buffer); } @Override public void onEndOfSpeech() { Log.i(TAG, "onEndOfSpeech"); } @Override public void onError(int errorCode) { speech.stopListening(); speech.destroy(); String errorMessage = getErrorText(errorCode); alert(errorMessage); } @Override public void onEvent(int arg0, Bundle arg1) { Log.i(TAG, "onEvent"); } @Override public void onPartialResults(Bundle arg0) { Log.i(TAG, "onPartialResults"); } @Override public void onReadyForSpeech(Bundle arg0) { Log.i(TAG, "onReadyForSpeech"); alert("請開始說話:"); } @Override public void onResults(Bundle results) { stop(); destory(); Log.i(TAG, "onResults"); Trime trime = Trime.getService(); if (trime == null) return; ArrayList matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); String opencc_config = Config.get(context).getString("speech_opencc_config"); for (String result : matches) trime.commitText(Rime.openccConvert(result, opencc_config)); } @Override public void onRmsChanged(float rmsdB) { Log.i(TAG, "onRmsChanged: " + rmsdB); } private static String getErrorText(int errorCode) { String message; switch (errorCode) { case SpeechRecognizer.ERROR_AUDIO: message = "錄音錯誤"; break; case SpeechRecognizer.ERROR_CLIENT: message = "客戶端錯誤"; break; case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS: message = "權限不足"; break; case SpeechRecognizer.ERROR_NETWORK: message = "網絡錯誤"; break; case SpeechRecognizer.ERROR_NETWORK_TIMEOUT: message = "網絡超時"; break; case SpeechRecognizer.ERROR_NO_MATCH: message = "未能識別"; break; case SpeechRecognizer.ERROR_RECOGNIZER_BUSY: message = "識別服務忙"; break; case SpeechRecognizer.ERROR_SERVER: message = "服務器錯誤"; break; case SpeechRecognizer.ERROR_SPEECH_TIMEOUT: message = "無語音輸入"; break; default: message = "未知錯誤"; break; } return message; } }