0

I am working on recording using pyaudio on windows. I am plotting recorded sound using matplotlib.

Recording length is 60 sec.

buffer size is 1024

What i am getting is, while recording, for first few iterations i am getting junk values. After that it starts recording actual sound.

I also found that, even if the MIC is muted, its giving junk values wjen i plot it.

These junk values are affecting result of my computations.

Any idea, why this junk values/sound is getting recorded?? Any quick solution??

Code:

class record(Thread):

def __init__(self):
    #Thread.__init__(self)
    super(record, self).__init__()
    self.lock=threading.Lock()

    self.project=projectutils.getActiveProject()
    self.outfile=self.project['name']+'.wav'
    self.tw=tool.getToolWindow()
    self.duration = 60 #record for 1 second. Pretty long duration don't you think

    self.buffer=1024
    self.pin = pyaudio.PyAudio()
    self.channels=2
    ccare.rate=self.rate=8820
    self.format=pyaudio.paInt16
    self.inStream = self.pin.open(format=self.format, channels=self.channels, rate=self.rate,input=True, frames_per_buffer=self.buffer)
    self.flag=1
    self.out = []
    self.upper_lim = self.rate / self.buffer * self.duration 

def run(self):      
    ccare.val=[]

    x=[]
    if not self.inStream:
       return
    self.lock.acquire()
    data = self.inStream.read(self.buffer)
    self.lock.release()

    x=list(struct.unpack("%dh"%(len(data)/2),data))

    self.lock.acquire()
    ccare.val=ccare.val+list(x)
    self.lock.release()
    self.out.append(data)
    for i in xrange(1, self.upper_lim):

        x=[]
        if not self.inStream:
           break
        data = self.inStream.read(self.buffer)
        x=list(struct.unpack("%dh"%(len(data)/2),data))
        self.lock.acquire()
        ccare.val=ccare.val+list(x)
        self.lock.release()
        self.out.append(data)

    if self.inStream:
       self.inStream.stop_stream()
       self.inStream.close()
       self.pin.terminate()
    self.save_file()

Simple Code:

import pyaudio
import wave
import struct
val = []

def record(out_file):
    duration = 60 #record for 1 second. Pretty long duration don't you think
    buffer=1024

    pin = pyaudio.PyAudio()

    channels=2
    rate=8820
    format=pyaudio.paInt16
    inStream = pin.open(format=format, channels=channels, rate=rate,input=True, frames_per_buffer=buffer)

    out = []
    upper_lim = rate / buffer * duration 
    val=[]

    x=[]
    if not inStream:
       return
    data = inStream.read(buffer)

    x=list(struct.unpack("%dh"%(len(data)/2),data))

    val=val+list(x)
    out.append(data)

    for i in xrange(1, upper_lim):
        x=[]
        if not inStream:
           break
        data = inStream.read(buffer)
        x=list(struct.unpack("%dh"%(len(data)/2),data))

        val=val+list(x)
        out.append(data)

    if inStream:
       inStream.stop_stream()
       inStream.close()
       pin.terminate()

The values stored in 'val' variable will be plotted in different thread using matplotlib.

0 Answers0