2014-07-26 13 views
10

में पढ़ना रीयल-टाइम ऑडियो को numpy array में कैसे पढ़ सकता है और प्लॉट करने के लिए matplotlib का उपयोग कर सकता है?रीयलटाइम ऑडियो डेटा को numpy array

अभी मैं wav फ़ाइल पर ऑडियो रिकॉर्ड कर रहा हूं, फिर इसे scikits.audiolab.wavread का उपयोग करके किसी सरणी में पढ़ने के लिए। क्या कोई तरीका है कि मैं इसे रीयलटाइम में सीधे कर सकता हूं?

उत्तर

13

आप ऑडियो रिकॉर्ड करने के लिए PyAudio का उपयोग कर सकते हैं और np.fromstring का उपयोग इसे एक numpy सरणी में बदलने के लिए कर सकते हैं।

import pyaudio 
import numpy as np 
from matplotlib import pyplot as plt 

CHUNKSIZE = 1024 # fixed chunk size 

# initialize portaudio 
p = pyaudio.PyAudio() 
stream = p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=CHUNKSIZE) 

# do this as long as you want fresh samples 
data = stream.read(CHUNKSIZE) 
numpydata = np.fromstring(data, dtype=np.int16) 

# plot data 
plt.plot(numpydata) 
plt.show() 

# close stream 
stream.stop_stream() 
stream.close() 
p.terminate() 
+0

धन्यवाद। मैंने अपने समाधान में 'pyudio' के बजाय 'alsaaudio' का उपयोग किया है। क्या दोनों के बीच कोई अंतर है? –

+0

मुझे लगता है कि 'अलसाउडियो' केवल लिनक्स है जबकि 'पायउडियो' ['पोर्टऑडियो '] प्रदान करता है (http://www.portaudio.com/) -बिंदिंग और कई प्लेटफार्मों पर काम करता है। –

8

PyAudio नामक एक लाइब्रेरी है। आप इसे रीयल-टाइम में रिकॉर्ड करने के लिए उपयोग कर सकते हैं। इसके अलावा numpy.fromstring() और numpy.hstack() की सहायता से, आप वांछित आउटपुट प्राप्त कर सकते हैं। कृपया ध्यान दें कि निम्न स्निपेट MONO-CHANNEL के लिए है।

import pyaudio 
import numpy 

RATE=16000 
RECORD_SECONDS = 2.5 
CHUNKSIZE = 1024 

# initialize portaudio 
p = pyaudio.PyAudio() 
stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, frames_per_buffer=CHUNKSIZE) 

frames = [] # A python-list of chunks(numpy.ndarray) 
for _ in range(0, int(RATE/CHUNKSIZE * RECORD_SECONDS)): 
    data = stream.read(CHUNKSIZE) 
    frames.append(numpy.fromstring(data, dtype=numpy.int16)) 

#Convert the list of numpy-arrays into a 1D array (column-wise) 
numpydata = numpy.hstack(frames) 

# close stream 
stream.stop_stream() 
stream.close() 
p.terminate() 

यह एक परीक्षण कोड है। यह आकर्षण के रूप में काम करना चाहिए। यह जांचने के लिए कि आपका रिकॉर्ड किया गया डेटा numpydata में सही तरीके से उपलब्ध है या नहीं, आप पिछले कोड के बाद यह निम्न स्निपेट जोड़ सकते हैं।

import scipy.io.wavefile as wav 
wav.write('out.wav',RATE,numpydata) 

ये लाइनें लिखेंगे अपने "out.wav" में numpydata। डेटा जांचने के लिए फ़ाइल चलाएं।

पीएस: यह स्टैक ओवरफ्लो में मेरी पहली प्रतिक्रिया है। आशा करता हूँ की ये काम करेगा।

+4

आपकी पहली पोस्ट के लिए बुरा नहीं :) – deW1

+2

@ deW1 मेरे उत्तर को संशोधित करने और शर्तों को हाइलाइट करने के लिए धन्यवाद। :) – StitchesGuy90

+0

@ StitchesGuy90 मैं आने वाले ऑडियो डेटा को साजिश करना चाहता हूं ताकि मुझे ऑडियो का वास्तविक समय ग्राफ मिल सके। – Step