我目前正在python中开发一个VOIP工具作为客户端服务器。我的问题是,我正在发送Pyaudio输入流,即使没有声音也是如此(好吧,当没有人说话或没有噪音时,也会发送数据):
CHUNK = 1024
p = pyaudio.PyAudio()
stream = p.open(format = pyaudio.paInt16,
channels = 1,
rate = 44100,
input = True,
frames_per_buffer = CHUNK)
while 1:
self.conn.sendVoice(stream.read(CHUNK))
我想查看音量来得到这样的东西:
data = stream.read(CHUNK)
if data.volume > 20%:
self.conn.sendVoice(data)
这样我就可以避免发送无用的数据和备用连接/提高性能。 (另外,我正在寻找某种压缩,但我想我将不得不在另一个主题中提出这个问题。)
答案 0 :(得分:3)
可以使用root mean square (RMS)完成。
使用python构建自己的rms函数的一种方法是:
def rms( data ):
count = len(data)/2
format = "%dh"%(count)
shorts = struct.unpack( format, data )
sum_squares = 0.0
for sample in shorts:
n = sample * (1.0/32768)
sum_squares += n*n
return math.sqrt( sum_squares / count )
另一个选择是使用audioop来查找rms:
data = stream.read(CHUNK)
rms = audioop.rms(data,2)
现在,如果您愿意,可以将rms
转换为decibel
比例decibel = 20 * log10(rms)