私の仕事は、音声を長時間録音し、認識テキスト用に 3 秒のファイルをサーバーに送信することです (そのために Google を使用します)。ファイルに直接書き込む場合、レコーダーを再初期化して新しいファイルを開始する必要があり、メディアレコーダーの開始と停止に時間がかかります。そのため、ParcelFileDescriptor.createPipe() を使用することにしました。これが、レコーダーを作成して初期化する方法です。
ParcelFileDescriptor[] fdPair = new ParcelFileDescriptor[0];
fdPair = ParcelFileDescriptor.createPipe();
ParcelFileDescriptor readFD = fdPair[0];
ParcelFileDescriptor writeFD = fdPair[1];
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
mediaRecorder.setAudioSamplingRate(8000);
mediaRecorder.setOutputFile(writeFD.getFileDescriptor());
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
次に、記録データを読み取る入力ストリームを作成します。
final ParcelFileDescriptor.AutoCloseInputStream reader = new ParcelFileDescriptor.AutoCloseInputStream(readFD);
このリーダーから読み取ったデータを FileOutputStream に書き込みます。
3 秒ごとに新しいファイルと新しい FileOutputStream を作成し、前のファイルからサーバーにデータを送信します。
ARM形式に従ってバイトを読み取っています(ファイルヘッダー、すべてのフレームのヘッダービットを読み取り、次にフレーム全体を読み取るよりも)。
Android 2.3.3 を搭載した Nexus One では問題なく動作しますが、Galaxy S III、Galaxy Nexus、および LG p990 では、デバイス プレーヤーが読み取ることができず、Google が認識できない何かを書き込みます。Google レコグナイザーは、「ok ok」や「######」のようなものを返します (ファイルに何らかのノイズが含まれているようです)。
なぜこれが別の電話/プラットフォームで同じように機能しないのか、誰かが知っていますか?
ありがとう、
PS 私は AudioRecord を使用できません – Google には AMR (または speex、または flac) が必要です