web-dev-qa-db-ja.com

音声認識インテントからのオーディオの録音/保存

この質問をする前に、この問題に関連するすべてのstackoverflow他のスレッドをチェックしましたが、成功しませんでした。そのため、他のスレッドへのリンクで答えないでください:)

Google認識サービスが音声認識からテキストへの操作に使用した音声を保存/録音したい(RecognizerIntentまたはSpeechRecognizerを使用)。

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

  1. recognitionListenerからのonBufferReceived:わかっています。これは機能していません。テストして、何が起こるかを確認してください。onBufferReceivedが呼び出されることはありません(JB 4.3でGalaxy Nexusでテスト済み)
  2. メディアレコーダーを使用:機能していません。それは音声認識を破壊しています。マイクに対して許可される操作は1つだけです
  3. スピーチからテキストへのapiを実行してコピーする前に、認識サービスが一時的なオーディオファイルを保存する場所を見つけようとしましたが、成功しませんでした

私はほとんど必死でしたが、 Google Keepアプリケーション が必要なことをしていることに気づきました!!!!私はlogcatを使用してkeepアプリケーションを少しデバッグしました。また、アプリは "RecognizerIntent.ACTION_RECOGNIZE_SPEECH"(私たち、開発者のように)を呼び出して、テキストへのスピーチをトリガーします。しかし、どのようにしてオーディオを保存するのですか?それは非表示のapiになれますか?グーグルは "不正行為"です:)?

ご協力ありがとうございました

宜しくお願いします

26
Slim

@Kaarelの答えはほぼ完成です-結果のオーディオはintent.getData()にあり、ContentResolverを使用して読み取ることができます

残念ながら、返されるAMRファイルは低品質です。高品質の録音を取得する方法を見つけることができませんでした。 「audio/AMR」以外の値を試したところ、intent.getData()にnullが返されました。

高品質の録音を取得する方法を見つけたら、コメントするか、回答を追加してください!

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
}
19
Iftah

前回チェックしたとき、Google Keepは次の追加機能を設定しました。

  • Android.speech.extra.GET_AUDIO_FORMAT:audio/AMR
  • Android.speech.extra.GET_AUDIO:true

これらはAndroidドキュメントの一部として文書化されていないため、Android APIを構成していません。また、Google Keepは、認識機能に依存せず、これらの追加機能がGoogleによって普及し、文書化されていれば、それは素晴らしいことです。

Google KeepがRecognizerIntentを呼び出したときにどの追加が設定されているかを確認するには、RecognizerIntentに応答するアプリを実装し、受け取ったすべての追加を出力します。 RecognizerIntentの実装であるKõnele( http://kaljurand.github.io/K6nele/ )をインストールすることもできます。 KõneleがGoogle Keepによって起動されたら、レンチ形の設定アイコンを長押しします。これは、発信者に関するいくつかの技術的な詳細を示しており、着信エクストラも含まれています。

@Iftahの回答は、Google KeepがRecognizerIntentの発信者に音声録音を返す方法を説明しています。

9
Kaarel

私はここからこの回答を得ました。日付を確認したところ、投稿の数日後に投稿されたことがわかりました。 Android音声認識とオーディオ録音を同時に

ある男は言う:

私は音声認識と音声録音を行うためにうまく機能している解決策を得ました。ここに( https://github.com/katchsvartanian/voiceRecognition )は、簡単なAndroidプロジェクトへのリンクであり、ソリューションの動作を示すために作成しました。また、アプリを説明するためのプロジェクト内のいくつかの印刷画面。

私が使ったアプローチを簡単に説明しようと思います。このプロジェクトでは、Google Speech APIとFlacレコーディングの2つの機能を組み合わせました。

Google Speech APIはHTTP接続を介して呼び出されます。 Mike PultzがAPIについて詳しく説明しています。

「(...)新しい[Google] APIは全二重ストリーミングAPIです。つまり、実際には2つのHTTP接続を使用します。1つPOST 「ライブ」のチャンクストリーム、および結果にアクセスするための2番目のGETリクエスト。これは、長いオーディオサンプルやストリーミングオーディオの場合に非常に有効です。

ただし、このAPIが正しく機能するには、FLACサウンドファイルを受信する必要があります。それでは、次のパート、Flacレコーディングに進みます。

AudioBooと呼ばれるオープンソースアプリからコードとライブラリの一部を抽出して適用することで、そのプロジェクトにFlacレコーディングを実装しました。 AudioBooはネイティブコードを使用して、flac形式を記録および再生します。

したがって、flacサウンドを録音してGoogle Speech APIに送信し、テキストを取得して、録音したばかりのサウンドを再生することができます。

私が作成したプロジェクトには、それを機能させるための基本原則があり、特定の状況に合わせて改善することができます。別のシナリオで機能させるためには、Google Sromのキーを取得する必要があります。これは、Google Chromium-devグループの一部として取得されます。そのプロジェクトに1つのキーを残して、機能していることを示しましたが、最終的には削除します。誰かがそれについてさらに情報が必要な場合は、この投稿に2つを超えるリンクを配置することができない原因を教えてください。

3
Kappa