War*_*olz 1 controls volume pyaudio
我目前正在 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))
Run Code Online (Sandbox Code Playgroud)
我想检查音量以获得这样的结果:
data = stream.read(CHUNK)
if data.volume > 20%:
self.conn.sendVoice(data)
Run Code Online (Sandbox Code Playgroud)
这样我就可以避免发送无用的数据和备用连接/提高性能。(另外,我正在寻找某种压缩,但我想我将不得不在另一个主题中询问它)。
它可以使用均方根 (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 )
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用audioop查找 rms:
data = stream.read(CHUNK)
rms = audioop.rms(data,2)
Run Code Online (Sandbox Code Playgroud)
现在,如果您愿意,您可以转换rms
为decibel
比例decibel = 20 * log10(rms)