使用GStreamer(或其他库)检测麦克风上的吹气

Mar*_*rin 5

我可以使用GStreamer(或其他兼容Linux的声音库)检测麦克风上的吹气吗?

我可以得到一些有关声音的信息:

import gtk, gst

def playerbinMessage(bus, message):
    if message.type == gst.MESSAGE_ELEMENT:
        struct = message.structure

        if struct.get_name() == 'level':
            # printing peak, decay, rms
            print struct['peak'][0], struct['decay'][0], struct['rms'][0]

pipeline = gst.parse_launch('pulsesrc ! level ! filesink location=/dev/null')

bus = pipeline.get_bus()
bus.add_signal_watch()
bus.connect('message', playerbinMessage)

pipeline.set_state(gst.STATE_PLAYING)

gtk.main()
Run Code Online (Sandbox Code Playgroud)

我用它来检测鼓掌,但我不知道我是否可以使用这些信息来检测吹气,而不会让我的电脑混淆吹嘘和说话.另外,我不知道是否有另一种方法可以使用GStreamer或其他兼容Linux的声音库来分析声音.

Luk*_*uke 3

区分吹气和讲话时,您需要看的不仅仅是音频电平。首先,考虑到大多数语音都包含高于 80Hz 的音频,而对着麦克风吹气会产生大量低频隆隆声。

所以:如果您想坚持使用 gstreamer,也许可以尝试使用“audiocheblimit”滤波器在测量声音电平之前对声音进行低通处理。(就像是audiocheblimit mode=low-pass cutoff=40 poles=4

就我个人而言,我的方法更像是:

  1. 使用 python-alsaaudio 之类的东西录制原始音频
  2. 使用 numpy 计算声音块的傅立叶变换
  3. 总结低频(20-40Hz,也许)的幅度,并在该值足够大时触发。

如果这不起作用,那么我会寻找更聪明的检测算法。这种方法(alsa+numpy)非常灵活,但比 gstreamer 方法复杂一点。

编辑:我刚刚注意到 gstreamer 还有一个“频谱”元素,它将返回傅里叶变换。