要在Android中實現語音輸入,您需要使用InputMethodService
和SpeechRecognizer
類。以下是實現語音輸入的基本步驟:
InputMethodService
的類:public class VoiceInputService extends InputMethodService implements SpeechRecognizer.OnSpeechListener {
// 在這里實現語音輸入服務
}
VoiceInputService
類中,初始化SpeechRecognizer
對象:private SpeechRecognizer speechRecognizer;
@Override
public View onCreateInputView() {
// 創建一個布局文件,包含一個用于顯示語音輸入結果的EditText
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View inputView = inflater.inflate(R.layout.voice_input_view, null);
// 初始化SpeechRecognizer
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
speechRecognizer.setRecognitionListener(this);
// 獲取布局文件中的EditText
EditText editText = inputView.findViewById(R.id.edit_text);
// 創建一個Intent用于啟動語音識別
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "請說話");
// 將EditText設置為語音輸入的焦點,并請求顯示軟鍵盤
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
}
}
});
// 將EditText與Intent關聯
editText.setTag(intent);
return inputView;
}
SpeechRecognizer.OnSpeechListener
接口的方法:@Override
public void onReadyForSpeech(Bundle params) {
// 當語音識別器準備好時調用
}
@Override
public void onBeginningOfSpeech() {
// 當語音輸入開始時調用
}
@Override
public void onRmsChanged(float rmsdB) {
// 當音頻的RMS(均方根)值改變時調用
}
@Override
public void onBufferReceived(byte[] buffer) {
// 當接收到音頻數據時調用
}
@Override
public void onEndOfSpeech() {
// 當語音輸入結束時調用
}
@Override
public void onError(int error) {
// 當語音識別發生錯誤時調用
}
@Override
public void onResults(Bundle results) {
// 當語音識別完成并返回結果時調用
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
if (matches != null && !matches.isEmpty()) {
String spokenText = matches.get(0);
// 將識別到的文本設置為EditText的內容
EditText editText = (EditText) getCurrentFocus();
editText.setText(spokenText);
}
}
@Override
public void onPartialResults(Bundle partialResults) {
// 當部分識別結果可用時調用
}
@Override
public void onEvent(int eventType, Bundle params) {
// 當發生與語音識別相關的事件時調用
}
AndroidManifest.xml
中聲明您的服務:<service
android:name=".VoiceInputService"
android:permission="android.permission.BIND_INPUT_METHOD">
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
</service>
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showInputMethodPicker();
這樣,當用戶點擊軟鍵盤上的麥克風圖標時,您的語音輸入服務將啟動并接收用戶的語音輸入。