4

Javaを介してマイクのレベルにアクセスしようとしています。何も録音する必要はありません。音のレベルの相対的なスケールを知りたいだけです。

これはリアルタイムで可能ですか?

不可能な場合は、これでうまくいく可能性があります。レベルが特定の値を超えたときに記録を開始し、レベルが特定の時間に特定のレベルを下回ったときに停止します。1/ 4秒のビットを記録し、その音量を読み取り、しきい値を下回った場合録音を停止します。

前もって感謝します

4

2 に答える 2

8

http://www.technogumbo.com/tutorials/Java-Microphone-Selection-And-Level-Monitoring/Java-Microphone-Selection-And-Level-Monitoring.php

これに関するかなり良い記事。私を大いに助けてくれました。

私が言えることから、これは@Nickの回答で話された二乗平均平方根のものを使用します

基本的に:

public int calculateRMSLevel(byte[] audioData)
{ 
    long lSum = 0;
    for(int i=0; i < audioData.length; i++)
        lSum = lSum + audioData[i];

    double dAvg = lSum / audioData.length;
    double sumMeanSquare = 0d;

    for(int j=0; j < audioData.length; j++)
        sumMeanSquare += Math.pow(audioData[j] - dAvg, 2d);

    double averageMeanSquare = sumMeanSquare / audioData.length;

    return (int)(Math.pow(averageMeanSquare,0.5d) + 0.5);
}

と使用法:

int level = 0;
byte tempBuffer[] = new byte[6000];
stopCapture = false;
try {
    while (!stopCapture) {
        if (targetRecordLine.read(tempBuffer, 0, tempBuffer.length) > 0) {
            level = calculateRMSLevel(tempBuffer);
        }
    }
    targetRecordLine.close();
} catch (Exception e) {
    System.out.println(e);
    System.exit(0);
}
于 2015-09-17T03:22:53.727 に答える
4

Sound APIを介してマイクにアクセスできますが、単純なラウドネスレベルは得られません。データをキャプチャして、その音量を自分で決定する必要があります。

http://download.oracle.com/javase/tutorial/sound/capturing.html

録音とはデータを保存することを意味しますが、ここではラウドネスの決定が終わったらデータを破棄できます。

二乗平均平方根法は、波動データのセクションの振幅を計算するための良い方法です。

あなたのコメントに答えて、はい、あなたは短い長さのデータ(たぶんほんの数ミリ秒の価値がある)をキャプチャして、その振幅を計算するでしょう。更新が必要な頻度に応じて、これを定期的に繰り返します。以前の音量を追跡して比較したい場合、それはあなた次第です-この時点では、数値を比較しているだけです。最近のラウドネスの平均を使用して部屋の周囲のラウドネスを計算すると、ノイズの突然の増加を検出できます。

オーディオキャプチャのオンとオフを切り替えるのにどれだけのオーバーヘッドがあるかはわかりませんが、TargetDataLine常に開いたままにして、必要なときにラウドネスを計算する方がよい場合があります。ただし、回線が開いている間は、read()を呼び出し続ける必要があります。そうしないと、アプリケーションはデータの読み取りを待ってハングします。

于 2010-10-10T08:41:43.280 に答える