rcaudio:实时录音的音频特征处理库

简介

rcaudio是一个实时的录音,并处理录制的音频的库,使用rcaudio,你可以不用自己编写任何代码,而实现——

  • 获取原始的音频数据
  • 实时监测音量
  • 实时分析录音(歌曲)的节拍,并加以预测

安装

rcaudio是我的第一个放在了pypi.org的工程,因此可以使用pip安装 pip install rcaudio .其中该工程依赖 pyaudio ,倘若出现了无法找到头文件的错误,可直接重装覆盖系统默认的

rcaudio的源码地址为:https://github.com/mhy12345/rcaudio,欢迎push&issue

使用

CoreRecorder

CoreRecorder  是提取原始音频信息的类. 其本身会额外开一个进程,当成员函数 start() 被调用后,录音开始,音频数据会出存在一个队列 CoreRecorder.buffer 中。

如下是一个以字符形式输出录音的波形图的小程序

SimpleRecorder

在多数较为复杂的情况中,我们可以使用 SimpleRecorder ,从效率角度出发,推荐只实例化一次 SimpleRecorder因为绑定了录音部分,所以他会占用掉相当一部分的运行资源。

通过调用 SimpleRecorder 的成员函数 register() ,我们可以将多个 Analyzer 类绑定。

当成员函数 start() 被调用后,录音自动开始,同时起绑定的所有 Analyzer 实例也同时开始运行。

Analyzer

所有继承于 BaseAnalyzer 的类都是一个 Analyzer ,其功能是从原始的音频数据中提取出用户希望的信息。如下例子中,一个 VolumeAnalyzer 用于实时询问音量。

下面例子中,一个 BeatAnalyzer 用于分析节拍并进行预测。(这里的预测会有1~2s的延迟)。 BeatAnalyzer 本质上是通过在当前最后可用的若干 rec_time 时间的数据,提取起节拍信息,进而校准当前的节拍器。校准的具体算法可以参考我的另一篇文章python实现音频节拍的实时识别

多个Analyzer同样可行,比如如下程序在分析节拍的同时,通过音量判断乐曲是否结束。

如果你需要自定义音频特征的提取函数,不妨试试重写 FeatureAnalyzer 的 data_process 成员函数(其传入一个一维数组表示特定时间段的音频原始数据,返回这段时见的特征)。 默认的 data_process 函数计算了过零率。

注意事项

大部分的函数都存在1-2s的延时,个人认为如果不是把所有细节都在实时环境中重写一遍,是很难避免的。在 BeatAnalyzer 中,我使用了很多技巧来让用户看起来好像是事实的,而在 FeatureAnalyzer 如果特征的处理速度太慢,可能这个延时会被无限放大。如果这种情况真的发生,你可以考虑减少采样率sr,或者自己重写一个Analyzer来取舍一些不太重要的步骤。

最后

如果这个工程真的帮助你了的话,不妨给我一个Star哦,你的支持是我的动力!要是有pull request那我就幸福死了ovo

原创文章地址:【rcaudio:实时录音的音频特征处理库】,转载时请注明出处mhy12345.xyz

《rcaudio:实时录音的音频特征处理库》有3个想法

  1. 您好,我是python初学者,用的python2.7,正好在做实时录音并处理的实验,您的文章给了我很大帮助,非常感谢。但是我这里还是出了一点问题,运行您给的多线程程序(在分析节拍的同时,通过音量判断乐曲是否结束)时,出现如下情况:
    No handlers could be found for logger “rcaudio.simple_recorder.SimpleWatcher”
    Exception in thread Thread-4:
    Traceback (most recent call last):
    File “C:\Python27\lib\threading.py”, line 810, in __bootstrap_inner
    self.run()
    File “C:\Python27\lib\site-packages\rcaudio\volume_analyzer.py”, line 22, in run
    while self.start_time is None:
    AttributeError: ‘VolumeAnalyzer’ object has no attribute ‘start_time’
    请问这是什么情况?怎样解决?期待您的回复。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据