Google 認識サービスが音声テキスト変換操作に使用したオーディオを保存/録音します (RecognizerIntent または SpeechRecognizer を使用)。
私は多くのアイデアを経験しました:
RecognitionListener からの onBufferReceived: わかっています、これは機能していません。何が起こるかテストするだけで、onBufferReceived が呼び出されることはありません (JB 4.3 を搭載した Galaxy Nexus でテスト済み)
メディアレコーダーを使用しました: 動作しません。音声認識が壊れています。マイクに対しては 1 つの操作のみが許可されています
音声テキスト変換APIを実行する前に認識サービスが一時オーディオファイルを保存している場所を見つけてコピーしようとしましたが、成功しませんでした。
私は絶望しそうになったが、Google Keep アプリケーション必要なことはすべてやってくれています! logcat を使用して keep アプリケーションを少しデバッグしたところ、アプリは (開発者が行うように) 音声テキスト変換をトリガーするために「RecognizerIntent.ACTION_RECOGNIZE_SPEECH」も呼び出しています。しかし、keep はどのようにしてオーディオを保存しているのでしょうか? これは、hide API なのでしょうか? Google は「ごまかし」をしているのでしょうか?
ベストアンサー1
@Kaarelさんの回答はほぼ完了です。結果の音声は入っておりintent.getData()
、以下を使用して読むことができます。ContentResolver
残念ながら、返される AMR ファイルの品質は低く、高品質の録音を実現する方法を見つけることができませんでした。「audio/AMR」以外の値を試しても、null が返されましたintent.getData()
。
高品質の録音を実現する方法を見つけた場合は、コメントするか回答を追加してください。
public void startSpeechRecognition() {
// Fire an intent to start the speech recognition activity.
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
// secret parameters that when added provide audio url in the result
intent.putExtra("android.speech.extra.GET_AUDIO_FORMAT", "audio/AMR");
intent.putExtra("android.speech.extra.GET_AUDIO", true);
startActivityForResult(intent, "<some code you choose>");
}
// handle result of speech recognition
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// the resulting text is in the getExtras:
Bundle bundle = data.getExtras();
ArrayList<String> matches = bundle.getStringArrayList(RecognizerIntent.EXTRA_RESULTS)
// the recording url is in getData:
Uri audioUri = data.getData();
ContentResolver contentResolver = getContentResolver();
InputStream filestream = contentResolver.openInputStream(audioUri);
// TODO: read audio file from inputstream
}