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

简介

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

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

安装

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

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

使用

CoreRecorder

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

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

from rcaudio import CoreRecorder
CR = CoreRecorder(
        time = 10, #How much time to record
        sr = 1000 #sample rate
        )
CR.start()
while True:
    if not CR.buffer.empty():
        x = CR.buffer.get()
        print('*'*int(abs(x)))

SimpleRecorder

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

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

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

Analyzer

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

import time
from rcaudio import SimpleRecorder,VolumeAnalyzer

SR = SimpleRecorder()
VA = VolumeAnalyzer(rec_time = 1)
SR.register(VA)
SR.start()
while True:
    print("VOLUME : ",VA.get_volume())
    time.sleep(1)
SR.stop()
SR.join()

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

SR = SimpleRecorder(sr = 20000)
BA = BeatAnalyzer(rec_time = 15, initial_bpm = 120, smooth_ratio = .8)
SR.register(BA)
SR.start()
while True:
    print(BA.block_until_next_beat())
SR.stop()
SR.join()

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

SR = SimpleRecorder(sr = 20000)
BA = BeatAnalyzer(rec_time = 15, initial_bpm = 120, smooth_ratio = .8)
VA = VolumeAnalyzer(rec_time = 1)
SR.register(BA)
SR.register(VA)
SR.start()
low_volume_count = 0
while True:
    v = VA.get_volume()
    if v < 50:
        low_volume_count += 1
    if low_volume_count > 4:
        break
SR.stop()
SR.join()
如果你需要自定义音频特征的提取函数,不妨试试重写FeatureAnalyzer 的data_process 成员函数(其传入一个一维数组表示特定时间段的音频原始数据,返回这段时见的特征)。 默认的data_process 函数计算了过零率。
SR = SimpleRecorder(sr = 1000)
FA = FeatureAnalyzer(refresh_time = 1)
SR.register(FA)
SR.start()
cpos = 0
while True:
	if len(FA.result) > cpos:
		print(FA.result[cpos])
		cpos += 1
	time.sleep(.01)

注意事项

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

最后

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

《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’
    请问这是什么情况?怎样解决?期待您的回复。

mhy12345进行回复 取消回复

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

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