音声の録音と音声認識を同時に行おうとしています。それらはそれぞれ個別に機能しますが、一緒に機能するのは録音のみです。
コードは次のようになります。
private SpeechRecognizer sr;
private MediaRecorder recorder;
private void startRecording() throws IOException {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setOutputFile("/dev/null");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.prepare();
recorder.start();
}
private void startRecognition() {
intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());
sr = SpeechRecognizer.createSpeechRecognizer(this);
sr.setRecognitionListener(this);
sr.startListening(intent);
}
両方のメソッドが呼び出されると、onReadyForSpeech コールバックが呼び出されますが、何も起こりません。startRecognition() のみが呼び出された場合、音声認識は正常に機能します。
音声認識がマイクからのバッファも使用しているためだと思いますが、この問題をどのように回避できるのでしょうか?
編集:クラウドAPIやその他の非オフラインAPIを使用するつもりはありません(他の同様の質問で提案されているように)。また、FLAC アプローチを採用すると、部分的な書き起こし結果を取得できなくなる可能性があります。私はまだ使用を検討していますが、可能であれば、より標準的な非 jni の代替手段を好むでしょう。