【问题标题】:How do I use the NumPy array returned from sounddevice Stream class to perform additional processing?如何使用 sounddevice Stream 类返回的 NumPy 数组来执行额外的处理?
【发布时间】:2018-11-24 19:08:35
【问题描述】:

我正在使用 python 库 sounddevice 进行一些音频处理。当我使用 Stream 类将从输入设备(麦克风)收集的输入数据传递到输出时,回调函数有一个表示声音数据的 NumPy 数组:

def callback(indata, outdata, frames, time, status):
    outdata[:] = indata

indata 是一个包含浮点数数组的 NumPy 数组。这些花车代表什么?如何对这些数据执行时间拉伸或音高转换?

【问题讨论】:

    标签: python numpy portaudio


    【解决方案1】:

    首先,警告:如果您想要高效可靠的实时音频处理,Python 可能不是一个很好的选择(因为它是一种解释性语言,它使用垃圾收集,当然还有臭名昭著的 GIL)。

    如果你还是想使用 Python,有几个库可以用于实时音频信号处理; pyoLibROSA 浮现在脑海中,更多信息可以在 PythonInMusic wiki page 找到。

    现在回答您的实际问题:indata 中的浮点值(默认为 float32)是代表声压的幅度值。 如果有帮助,您也可以将其视为电压。

    请注意,来自声卡的值仅限于从-1.0+1.0 的范围内。当您将输出信号写入outdata 时,您必须注意它们也被限制在此范围内,否则您会听到难看的失真。

    indataoutdata 数组是二维的,其中的列代表音频通道。每一行代表一个时间实例。

    您可能还想阅读我的小page about creating simple audio signals with Python

    时间拉伸/音高转换的实际算法在这里是题外话,如果您需要帮助,可以在https://dsp.stackexchange.com/ 询问。

    【讨论】:

    • 这个答案在范围方面可能不再准确。我刚刚用 sd.rec(44.1khz,float32,2 个通道)记录了一些数据,我得到的是一个 dtype np.float32 的 numpy 数组,但最小值,最大值在 -/+ 1.44 左右。
    • @Toby 我认为你是对的,从-1.0+1.0 的限制并非适用于所有系统,另请参阅github.com/spatialaudio/python-sounddevice/issues/23(这是关于 输出范围,而不是 输入范围)。你碰巧使用Mac吗?如果您有更多详细信息,请告诉我们!
    猜你喜欢
    • 2023-04-01
    • 2021-06-22
    • 1970-01-01
    • 2017-10-22
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多