音声の音声ファイルを正規化しようとしています。
具体的には、オーディオファイルに音量のピークが含まれている場合、それを平準化しようとしているので、静かなセクションは大きくなり、ピークは静かになります。
このタスクに取り組むことから学んだことを除いて、私はオーディオ操作についてほとんど知りません。また、私の数学は恥ずかしいほど弱いです。
私はいくつかの調査を行いましたが、Xuggleサイトには、次のコードを使用して音量を下げることを示すサンプルがあります:(完全版はこちら)
@Override
public void onAudioSamples(IAudioSamplesEvent event)
{
// get the raw audio byes and adjust it's value
ShortBuffer buffer = event.getAudioSamples().getByteBuffer().asShortBuffer();
for (int i = 0; i < buffer.limit(); ++i)
buffer.put(i, (short)(buffer.get(i) * mVolume));
super.onAudioSamples(event);
}
getAudioSamples()
ここでは、定数でバイトを変更しますmVolume
。
このアプローチに基づいてgetAudioSamples()
、ファイル内の最大/最小を考慮して、正規化によってバイトを正規化された値に変更しようとしました。(詳細については、以下を参照してください)。「無音」(つまり、値を下回るもの)をそのままにしておくための単純なフィルターがあります。
出力ファイルのノイズが非常に多い(つまり、品質が大幅に低下している)ことがわかりました。エラーは、正規化アルゴリズムか、バイトの操作方法のいずれかにあると思います。しかし、次にどこに行けばいいのかわかりません。
これが私が現在行っていることの要約版です。
ステップ1:ファイル内のピークを見つける:
完全なオーディオファイルを読み取り、buffer.get()
すべてのAudioSamplesのこの最高値と最低値を見つけます
@Override
public void onAudioSamples(IAudioSamplesEvent event) {
IAudioSamples audioSamples = event.getAudioSamples();
ShortBuffer buffer =
audioSamples.getByteBuffer().asShortBuffer();
short min = Short.MAX_VALUE;
short max = Short.MIN_VALUE;
for (int i = 0; i < buffer.limit(); ++i) {
short value = buffer.get(i);
min = (short) Math.min(min, value);
max = (short) Math.max(max, value);
}
// assign of min/max ommitted for brevity.
super.onAudioSamples(event);
}
手順2:すべての値を正規化します。
手順1と同様のループで、バッファを正規化された値に置き換え、次を呼び出します。
buffer.put(i, normalize(buffer.get(i));
public short normalize(short value) {
if (isBackgroundNoise(value))
return value;
short rawMin = // min from step1
short rawMax = // max from step1
short targetRangeMin = 1000;
short targetRangeMax = 8000;
int abs = Math.abs(value);
double a = (abs - rawMin) * (targetRangeMax - targetRangeMin);
double b = (rawMax - rawMin);
double result = targetRangeMin + ( a/b );
// Copy the sign of value to result.
result = Math.copySign(result,value);
return (short) result;
}
質問:
- これは、オーディオファイルの正規化を試みるための有効なアプローチですか?
- 私の数学は
normalize()
有効ですか? - デモコードの同様のアプローチではないのに、なぜこれによってファイルのノイズが増えるのでしょうか。