派生ボリューム レベルで取得できるように、読み取りの基礎となるバッファーを公開する必要があります。これは、ボリュームの RMS レベルを公開しない可能性のある「MediaPlayer」以外の API を使用することを意味する場合があります。
MP3 でバッファリングされた読み取りを実行するたびに、次の方法でボリュームから x 軸、y 軸のデータを生成できます。
while (mIsPlaying) {
double sum = 0;
int readSize = mRecorder.read(mBuffer, 0, mBuffer.length);
for (int i = 0; i < readSize; i++) {
output.writeShort(mBuffer[i]);
sum += mBuffer[i] * mBuffer[i];
}
// PrBar needs RMS as int
//log base2 for the rms expression on the Volume from the mic
if (readSize > 0) {
mProgressBar.setProgress((int)Math.sqrt( sum / readSize ));
handleRMS((Math.log(Math.sqrt( sum / readSize ))/Math.log(2)));
}
}
...
private void handleRMS(double rms){
rmscnt++;
rmssum += rms;
if(rms > rmsmax)rmsmax=rms;
if(rms< rmsmin)rmsmin=rms;
double myamt=(rmsmax - rmsmin) / 10 +rmsmin;
if (rms < myamt) decile++;
if(rmscnt % 5 ==0){
if (rmssum / 5 < myamt) {
if( Long.valueOf(System.currentTimeMillis())
- tslist.get(tslist.size()-1) - segmenttime > 0 ){
tslist.add(Long.valueOf(System.currentTimeMillis()));
};
};
rmssum = 0;
}
}
* feature - select the TS corresponding to a 'pause' in the speech stream * arriving from microphone * ''pause' in algorythm and
正弦波パターンの通常の RMS ボリューム レベル * 正弦波に照らして RMS の最後の読み取り値を観察します * 最小値と最大値は、波形の「y 軸」の値です * 「myamt」フィールドはしきい値の上限です。現在、デルタ (最大 - 最小) の 10 パーセント * 実際には、一時停止には、いくつかの構成値より * 小さい AVG を持つ一連の隣接する RMS 値が必要です。* 一時停止の TS が受け入れられると、スピーチ内の別の一時停止を探す前に * 経過する必要がある時間の別の最小値があります。* 役立つヒント - RMS 値の 5 ~ 10% で「十分位数」を増やす必要があります。* そうしないと、発話の一時停止を識別するのに十分な量のイベントがレーダーにありません。
バッファを公開するには、「MediaPlayer」API の代わりに、「AudioTrack」などを使用して mp3 を処理する必要がある場合があります。サンプルについては、 gitでこのプロジェクトにアクセスできると思います
RMS とハンドラーの説明はこちら