音声認識インテントからオーディオを録音/保存する 質問する

音声認識インテントからオーディオを録音/保存する 質問する

Google 認識サービスが音声テキスト変換操作に使用したオーディオを保存/録音します (RecognizerIntent または SpeechRecognizer を使用)。

私は多くのアイデアを経験しました:

  1. RecognitionListener からの onBufferReceived: わかっています、これは機能していません。何が起こるかテストするだけで、onBufferReceived が呼び出されることはありません (JB 4.3 を搭載した Galaxy Nexus でテスト済み)

  2. メディアレコーダーを使用しました: 動作しません。音声認識が壊れています。マイクに対しては 1 つの操作のみが許可されています

  3. 音声テキスト変換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
}

おすすめ記事