我正在为Kivy玩一些Audiostream包的基础知识。
我想制作一个简单的在线输入-滤波器-输出系统,例如,接收麦克风数据,施加带通滤波器,发送到扬声器。
但是,我似乎无法弄清楚麦克风输入的数据格式或如何操作它。 在下面的代码中,buf 是字符串类型,但是我如何从中获取数据以这种方式 [即函数(buf(] 来操作它以执行类似带通滤波器的操作?
该代码目前的功能是将麦克风输入直接发送到扬声器。
谢谢。
from time import sleep
from audiostream import get_input
from audiostream import get_output, AudioSample
#get speakers, create sample and bind to speakers
stream = get_output(channels=2, rate=22050, buffersize=1024)
sample = AudioSample()
stream.add_sample(sample)
#define what happens on mic input with arg as buffer
def mic_callback(buf):
print 'got', len(buf)
#HERE: How do I manipulate buf?
#modified_buf = function(buf)
#sample.write(modified_buf)
sample.write(buf)
# get the default audio input (mic on most cases)
mic = get_input(callback=mic_callback)
mic.start()
sample.play()
sleep(3) #record for 3 seconds
mic.stop()
sample.stop()
缓冲区由需要解释为有符号短的字节组成。您可以使用结构或数组模块来获取值。在您的示例中,您有 2 个通道 (L/R(。假设您想将正确的声道音量降低 20%(即仅针对正确声道的原始声音的 80%(
from array import array
def mic_callback(buf):
# convert our byte buffer into signed short array
values = array("h", buf)
# get right values only
r_values = values[1::2]
# reduce by 20%
r_values = map(lambda x: x * 0.8, r_values)
# you can assign only array for slice, not list
# so we need to convert back list to array
values[1::2] = array("h", r_values)
# convert back the array to a byte buffer for speaker
sample.write(values.tostring())