如何实时处理音频流

2024-01-05

我有一个运行最新 jessie 的树莓派 3 的设置,其中安装了所有更新,其中我提供了一个 A2DP 蓝牙接收器,我可以在其中连接手机播放一些音乐。

通过pulseaudio,源(电话)被路由到alsa 输出(接收器)。这相当有效。

我现在想使用 python3.4 来分析音频流librosa https://github.com/librosa/librosa我发现了一个有希望的例子pyaudio https://people.csail.mit.edu/hubert/pyaudio/docs/#example-callback-mode-audio-i-o它被调整为使用脉冲音频输入(它神奇地工作,因为它是默认的)而不是 wavfile:

"""PyAudio Example: Play a wave file (callback version)."""

import pyaudio
import wave
import time
import sys
import numpy

# instantiate PyAudio (1)
p = pyaudio.PyAudio()

# define callback (2)
def callback(in_data, frame_count, time_info, status):
    # convert data to array
    data = numpy.fromstring(data, dtype=numpy.float32)
    # process data array using librosa
    # ...
    return (None, pyaudio.paContinue)

# open stream using callback (3)
stream = p.open(format=p.paFloat32,
                channels=1,
                rate=44100,
                input=True,
                output=False,
                frames_per_buffer=int(44100*10),
                stream_callback=callback)

# start the stream (4)
stream.start_stream()

# wait for stream to finish (5)
while stream.is_active():
    time.sleep(0.1)

# stop stream (6)
stream.stop_stream()
stream.close()
wf.close()

# close PyAudio (7)
p.terminate()

现在,虽然数据流原则上工作,但调用stream_callback 时存在延迟(缓冲区长度)。由于文档声明

请注意,PyAudio 在单独的线程中调用回调函数。

我假设在回调工作时,缓冲区不断填充主线程。当然,填充缓冲区会有一个初始延迟,之后我希望获得同步流。

我需要缓冲区中有较长的部分(请参阅frames_in_buffer),以便 librosa 能够正确执行分析。

这样的事怎么可能呢?这是树莓派 ARM 软件端口的限制吗?

我找到了其他答案,但是they https://stackoverflow.com/a/32161871/875020 use the https://stackoverflow.com/a/9235752/875020阻塞I/O https://stackoverflow.com/a/24985016/875020。我如何将其包装到一个线程中,以便 librosa 分析(可能需要一些时间)不会阻止缓冲区填充?

这个博客 http://bastibe.de/2012-11-02-real-time-signal-processing-in-python.html似乎与 cython 对抗性能问题,但我不认为延迟是性能问题。Or https://stackoverflow.com/a/41563752/875020 might it http://freshfoo.com/posts/pulseaudio_monitoring/?其他人似乎需要一些ALSA 调整 https://stackoverflow.com/a/39342170/875020但这在使用pulseaudio时会有帮助吗?

谢谢,任何意见表示赞赏!


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实时处理音频流 的相关文章

