2

我正在做一个项目,我需要知道来自计算机麦克风的声音幅度。

我目前正在将 Python 与Snack Sound Toolkit一起使用,我可以录制来自麦克风的音频,但我需要知道该音频的响度。我可以将录音保存到一个文件中,并使用另一个工具包从音频文件中读取给定时间点的幅度,或者尝试在音频进入时获取幅度(这可能更容易出错)。

是否有任何库或示例代码可以帮助我解决这个问题?我一直在寻找,到目前为止,Snack Sound Toolkit 似乎是我最大的希望,但似乎没有办法直接访问振幅。

4

3 回答 3

3

查看 Snack Sound Toolkit 示例,似乎有一个 dbPowerSpectrum 函数。

从参考:

分贝功率谱 ( )

计算声音的对数 FFT 功率谱(在开始选项中给出的样本数处)并返回一个 dB 值列表。有关其余选项的说明,请参见章节项目。可选地,可以使用 end 选项给出结束点。在这种情况下,结果是指定范围内连续 FFT 的平均值。它们的默认间距取自 fftlength,但这可以使用 skip 选项进行更改,该选项告诉 FFT 窗口每步移动多少点。选项:

编辑:我假设当你说振幅时,你的意思是声音对人来说有多“响亮”,而不是时域电压(由于正弦波的积分将是 0,因此在整个长度上可能为 0 . 例如:10 * sin(t) 比 5 * sin(t) 响亮,但随着时间的推移,它们的平均值为 0。(无论如何,您都不想向扬声器发送非交流电压))。

要获得声音的响度,您需要确定每个频率分量的幅度。这是通过傅里叶变换 (FFT) 完成的,它将声音分解为其频率分量。dbPowerSpectrum 函数似乎为您提供了每个频率的幅度列表(如果这与功率谱的确切定义不同,请原谅我)。要获得总音量,您可以将整个列表相加(这将接近,xept 它仍然可能与感知响度不同,因为人耳本身具有频率响应)。

于 2009-04-12T22:56:54.907 回答
1

我完全不同意 CookieOfFortune 的这个“答案”。

当然,这个问题的措辞很糟糕......但这个答案使事情变得比必要的复杂得多。我假设“幅度”是指感知响度。从技术上讲,(PCM)音频流中的每个样本都代表给定时间片上信号的幅度。要获得响度表示,请尝试简单的 RMS 计算:

有效值

|K<

于 2009-04-23T14:28:38.357 回答
0

我不确定这是否会有所帮助,但skimpygimpy 提供了将WAVE 文件解析为python 序列并返回的工具——您可以使用它来直接检查波形样本并做您喜欢的事情。您将不得不阅读一些源代码,这些子组件没有记录。

于 2009-05-10T16:30:16.187 回答