将多通道 PyAudio 转换为 NumPy 数组

2023-12-26

我能找到的所有例子都是单声道的,CHANNELS = 1。如何使用 PyAudio 中的回调方法读取立体声或多声道输入并将其转换为 2D NumPy 数组或多个 1D 数组?

对于单声道输入,类似这样的工作:

def callback(in_data, frame_count, time_info, status):
    global result
    global result_waiting

    if in_data:
        result = np.fromstring(in_data, dtype=np.float32)
        result_waiting = True
    else:
        print('no input')

    return None, pyaudio.paContinue

stream = p.open(format=pyaudio.paFloat32,
                channels=1,
                rate=fs,
                output=False,
                input=True,
                frames_per_buffer=fs,
                stream_callback=callback)

但不适用于立体声输入,result数组的长度是两倍,所以我假设通道是交错的或其他什么,但我找不到这方面的文档。


它似乎是逐个样本交错的,左通道在前。当左声道输入有信号且右声道输入静音时,我得到:

result = [0.2776, -0.0002,  0.2732, -0.0002,  0.2688, -0.0001,  0.2643, -0.0003,  0.2599, ...

因此,要将其分离为立体声流,请重新整形为 2D 数组:

result = np.fromstring(in_data, dtype=np.float32)
result = np.reshape(result, (frames_per_buffer, 2))

现在要访问左通道,请使用result[:, 0],对于右通道,使用result[:, 1].

def decode(in_data, channels):
    """
    Convert a byte stream into a 2D numpy array with 
    shape (chunk_size, channels)

    Samples are interleaved, so for a stereo stream with left channel 
    of [L0, L1, L2, ...] and right channel of [R0, R1, R2, ...], the output 
    is ordered as [L0, R0, L1, R1, ...]
    """
    # TODO: handle data type as parameter, convert between pyaudio/numpy types
    result = np.fromstring(in_data, dtype=np.float32)

    chunk_length = len(result) / channels
    assert chunk_length == int(chunk_length)

    result = np.reshape(result, (chunk_length, channels))
    return result


def encode(signal):
    """
    Convert a 2D numpy array into a byte stream for PyAudio

    Signal should be a numpy array with shape (chunk_size, channels)
    """
    interleaved = signal.flatten()

    # TODO: handle data type as parameter, convert between pyaudio/numpy types
    out_data = interleaved.astype(np.float32).tostring()
    return out_data
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多通道 PyAudio 转换为 NumPy 数组 的相关文章

随机推荐

  • 使用 swiftmailer 在 symfony 2 中通过 smtp.gmail.com 发送邮件

    我在使用 gmail 从 xampp 本地主机发送邮件时遇到问题 经过很长一段时间我终于成功了 我正在与大家分享 如果我错了 需要适当的解决方案 在你的 symfony 2 的 config yml 中写下这些 swiftmailer di
  • mysqli_multi_query 是异步的吗?

    databases array path Path To Directory main link mysqli connect localhost USERNAME PASSWORD files scandir path ignore fi
  • codeSandBox (React/Node) 的 Http 请求错误

    我在 CodeSandBox StackBlitz 等在线 IDE 中遇到奇怪的错误 我做了一个示例 http 请求 使用 axios 但使用 fetch 或其他问题是相同的 并尝试在控制台中打印响应 我在前端使用 React 在后端使用
  • 在 foreach 循环外部使用 foreach 循环的变量

    我有一个 foreach 循环 我在循环内创建了一个字符串 但我想在循环外使用 var 这可能吗 List
  • .NET版本和C#版本之间的关系? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何确定可以针对特定 NET Framework 版本使用哪个版本的 C 我读过了 https sta
  • Git 精选语法和合并分支

    所以我之前已经做过无数次樱桃挑选 看来我现在必须在生活中失败 我正在尝试从一个分支挑选到另一个分支 这应该很容易 但是我收到了关于它是合并的错误 但是没有给出 m 吗 git cherry pick a8c5ad438f6173dc34f6
  • Mono无法打开sqlite数据库

    我正在尝试对 sqlite v3 数据库进行非常基本的连接 并且我正在使用 monodevelop 3 0 和 Mono 2 10 但无法连接到数据库 我可以让应用程序创建数据库 但随后它尝试连接到数据库时立即失败 有什么建议么 我从不同的
  • 查找可点击的元素

    有没有办法找到用 click 或 live click 指定的所有可点击元素 如果单击任何此类元素 我想执行一些操作 container bind click function event actions 这个捕获所有点击 Thanks 这
  • 如何使用时区偏移格式化 LocalDateTime

    我尝试这样做 ZoneOffset zoneOffset ZoneOffset ofHours 3 DateTimeFormatter fmt DateTimeFormatter ofPattern HH mm ss LocalDateTi
  • 如何确定我的 iOS 设备是否有手电筒?

    在我的应用程序中 我可以选择手电筒 然而 只有 iPhone 4 和 iPhone 4S 有手电筒灯 其他设备没有手电筒灯 如何找到当前设备型号 请帮我 提前致谢 您不应使用设备型号作为是否存在某项功能的指示符 相反 请使用 API 来准确
  • blur.js 尝试请求“none”并且 div 未扩展 100%

    我正在尝试使用http blurjs com http blurjs com 模糊标题栏的标题图像的背景 然而 它给了我一个有趣的错误 我似乎无法追踪 这可能与主要代码和兼容性有关 但我不确定 http jordan rave5 com t
  • 在 Numpy(或 Scipy)中计算斜率

    我正在尝试找到使用 Numpy 和 Scipy 计算斜率的最快 最有效的方法 我有一组由三个 Y 变量和一个 X 变量组成的数据集 我需要计算它们各自的斜率 例如 我可以轻松地一次一行执行此操作 如下所示 但我希望有一种更有效的方法来执行此
  • 按下 iOS swift 后更改 UIBarButtonItem 图标

    In the viewDidload方法 我声明了一个按钮并设置了 RightBarButton let btnFavourite UIButton frame CGRectMake 0 0 30 30 btnFavourite addTa
  • 找不到任何与 com.google.android.gms 匹配的版本:strict-version-matcher-plugin:[15.0.0, 16.0.0)

    项目一直运行良好 直到前两天突然出现错误 我不知道如何解决它 因为我已经做了我能做的一切 包括重新安装 android studio 和 gradle 无法解析配置 app debugCompileClasspath 的所有文件 找不到与
  • Array.push 返回推送值?

    是否有任何实质性原因需要修改Array push 返回推送的对象而不是新数组的长度可能是一个坏主意 我不知道这是否已经被提议或询问过 谷歌搜索只返回了大量与当前功能相关的问题Array push 这是此功能的示例实现 请随意更正它 func
  • ChildNode 类型上不存在属性“tagName”[Typescript]

    我正在从父节点循环子节点 我想访问子节点的 tagName 但错误是 tagName 在类型 ChildNode 上不存在 const contentParsed new DOMParser parseFromString content
  • 创建 LocalDB 以从 Visual Studio SQL 项目进行测试

    我正在尝试为我的项目创建集成测试 我需要测试一个通过存储库调用存储过程的控制器 应在每次运行某些范围的测试时创建一个空数据库 所以我将实施以下步骤 Create LocalDB 运行一些预脚本 以添加测试数据 Run test 运行一些后脚
  • GIMP的图层合成/混合方法

    在我寻求为 Matlab 中的图像混合工具添加 Alpha 功能时 我遇到了一些障碍 其中 我一直在使用these http ssp impulsetrain com porterduff html links http www adobe
  • 显示一个 div,单击时隐藏所有其他 div

    我有一个简单的图像 视频库 我想用 jQuery 制作动画 我想要做的就是 当有人点击链接时 big具有相同ID的div被设置为display block opacity 1所有其他 div 都设置为display none opacity
  • 将多通道 PyAudio 转换为 NumPy 数组

    我能找到的所有例子都是单声道的 CHANNELS 1 如何使用 PyAudio 中的回调方法读取立体声或多声道输入并将其转换为 2D NumPy 数组或多个 1D 数组 对于单声道输入 类似这样的工作 def callback in dat