如何在声音文件中获取特定时间的振幅?
我正在做一个项目,需要知道从电脑麦克风输入的声音的音量。
我现在使用的是Python和Snack Sound Toolkit,可以录制麦克风输入的音频,但我需要知道这个音频有多响。我可以把录音保存到一个文件里,然后用其他工具读取音频文件中某些时刻的音量,或者尝试在音频录制时直接获取音量(这样可能会出错)。
有没有什么库或者示例代码可以帮我解决这个问题?我查找了一下,目前看来Snack Sound Toolkit是我最好的选择,但似乎没有办法直接获取音量。
3 个回答
我不确定这是否有帮助,但skimpygimpy提供了一些工具,可以把WAVE文件解析成Python中的序列,也可以把它们转换回来。你可以用这个工具直接查看波形样本,做你想做的事情。不过,你需要阅读一些源代码,因为这些子组件没有文档说明。
我完全不同意CookieOfFortune的这个“回答”。
虽然问题的表述确实不太好……但这个回答把事情搞得比必要的复杂多了。我猜你说的“幅度”是指听到的声音大小。其实在技术上,每个PCM音频流中的样本代表了某个时间点的信号幅度。要想得到声音的大小,可以试试简单的均方根(RMS)计算:
|K<
在Snack Sound Toolkit的例子中,有一个叫做dbPowerSpectrum的函数。
根据参考资料:
dBPowerSpectrum ( )
这个函数计算声音在某个特定样本点的对数FFT功率谱,并返回一系列以分贝为单位的值。关于其他选项的描述,可以查看相关部分。你还可以选择一个结束点,使用end选项。在这种情况下,结果是指定范围内连续FFT的平均值。默认的间隔是根据fftlength来决定的,但你可以通过skip选项来改变这个间隔,告诉函数每次移动FFT窗口多少个点。选项包括:
编辑:我假设你说的幅度是指声音对人耳的“响亮程度”,而不是时间域的电压(因为整个时间段内的正弦波积分会是0,比如10 * sin(t)比5 * sin(t)响,但它们的平均值都是0。反正你也不想把非交流电压送到扬声器)。
要知道声音有多响,你需要确定每个频率成分的幅度。这是通过傅里叶变换(FFT)来实现的,它将声音分解成不同的频率成分。dbPowerSpectrum函数似乎会给你每个频率的幅度列表(如果这和功率谱的确切定义不符,请见谅)。要得到总音量,你只需将整个列表的值相加(这会很接近,但可能和人耳感知的响度还有些不同,因为人耳本身对不同频率的响应也会影响感知)。