Pyaudio:如何检查音量

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)

这样我就可以避免发送无用的数据和备用连接/提高性能。(另外,我正在寻找某种压缩,但我想我将不得不在另一个主题中询问它)。

ede*_*der 6

它可以使用均方根 (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)

现在,如果您愿意,您可以转换rmsdecibel比例decibel = 20 * log10(rms)