2009-12-20 8 views
43

ग्रीटिंग्स,पाइथन में माइक्रोफ़ोन से ध्वनि इनपुट कैसे प्राप्त करें, और इसे फ्लाई पर संसाधित करें?

मैं पाइथन में एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो हर बार माइक्रोफोन में टैप प्राप्त करने पर एक स्ट्रिंग मुद्रित करेगा। जब मैं 'टैप' कहता हूं, मेरा मतलब है कि अचानक जोर से शोर या कुछ समान होता है।

मैं अतः में खोज की है और इस पोस्ट पाया: Recognising tone of the audio

मुझे लगता है कि PyAudio पुस्तकालय मेरी जरूरतों फिट होगा, लेकिन मैं काफी यकीन है कि कैसे बनाने के लिए मेरा कार्यक्रम एक ऑडियो संकेत के लिए प्रतीक्षा (वास्तविक समय माइक्रोफोन निगरानी) नहीं हूँ, और जब मुझे यह पता चला कि इसे कैसे संसाधित किया जाए (क्या मुझे फूरियर ट्रांसफॉर्म का उपयोग करने की आवश्यकता है जैसे इसे उपरोक्त पोस्ट में निर्देशित किया गया था)?

किसी भी मदद के लिए अग्रिम धन्यवाद, जो आप मुझे दे सकते हैं।

+1

यहां भी चर्चा की गई: http://stackoverflow.com/questions/193789/microphone-access-in-python –

उत्तर

33

यदि आप LINUX का उपयोग कर रहे हैं, तो आप pyALSAAUDIO का उपयोग कर सकते हैं। विंडोज़ के लिए, हमारे पास PyAudio है और SoundAnalyse नामक लाइब्रेरी भी है।

मैं लिनक्स here के लिए एक उदाहरण पाया:

#!/usr/bin/python 
## This is an example of a simple sound capture script. 
## 
## The script opens an ALSA pcm for sound capture. Set 
## various attributes of the capture, and reads in a loop, 
## Then prints the volume. 
## 
## To test it out, run it and shout at your microphone: 

import alsaaudio, time, audioop 

# Open the device in nonblocking capture mode. The last argument could 
# just as well have been zero for blocking mode. Then we could have 
# left out the sleep call in the bottom of the loop 
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE,alsaaudio.PCM_NONBLOCK) 

# Set attributes: Mono, 8000 Hz, 16 bit little endian samples 
inp.setchannels(1) 
inp.setrate(8000) 
inp.setformat(alsaaudio.PCM_FORMAT_S16_LE) 

# The period size controls the internal number of frames per period. 
# The significance of this parameter is documented in the ALSA api. 
# For our purposes, it is suficcient to know that reads from the device 
# will return this many frames. Each frame being 2 bytes long. 
# This means that the reads below will return either 320 bytes of data 
# or 0 bytes of data. The latter is possible because we are in nonblocking 
# mode. 
inp.setperiodsize(160) 

while True: 
    # Read data from device 
    l,data = inp.read() 
    if l: 
     # Return the maximum of the absolute value of all samples in a fragment. 
     print audioop.max(data, 2) 
    time.sleep(.001) 
+0

तो PyAudio (http://people.csail.mit.edu/hubert/pyaudio/ पर एक नज़र डालें) ;-) – jbochi

5

... और जब मुझे मिल गया एक यह कैसे संसाधित करने के लिए (मैं फूरियर रूपांतरण का उपयोग करने की आवश्यकता है जैसे कि यह ऊपर पोस्ट में निर्देश दिया गया था) ?

यदि आप "टैप" चाहते हैं तो मुझे लगता है कि आप आवृत्ति से अधिक आयाम में रूचि रखते हैं। इसलिए फूरियर ट्रांसफॉर्म शायद आपके विशेष लक्ष्य के लिए उपयोगी नहीं हैं। आप शायद इनपुट के अल्पावधि (10 एमएस) आयाम का एक चलाना माप बनाना चाहते हैं, और यह पता लगाना चाहिए कि यह अचानक एक निश्चित डेल्टा द्वारा बढ़ता है। आप के मापदंडों धुन करने की आवश्यकता होगी:

  • "अल्पकालिक" आयाम माप है क्या
  • क्या डेल्टा में वृद्धि आप
  • के लिए देखो कितनी जल्दी डेल्टा परिवर्तन होने चाहिए है

हालांकि मैंने कहा कि आप आवृत्ति में रूचि नहीं रखते हैं, तो आप विशेष रूप से कम और उच्च आवृत्ति घटकों को फ़िल्टर करने के लिए पहले कुछ फ़िल्टरिंग करना चाहेंगे। इससे आपको कुछ "झूठी सकारात्मक" से बचने में मदद मिल सकती है। आप इसे एफआईआर या आईआईआर डिजिटल फिल्टर के साथ कर सकते हैं; फूरियर जरूरी नहीं है।

+1

हां, मैंने जो किया वह ऑडियोप.मैक्स (डेटा, 2) ले रहा था और पिछले मान (पिछले पुनरावृत्ति से) के साथ अपना मान बदल सकता था। इस तरह से मैं पता लगा सकता हूं कि अचानक वृद्धि हुई है या नहीं। और यह ठीक काम करता है! आप सभी को धन्यवाद! :-) – Alex

संबंधित मुद्दे