【问题标题】:Get an audio sample as float number from pyaudio-stream从 pyaudio-stream 获取音频样本作为浮点数
【发布时间】:2013-10-28 07:49:01
【问题描述】:

由于我目前正要构建一个基于 Raspberry Pi 的设备,用于测量使用声卡记录的噪声(例如方差)中的一些东西,并尝试在 python 中执行此操作,所以我一直不知道如何获得一个一个音频样本作为浮点数用于进一步计算。

我做了什么:
拿了一个 Line-In-to-chinch-adapter 并触摸插头以生成某种测试信号。
记录到例如 Audacity 或 Matlab 会显示合理的结果,例如

我想得到什么:
理想情况下,我想从声卡中获取例如 5 帧 á 1024 个样本,并将它们转换为列表、元组或 numpy 数组作为浮点数以供进一步计算。

当尝试使用本文末尾的代码使用 python/pyaudio 实现这一点时,我得到了这样的结果:

由于我使用 python 获得的值似乎与 Matlab(和其他)中的值相差大约两倍,我认为我监督了某些事情或做错了什么。 我想我在 struct.unpack 区域的某个地方犯了一个错误,但无法弄清楚究竟在哪里或为什么。 我想请你帮忙,指出错误在哪里以及我做错了什么。

用于获取一些样本并绘制它们的小测试代码:

import pyaudio
import struct
import matplotlib.pyplot as plt

FORMAT = pyaudio.paFloat32
SAMPLEFREQ = 44100
FRAMESIZE = 1024
NOFFRAMES = 220
p = pyaudio.PyAudio()
print('running')

stream = p.open(format=FORMAT,channels=1,rate=SAMPLEFREQ,input=True,frames_per_buffer=FRAMESIZE)
data = stream.read(NOFFRAMES*FRAMESIZE)
decoded = struct.unpack(str(NOFFRAMES*FRAMESIZE)+'f',data)

stream.stop_stream()
stream.close()
p.terminate()
print('done')
plt.plot(decoded)
plt.show()

【问题讨论】:

    标签: python pyaudio


    【解决方案1】:

    尝试使用“numpy.fromstring”函数替换“struct.unpack”:

    import numpy
    stream = p.open(format=FORMAT,channels=1,rate=SAMPLEFREQ,input=True,frames_per_buffer=FRAMESIZE)
    data = stream.read(NOFFRAMES*FRAMESIZE)
    decoded = numpy.fromstring(data, 'Float32');
    

    让我知道这是否适合你

    【讨论】:

    • 因为我认为当有人在这里发布答案时会有某种邮件通知,所以我读得有点晚了。但确实, numpy.fromstring 成功了!非常感谢
    • 我修改了这段代码来简单地打印出数组。知道如何将这些值转换为频率吗?
    • 知道如何转换回字节数组吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多