gpt4 book ai didi

audio - Kivy/Audiostream 麦克风输入数据格式

转载 作者:行者123 更新时间:2023-12-03 00:40:08 26 4
gpt4 key购买 nike

我正在研究 Kivy 的 Audiostream 包的一些基础知识。

我想制作一个简单的在线输入-过滤-输出系统,例如,接收麦克风数据,施加带通滤波器,发送到扬声器。

但是,我似乎无法弄清楚麦克风输入的数据格式或如何操作它。在下面的代码中, buf 是字符串类型,但是我怎样才能从中获取数据以以这种方式对其进行操作 [即function(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()

最佳答案

缓冲区由需要解释为有符号短字节的字节组成。您可以使用 struct 或 array模块获取值(value)。在您的示例中,您有 2 个 channel (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())

关于audio - Kivy/Audiostream 麦克风输入数据格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35443842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com