gpt4 book ai didi

python - 如何获得在Python 3.x中记录的音频的频率和幅度?

转载 作者:行者123 更新时间:2023-12-02 22:46:32 24 4
gpt4 key购买 nike

我正在尝试记录音频,并在1秒钟的间隔内获得音频的平均频率和幅度,而无需写入文件。关于如何使用pyaudio读取文件的方法,有很多示例,尽管在这种特定情况下可以使用的任何东西都使用了Python 2.7库,而Python 3.x似乎不存在。

任何帮助,将不胜感激!

最佳答案

获取音频

我不确定您使用的是哪个库来记录音频,但是(我认为)用于实时记录/回放的常规方法是PyAudio(您只提到了要从文件中读取它)。

他们有一个用于实时处理的blockingnon-blocking音频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)。

以供引用:
  • 这是scipy.fft以及如何入门
  • 的链接
  • 这是numpy.fft的链接,并带有一些示例

  • 如果您想对频率信息进行某些操作,则可以在处理循环中调用此函数。

    确定音高(/音符)

    这是许多人试图完成的一项重要任务。大多数算法通常都涉及FFT(如前所述),但顶层还有另一层复杂的处理。我建议使用一个库,除非您想开发自己的算法:
  • Google's REAPER算法(需要为wrapped into Python)
  • Aubio Python DSP库
  • Librosa Python音频分析库(here's an example入门)
  • 关于python - 如何获得在Python 3.x中记录的音频的频率和幅度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51431859/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com