Question

Please do not report this question as a duplicate, because none of the already available Solution working for me, I tested them all

So, I am trying to run a PyAudio sample Recording program in my RaspberryPi model B board, This is the error I am getting,

Traceback (most recent call last):
  File "/home/pi/pyaudio/test/testing.py", line 23, in <module>
    data = stream.read(chunk)
  File "/usr/local/lib/python2.7/dist-packages/pyaudio.py", line 605, in read
    return pa.read_stream(self._stream, num_frames)
IOError: [Errno Input overflowed] -9981

There are certain solutions already available that solved many user's problem, which in my case, isn't true.

Here is what I've tried,

First of all, Here is the code,

"""PyAudio example: Record a few seconds of audio and save to a WAVE file."""

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
            channels=CHANNELS,
            rate=RATE,
            input=True,
            frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
   data = stream.read(CHUNK)
   frames.append(data)

print("* done recording")

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

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

I have also tried if the current configuration is supported or not,

import pyaudio
p = pyaudio.PyAudio()
if p.is_format_supported(48000.0, 
    input_device=1,
    input_channels=1,
    input_format=pyaudio.paInt16):
    print 'True!'

Both 44,000 and 44,100 are support but still I'm getting the same error again and again.

This is my USB Audio Card device info,

p.get_device_info_by_index(1)

{'defaultSampleRate': 44100.0, 
'defaultLowOutputLatency': 0.011609977324263039, 
'defaultLowInputLatency': 0.011609977324263039, 
'maxInputChannels': 1L, 
'structVersion': 2L, 
'hostApi': 0L, 
'index': 1, 
'defaultHighOutputLatency': 0.046439909297052155, 
'maxOutputChannels': 2L, 
'name': u'Generic USB Audio Device: USB Audio (hw:1,0)', 
'defaultHighInputLatency': 0.046439909297052155}

Does anybody has any idea as why I'm still getting the error ?

Was it helpful?

Solution 2

Did you try setting exception_on_overflow to False? From the Pyaudio documentation:

read(num_frames, exception_on_overflow=True)

Read samples from the stream. Do not call when using non-blocking mode.

Parameters: num_frames – The number of frames to read. exception_on_overflow – Specifies whether an IOError exception should be thrown (or silently ignored) on input buffer overflow. Defaults to True. Raises IOError: if stream is not an input stream or if the read operation was unsuccessful. Return type:
string

OTHER TIPS

Change your chunk parameter to 8192 instead of 1024. Worked for me. reference: IOError: [Errno Input overflowed] -9981

# importing modules for sound handling
# importing modules for sound handling
from sys import byteorder
from array import array
from struct import pack

import pyaudio
import wave

def audioeffect():
    CHUNK = 16 # played with, this can be 2048 1024, 512, 256 etc
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 48000

    p = pyaudio.PyAudio()

    stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                frames_per_buffer=CHUNK)
    r = array('h') # define r
    snd_data = array('h', stream.read(CHUNK)) # read sounddata from input
    r.extend(snd_data)
    stream.stop_stream()
    stream.close()
    p.terminate()
    N = 1
    SumOfSquars = 0
    for i in snd_data:  # determing the value for tel of  
        N = N +1

    # adding all quadrates
    for i in range(0, N-1):
        SumOfSquars = snd_data[i]**2
    Rms_Value = np.sqrt(SumOfSquars / N)

    #print("Rms_Value is  :", Rms_Value)
    return int(Rms_Value)

I just increased the chunk number and it appears that it works! here's my code

import pyaudio
import wave

CHUNK = 44100  #just a big number
FORMAT = pyaudio.paInt16
CHANNELS = 1 #i found that my mic has 1 channel
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input_device_index=3, #found that also
                input=True,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

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

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

elaborating on @Sidd Rajput 's answer since I did not find this clearly stated, it's not enough to set this inside your script/project, if you're importing -- pyaudio.py itself needs to be modified

def read(self, num_frames, exception_on_overflow=False):

^Line 589/590 in pyaudio.py v0.2.8:

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top