1

多数のオーディオ セグメントをオーバーレイし、(1, 1, 1, 0.5, 0...) の形式で値のタプルを関数に渡すことができるようにしたいと考えています。各数値はボリュームの比率です。にスケーリングする必要があります。0 は完全に無音、1 は変更されていない元の音量、0.5 は正確に半分です。私が理解している限り、これはGainNode の「gain」プロパティの動作です。

これまでにこれらを試しました:

def adjust_volume(audio_segment, ratio):
    decibel = pydub.utils.ratio_to_db(audio_segment.rms)
    return audio_segment - decibel * (1 - ratio)

SILENCE_THRESHOLD = -120.00
def adjust_volume(audio_segment, ratio):
    difference = SILENCE_THRESHOLD - audio_segment.dBFS
    return audio_segment + (difference - (difference * ratio))

残念ながら、どちらも不完全に動作します。つまり、ブラウザー (Mozilla Firefox) の動作を正確に再現するわけではありません。最初のものを使用すると、0 のみを含むタプルを渡してもオーディオ プレーヤー (foobar2000) で音を聞くことができます。同じ値を使用してブラウザで観察できるレベルよりもはるかに低いレベルです。

私の技術的なオーディオ知識は非常に限られていることに注意してください。これらは、異なるオーディオ機器、オーディオ実装の詳細などによって作成された単なる技術的な不正確さですか? その場合、誰かがこのスケーリングを行うための最も「正しい」方法を提案できますか?

4

1 に答える 1

1

0.5私の最初の質問は、正確にはどういう意味ですか。音の大きさは対数です (信号の振幅、高さを 2 倍にするたびに、同じ量だけ大きく聞こえます)。

とはいえ、単純に 0.5 では振幅が半分になりますか? もしそうなら、それは約6dB静かになるでしょう(私は思う!私はいつも振幅とパワーの計算を混同しています笑)。または、0.5 は無音と最大ラウドネスの中間ですか?

とにかく、pydub で無音にしたい場合は、音量を 120dB 下げるとよいでしょう。人間が聞き取れる最大のダイナミックレンジは 140dB ですが、CD オーディオ (16 ビット) は約 90dB です。

pydub は、ゲインを適用するだけでなく、2 つのボリューム間でフェードするためのヘルパー関数を提供します。

from pydub import AudioSegment
from pydub.utils import ratio_to_db, db_to_float

sound = AudioSegment.from_file('/your/file.wav')

# this is roughly -6.0
half_amplitude_in_db = ratio_to_db(0.5)

# these are all roughly the same result
half_amplitude1 = sound.apply_gain(half_amplitude_in_db)
half_amplitude2 = sound.apply_gain(-6.0)
half_amplitude3 = sound - 6.0

# Assuming 16-bit sound, that’s ~90dB dynamic range.
# so -45dB is half way to silent.
# Note: that is A LOT quieter
half_way_to_silent = sound - 45.0

お役に立てれば。

注:仕様を見ると、これを行う必要があると思います:

web_API_gain_value = 0.5

gain_in_db = ratio_to_db(web_API_gain_value)

sound_after_gain = sound.apply_gain(gain_in_db)
于 2015-02-07T22:37:19.170 に答える