我有一些我在 pydub 中使用的音频样本(来自SampleSwap)。它们中的大多数具有 16 个样本深度/位,而其他是 24 或 32。看起来像这样:
import pydub
a = pydub.AudioSegment.from_file('16bit_file.wav')
b = pydub.AudioSegment.from_file('24bit_file.wav')
我遇到的问题是当我试图让他们回放时:
from pydub.playback import play
play(a)
play(b)
虽然 16 位文件正常播放,但 24 位文件的声音都震耳欲聋,严重到可能损坏扬声器的地步。在我的电脑设置为最小音量的情况下,24 位播放的音量与普通音乐以最大音量播放的音量差不多。它是超级扭曲、锐利和剪裁的。
我很确定我已经将其隔离为位深度问题。在其他软件中播放时,声音都正常播放。我可以使用 sox或 using将问题声音转换为 16 位pydub.AudioSegment.set_sample_width(2)
,然后问题就消失了。我也直接通过 simpleaudio 进行播放(从 pydub 复制代码,here)并得到同样的问题。
主要问题是我正在编写一些用于处理我想分享的音频的代码,但我不希望用户因听到这些破坏的声音之一而遭受身体或精神伤害。我唯一的解决方法是立即将任何使用加载的声音/锁定音频播放的位深度转换为仅 16 位文件;这适用于我正在测试的文件,但是 a)我不知道它是否适用于所有声音/计算机,并且 b)我认为这在 pydub 中不应该是一个问题。我还想在播放之前以某种方式检查声音的音量(使用例如a.dBFS
或a.max
),但我没有发现任何似乎可靠的东西(指标与音量并没有真正相关,或者值似乎是更多的额外位提供的动态范围的指示)。
所以我的问题是:
- 为什么在播放非 16 位文件时,我在 pydub 中播放的声音非常响亮、失真?
- 我能做些什么来防止它?
- 我在这里遗漏了一些关于音频播放的明显内容吗?
我知道这(希望)不是那么可重复的;如果有帮助,我可以尝试记录并发布。我还可以指出我在 SampleSwap 上使用的声音,但问题似乎是由任何不是 16 位的文件引起的(即我可以将声音转换为 32 位并生成问题)。
这是一些版本信息:
- ffmpeg 4.4
- PyAudio 0.2.11
- pydub 0.25.1
- 简单音频 1.0.4
问题出在 2019 款 MacBook Pro Catalina 10.15.7 上。我还测试了我的 Windows 10 桌面(与上述类似的版本),但不是上面的问题,我只是沉默。