PyAudio recorder script IOError: [Errno Input overflowed] -9981

匿名 (未验证) 提交于 2019-12-03 00:52:01

问题:

The code below is what I use to record audio until the "Enter" key is pressed it returns an exception,

import pyaudio import wave import curses from time import gmtime, strftime import sys, select, os  # Name of sub-directory where WAVE files are placed current_experiment_path = os.path.dirname(os.path.realpath(__file__)) subdir_recording = '/recording/'  # print current_experiment_path + subdir_recording  # Variables for Pyaudio chunk = 1024 format = pyaudio.paInt16 channels = 2 rate = 48000  # Set variable for the labelling of the recorded WAVE file. timestamp = strftime("%Y-%m-%d-%H:%M:%S", gmtime()) #wave_output_filename = '%s.wav' % self.get('subject_nr') wave_output_filename = '%s.wav' % timestamp  print current_experiment_path + subdir_recording + wave_output_filename  # pyaudio recording stuff p = pyaudio.PyAudio()  stream = p.open(format = format,                 channels = channels,                 rate = rate,                 input = True,                 frames_per_buffer = chunk)  print "* recording"  # Create an empty list for audio recording frames = []  # Record audio until Enter is pressed i = 0 while True:     os.system('cls' if os.name == 'nt' else 'clear')     print "Recording Audio. Press Enter to stop recording and save file in " + wave_output_filename     print i     if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:         line = raw_input()         # Record data audio data         data = stream.read(chunk)         # Add the data to a buffer (a list of chunks)         frames.append(data)         break     i += 1  print("* done recording")  # Close the audio recording stream stream.stop_stream() stream.close() p.terminate()  # write data to WAVE file wf = wave.open(current_experiment_path + subdir_recording + wave_output_filename, 'wb') wf.setnchannels(channels) wf.setsampwidth(p.get_sample_size(format)) wf.setframerate(rate) wf.writeframes(''.join(frames)) wf.close() 

The exception produced is this

Recording Audio. Press Enter to stop recording and save file in 2015-11-20-22:15:38.wav 925 Traceback (most recent call last):   File "audio-record-timestamp.py", line 51, in <module>     data = stream.read(chunk)   File "/Library/Python/2.7/site-packages/pyaudio.py", line 605, in read     return pa.read_stream(self._stream, num_frames) IOError: [Errno Input overflowed] -9981 

What is producing the exception? I tried changing the chunk size (512,256,8192) it doesn't work. Changed the while loop condition and it didn't work.

回答1:

I had a similar problem; there are 3 ways to solve it (that I could find)

  1. set rate=24000
  2. add option "exception_on_overflow=False" to the "read()" call, that is, make it "stream.read(chunk, exception_on_overflow=False)"
  3. use callbacks

Here is, for your convenience, an example o "using callbacks"

#!/usr/bin/python  import sys, os, math, time,  pyaudio  try:     import numpy except:     numpy = None  rate=48000 chan=2  sofar=0  p = pyaudio.PyAudio()  def callback(in_data, frame_count, time_info, status):     global sofar     sofar += len(in_data)     if numpy:         f = numpy.fromstring(in_data, dtype=numpy.int16)         sys.stderr.write('length %6d sofar %6d std %4.1f  \r' % \                          (len(in_data), sofar, numpy.std(f)))     else:         sys.stderr.write('length %6d sofar %6d  \r' % \                          (len(in_data), sofar))     data = None     return (data, pyaudio.paContinue)  stream = p.open(format=pyaudio.paInt16, channels=chan, rate=rate,                 input=True, stream_callback=callback)  while True:     time.sleep(1) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!