基维/音频流麦克风输入数据格式



我正在为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())

最新更新