随机推荐

  • 如何在 Service Worker 中动态加载 Javascript 文件?

    我无法使用任何涉及创建
  • 为列表视图列设置不同的对齐方式

    我在绘制列左对齐或居中对齐的列表视图时遇到问题 我查看了在这里或其他论坛上找到的一些解决方案 但它们似乎都适用所有列 https stackoverflow com questions 4883182 content alignment f
  • 简化 vb.net 中的列表初始化

    有哪些选项可以简化List初始化以消除重复New MyObject With以及参数名称 例如Value1 我需要创建 50 个对象的列表 因此有很多重复的 可能不必要的代码 我使用最新的 Visual Studio 2019 16 2 3
  • 事件时间序列的数据库建议

    对于我的一个项目 我必须将大量事件集合输入数据库以供以后处理 并且我正在尝试确定哪个 DBMS 最适合我的目的 I have 目前大约有 400 000 000 个离散事件 数据库中将存储约 600 GB 的数据 这些事件有多种形式 但我估
  • 在c中创建我自己的memset函数

    这是原型 void memset void s int c size t n 首先 我不确定是否必须返回某些内容 因为当我使用 memset 时 我会这样做 memset str a 5 代替 str memset str a 5 这是我的
  • saveRDS 问题

    我在重新保存对象时表现出了 saveRDS 的奇怪行为 这是一个可重现的示例 df lt data frame a c 1 2 b c 3 4 saveRDS df test rds readRdsFile lt readRDS test
  • import React 和 import { Component } 语法之间的区别[重复]

    这个问题在这里已经有答案了 假设我们正在使用 React 和 ES6 我们将 React 和 Component 导入为 import React from react import Component from react 为什么语法不同
  • 使用ansible添加交换内存

    我正在开发一个项目 其中需要在我的服务器上拥有交换内存 以避免某些 python 长时间运行的进程耗尽内存 并第一次意识到我的 ubuntu vagrant box 和 AWS ubuntu 实例还没有交换内存设置 In https git
  • 如何解决语法错误:await 仅在异步函数中有效?

    我编写了一段代码 使用 Promise 从异步调用返回一些数据 当我尝试执行时 我得到 语法错误等待仅在异步函数中有效 并且我还得到无法代理应用程序请求 错误 连接ECONNREFUSED 我不确定为什么会出现这些错误 我尝试在函数调用之前
  • 显示核心数据:如果属性具有相同的名称,则显示一次

    我查看了许多谓词问题 阅读了文档 但似乎没有什么可以回答我的问题 我有一个名为的核心数据实体材料我有属性category 子类别 and 描述 我有三个UITableViewControllers在每个我想使用谓词来显示如下 TableVi
  • 从 Web API .NET Core get 操作返回字符串

    我有一个 get 操作 我想从中返回一个字符串 一个例子是 000875 当我从完整的 NET Web API 控制器中的控制器返回此字符串时 它的格式如下 Property 000875 当我在转换后的 NET Core 控制器中返回字符
  • webpack 对 *.js 的意外修改

    我是 webpack 和类似工具的新手 我想重新组织我的项目 目前我所有的 JS 代码都位于 App js 中 因此 在将其拆分为模块并进行改进之前 我只想设置复制它的工作流程 这是 webpack config js 的内容 const
  • 将ASP.Net Core 2.1preview2网站发布到本地IIS MSB3030 *.PrecompiledViews.dll

    Update 1 根据 Priyesh Kumar 的反馈 我使用了网站根文件夹中的以下命令 网站带有 csproj 的命令 这有效 然后我将 win10 x64 内容文件复制到 c www sigex com 中 dotnet publi
  • 在多阶段 docker 构建中使用变量

    我想在多阶段 docker 构建中使用变量 如同这个问题 https stackoverflow com questions 52904847 在撰写本文时尚未得到答复 我的具体用例是在builder阶段并保存目录 这是在变量中完成的 并在
  • React:创建 onClick HOC 而不使用额外的

    我想避免手动添加onClick我的自定义组件的属性 为此 我考虑了一个名为的高阶组件WithClick这将用集成的组件包裹我的组件onClick财产 我面临的问题是 为了包装它 我必须使用额外的 div div 标签来访问事件属性 这个标签
  • 如何以编程方式检测 ensemble 客户端中的哪个服务器连接到?

    如何以编程方式检测客户端连接到 ZooKeeper 集合中的哪台服务器 我正在使用阿帕奇策展人 http curator apache org API 和我正在通过注册监听连接状态变化连接状态监听器 https curator apache
  • ASP.NET WebAPI 中的模拟和异步

    Update 2 这个问题最初是 模仿可以与 Web API 一起使用吗 这个问题的问题是 是的 确实如此 但问题不在于 Web API 而在于模仿本身 问题描述如下 但现在我想告诉其他人解决方案 我的控制器是异步的 我错误的前提是模拟线程
  • 如何使用 C# 检查打印机是否已安装并准备就绪?

    如何使用 NET 3 5 和 Visual Studio 2008 在 C 中以编程方式检查打印机是否已安装 如果有 如何检查它是否已打开并准备好使用 提前致谢 此代码片段将检索有关已安装打印机的信息 using System Drawin
  • 读取或转换 word .doc 文件 iOS

    iOS 上的其他应用程序如何读取和写入 Word 文档 我看到其他一些与此相关的问题 并且接受的答案都是 这是不可能完成的 我不想只显示 Word 文档 我想阅读它及其格式 其他应用程序是如何做到这一点的 他们是否使用微软发布的发布标准自己
  • 如何实时处理音频流

    我有一个运行最新 jessie 的树莓派 3 的设置 其中安装了所有更新 其中我提供了一个 A2DP 蓝牙接收器 我可以在其中连接手机播放一些音乐 通过pulseaudio 源 电话 被路由到alsa 输出 接收器 这相当有效 我现在想使用