[英]How do I get the frequency and amplitude of audio that's being recorded in Python 3.x?
我正在尝试记录音频,并在1秒钟的时间间隔内获得音频的平均频率和幅度,而无需写入文件。 有许多示例说明了如何使用pyaudio读取文件,但是对于这种特定情况,可以使用的任何东西都使用了Python 2.7库,而Python 3.x似乎不存在这种库。
任何帮助,将不胜感激!
我不确定您使用的是哪个库来记录音频,但实时记录/回放的常规方法(在我看来)是PyAudio (您只是提到要从文件中读取它)。
他们有一个用于实时处理的阻塞和非阻塞音频I / O的示例。 例如,使用阻塞模式示例,您可以在每次收到新的音频块时执行DSP处理。
"""PyAudio Example: Play a wave file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# open stream (2)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# read data
data = wf.readframes(CHUNK)
# play stream (3)
while len(data) > 0:
stream.write(data)
data = wf.readframes(CHUNK)
# Do all of your DSP processing here i.e. function call or whatever
# stop stream (4)
stream.stop_stream()
stream.close()
# close PyAudio (5)
p.terminate()
如果您想要信号在任何给定点的幅度,那么您要做的就是获取样本数组中一个样本的绝对值,即从音频块数据中获取第三个样本的幅度。
ampSample3 = abs(data[2])
显然,这对于单个样本幅度通常没有什么用,但是最好查看整个块。 因此,您可以计算每个值的绝对值,将所有数组求和,然后除以块大小(平均值)。
blockAmplitudeMean = sum(numpy.absolute(x))/len(x)
但是,在使用音频时,我们通常需要块的RMS值。
blockLinearRms= numpy.sqrt(numpy.mean(data**2)) # Linear value between 0 -> 1
blockLogRms = 20 * math.log10(blockLinearRms) # Decibel (dB value) between 0 dB -> -inf dB
在您的问题中,您仅指定了获取音频的频率 ,这可能意味着两件事之一。
通常用于DSP中的频谱可以使用DFT (离散傅里叶变换)进行分析。 通常,您会以FFT (快速傅立叶变换)的名称看到它,因为这是DFT最流行的实现。 已经有Python库为您实现FFT,并且易于使用。
请注意,这将为您提供一个包含块信息长度的数组,其中包含复杂信息(实际信号+相位信息),即频率信息。 这并不意味着您可以确定输入音频的音调(您不能直接说出某人正在钢琴上弹A1音符,除非信号的质量很高并且您仍然具有一些基本的DSP处理能力以及FFT)。
以供参考:
如果您想对频率信息进行某些操作,则可以在处理循环中调用此函数。
这是许多人试图完成的一项重要任务。 大多数算法通常都涉及FFT(如前所述),但顶层还有另一层复杂的处理。 我建议使用一个库,除非您想开发自己的算法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.