python声音捕获_在Python中实现实时信号处理如何连续捕获音频?
我计划用Python实现一个类似DSP的信号处理器。它应该通过ALSA捕获音频片段,对其进行处理,然后通过ALSA播放。在
为了开始工作,我写了以下代码(非常简单)。在import alsaaudio
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL)
inp.setchannels(1)
inp.setrate(96000)
inp.setformat(alsaaudio.PCM_FORMAT_U32_LE)
inp.setperiodsize(1920)
outp = alsaaudio.PCM(alsaaudio.PCM_PLAYBACK, alsaaudio.PCM_NORMAL)
outp.setchannels(1)
outp.setrate(96000)
outp.setformat(alsaaudio.PCM_FORMAT_U32_LE)
outp.setperiodsize(1920)
while True:
l, data = inp.read()
# TODO: Perform some processing.
outp.write(data)
问题是,音频“结巴”而不是无间隙。我试着用PCM模式做实验,把它设为PCM_ASYNC或PCM_NONBLOCK,但问题仍然存在。我认为问题是“两个后续调用之间”的样本输入读取()“丢失。在
有没有一种方法可以在Python中“连续地”捕获音频(最好不需要太“特定的”/“非标准”的库)?我希望信号总是“在后台”被捕获到某个缓冲区,从中我可以读取一些“瞬时状态”,而音频则进一步被捕获到缓冲区中,即使是在我执行读取操作的时候。我怎样才能做到这一点?在
即使我使用一个专用的进程/线程来捕获音频,这个进程/线程也至少必须(1)从源读取音频,(2)然后将其放入某个缓冲区(然后“信号处理”进程/线程从中读取)。因此,这两个操作在时间上仍然是连续的,因此样本将丢失。我如何避免这种情况?在
非常感谢你的建议!在
编辑2:现在我让它运行了。在
^{pr2}$
然而,当我甚至对音频数据进行最细微的修改时(例如,注释该行),我会在输出处得到大量噪声和极端失真。似乎我没有正确处理PCM数据。奇怪的是,“液位计”等的输出似乎都有道理。但是,当我稍微偏移它时,输出是完全失真的(但是是连续的)。在
编辑3:我刚发现我的算法(不包括在这里)在我将它们应用于wave文件时起作用。因此,问题实际上似乎归结为ALSA API。在
编辑4:我终于找到了问题。他们是下面的。在
1st-在请求PCM_U32_LE格式时,ALSA悄悄地“退回”到PCM_U8_LE格式,因此我假设每个样本的宽度为4字节,从而错误地解释了数据。当我要求PCM格式时,它能工作。在
第二个-ALSA输出似乎期望以字节为单位的周期大小,尽管它们在规范中明确指出,它应该以帧的形式出现。因此,如果使用32位采样深度,则必须将周期大小设置为输出的四倍。在
第三,即使在Python中(这里有一个“全局解释器锁”),进程也比线程慢。通过更改为线程可以大大降低延迟,因为I/O线程基本上不做任何计算密集型的操作。在
python声音捕获_在Python中实现实时信号处理如何连续捕获音频?相关推荐
- python 时间序列预测_使用Python进行动手时间序列预测
python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...
- python 概率分布模型_使用python的概率模型进行公司估值
python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...
- python selenium 下拉列表_从下拉列表中选择python selenium选项
我试图使用下面的代码使用selenium(python)从网页上的下拉列表中选择一个选项.在from selenium import webdriver from selenium.webdriver ...
- python 语料标注_在python中怎么标记文本?
要运行下面的python程序,必须在系统中安装(NLTK)自然语言工具包. NLTK模块是一个庞大的工具包,旨在帮助您使用整个自然语言处理(NLP)方法. 要安装NLTK,请在终端中运行以下命令.su ...
- python pipeline框架_介绍Python的Django框架中的静态资源管理器django-pipeline
django-pipeline 是一个 Django 下非常方便的静态资源管理 app,尤其是 1.2 版本之后,利用 django-staticfiles 的collectstatic 命令,在开发 ...
- python中立方表示_在Python中表示一个对象的方法
在 Python 中一切都是对象.如果要在 Python 中表示一个对象,除了定义 class 外还有哪些方式呢?我们今天就来盘点一下. 0x00 dict 字典或映射存储 KV 键值对,它对查找.插 ...
- python临床数据_从临床试验中获取数据
我正在开发一个小Python函数来从clinicalTrials.gov中获取数据.从每个研究记录中,我想从中找出研究的目标条件.例如,对于this研究记录,我需要以下内容:conditions = ...
- python注入进程_向进程中注入Python代码
我想把Python代码注入到一个进程中,当它注入时,它似乎会使我的进程崩溃.我没有在我自己的程序中得到任何错误,但目标进程停止工作.被调用的非托管api没有给我任何错误,并且似乎已经正确地执行了它们的 ...
- python创建矩阵_在Python中创建矩阵的Python程序
python创建矩阵 There is no specific data type in Python to create a matrix, we can use list of list to c ...
最新文章
- 【LeetCode】0830.较大分组的位置
- synchronized(this)用法
- Java黑皮书课后题第5章:*5.31(金融应用:计算CD价值)假设你用10 000美元投资一张CD,年利率为5.75%。编写程序,提示由用户输入一个金额数、年获利率、月份数,然后显示一个表格
- AS报Failed to resolve: junit:junit:4.12错误正确的解决方法
- 【Unity】12.2 导航网格寻路简单示例
- MBP清除NVRAM和PRAM
- HTML5 之 Link 标签
- mercury已断开服务器无响应,Mercury水星无线路由器无法上网解决办法 | 192路由网...
- 【分享】品牌平面广告创意过程与思维技巧
- 使用二维码——第三方库ZBar和libqrencode的使用
- SpringBoot海景房出租管理系统+代码讲解
- C++之AStar寻路算法
- 游戏体验之穿越火线手游
- c语言中转义字符efg,C语言试题.docx
- pcie扰码的作用_分享 扰码的作用
- 身体指数bmi流程图_BMI指数事关重大,你家娃合不合格赶紧来对表查!
- 百度绿洲新一代区块链内测开放
- 75.功能测试中重复测试很多,你怎么看待这个问题?
- 毕设一:老年人摔倒检测及报警装置
- “鲁迅说过的话”检索系统上线就查询崩溃