2011-04-16 133 views
5

我可以使用GStreamer(或其他Linux兼容的聲音庫)檢測麥克風吹氣嗎?使用GStreamer(或其他庫)檢測麥克風吹氣

我可以瞭解聲音的一些信息這樣做:

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() 

我用這個來檢測鼓掌,但我不知道我是否可以使用這些信息來檢測不吹我的電腦迷吹說。另外,我不知道是否有另一種方法可以用GStreamer或其他Linux兼容的聲音庫來分析聲音。

回答

3

你需要看比音頻層面更多的區別吹和言。首先,考慮到大多數語音由高於80Hz左右的音頻組成,而吹在麥克風上會產生大量低頻隆隆聲。所以:如果你想堅持使用gstreamer,也許可以嘗試使用「audiocheblimit」過濾器在測量聲級之前低通聲音。 (喜歡的東西audiocheblimit mode=low-pass cutoff=40 poles=4

就個人而言,我的做法會更喜歡:

  1. 記錄原始音頻的東西中的python-alsaaudio
  2. 計算聲音塊的傅立葉變換使用numpy的
  3. 總結低頻(20-40Hz,也許)的幅度,如果這個值足夠大,則觸發。

如果這沒有奏效,那麼我會尋找更聰明的檢測算法。這種方法(alsa + numpy)非常靈活,但比gstreamer方法複雜一點。

編輯:我只注意到gstreamer還有一個「頻譜」元素,它將返回傅里葉變換。

0

答案和操作碼(sample pipe

#!/usr/bin/env python 

import pygtk 
pygtk.require('2.0') 
import gtk, gst, time 

class HelloWorld: 

    def delete_event(self, widget, event, data=None): 
     print "delete event occurred" 
     return False 

    def destroy(self, widget, data=None): 
     print "destroy signal occurred" 
     gtk.main_quit() 

    def __init__(self): 
     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.connect("delete_event", self.delete_event) 
     self.window.connect("destroy", self.destroy) 
     self.window.set_border_width(2) 
     #self.window.set_size_request(600, 483) 

     """ Play """ 
     self.vbox = gtk.VBox(False, 2) 
     self.vbox.set_border_width(0) 

     self.hbox = gtk.HBox() 
     self.hlpass = gtk.Entry() 
     self.hlpass.set_text("low-pass") 
     self.hbox.pack_start(gtk.Label("High/Low-pass: "), False, False, 0) 
     self.hbox.pack_start(self.hlpass, False, False, 0) 
     self.vbox.add(self.hbox) 

     self.hbox = gtk.HBox() 
     self.cutoff = gtk.Entry() 
     self.cutoff.set_text("40") 
     self.hbox.pack_start(gtk.Label("Cutoff: "), False, False, 0) 
     self.hbox.pack_start(self.cutoff, False, False, 0) 
     self.vbox.add(self.hbox) 

     self.hbox = gtk.HBox() 
     self.poles = gtk.Entry() 
     self.poles.set_text("4") 
     self.hbox.pack_start(gtk.Label("Poles: "), False, False, 0) 
     self.hbox.pack_start(self.poles, False, False, 0) 
     self.vbox.add(self.hbox) 

     self.hbox = gtk.HBox() 
     self.button = gtk.Button("High-Pass") 
     self.button.connect("clicked", self.change, None) 
     self.hbox.pack_start(self.button, False, False, 0) 
     self.vbox.add(self.hbox) 

     self.window.add(self.vbox) 
     self.window.show_all() 

    def main(self): 
     self.gst() 
     gtk.main() 

    def gst(self): 
     test = """ 
     alsasrc device=hw:0 ! audioconvert ! audioresample ! audiocheblimit mode=low-pass cutoff=40 poles=4 name=tuneit ! level ! autoaudiosink 
     """ 
     self.pipeline = gst.parse_launch(test) 
     self.bus = self.pipeline.get_bus() 
     self.bus.add_signal_watch() 
     self.bus.connect('message', self.playerbinMessage) 
     self.pipeline.set_state(gst.STATE_PLAYING) 

    def playerbinMessage(self,bus, message): 
    if message.type == gst.MESSAGE_ELEMENT: 
     struct = message.structure 
     if struct.get_name() == 'level': 
     print struct['peak'][0], struct['decay'][0], struct['rms'][0] 
     #time.sleep(1) 

    def change(self, widget, data=None): 
    data = [self.hlpass.get_text(), self.cutoff.get_text(), self.poles.get_text()] 
    print data[0], data[1], data[2] 
    self.audiocheblimit = self.pipeline.get_by_name('tuneit') 
    self.audiocheblimit.props.mode = data[0] 
    self.audiocheblimit.props.cutoff = int(data[1]) 
    self.audiocheblimit.props.poles = int (data[2]) 

if __name__ == "__main__": 
    hello = HelloWorld() 
    hello.main() 

輸出低通的只是一個組合:

-20.9227157774 -20.9227157774 -20.953279177 
-20.9366239523 -20.9227157774 -20.9591815321 
-20.9290995367 -20.9227157774 -20.9601319723 

輸出高通:

-51.2328030138 -42.8335117509 -62.2730163502 
-51.3932079772 -43.3559607159 -62.2080540769 
-52.1412276733 -43.8784096809 -62.9151309943 

編輯:

high-pass = speech and taking all audio 
low-pass = some audio like when you are talking near the microphone