Получение IOError: [Errno Input переполнен] -9981 при установке входа и выхода PyAudio Stream в True

Я пытаюсь запустить следующий код (пример из документации PyAudio) на моем Mac (OS 10.7.2):

import pyaudio
import sys

chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5

p = pyaudio.PyAudio()

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

print "* recording"
for i in range(0, 44100 / chunk * RECORD_SECONDS):
    data = stream.read(chunk)
    stream.write(data, chunk)
print "* done"

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

Ошибка, которую я даю:

Traceback (most recent call last):
  File "PyAudioExample.py", line 24, in <module>
data = stream.read(chunk)
  File "/Library/Python/2.7/site-packages/pyaudio.py", line 564, in read
return pa.read_stream(self._stream, num_frames)
IOError: [Errno Input overflowed] -9981

Я выполнил поиск этой ошибки в Google и обнаружил, что увеличение или уменьшение порции может помочь. Я попробовал это, и это не имело никакого значения. Я также попытался добавить следующий код, чтобы перехватить исключение перегрузки:

try:
    data = stream.read(chunk)
except IOError as ex:
    if ex[1] != pyaudio.paInputOverflowed:
        raise
    data = '\x00' * chunk

Это позволило избежать ошибки, но вместо вывода входного звука я услышал громкий щелчок.

Чтобы устранить неполадки, я закомментировал строку output = True, и программа работала нормально, но ничего не выводила. Я закомментировал input = True и вместо этого прочитал файл Wave, и поток смог выводить звук. Я попытался создать 2 потока, один для ввода и один для вывода, но это тоже не сработало.

Есть ли что-то еще, что я могу сделать, чтобы избежать этой ошибки?

Ответ 1

Я сталкиваюсь с той же ситуацией, когда я вручную устанавливаю pyaudio (построил portaudio из источника), не так идеально подходит для загрузки pyaudio для Apple Mac OS X (Universal) установите его, который установит его только для python 2.6 и предыдущей версии. если вы запустите свой код с помощью /usr/bin/python 2.6, то вы закончите. но если вам действительно нужно 2.7, скопируйте установленный модуль (pyaudio.py, _portaudio.so) в папку 2.7/Library/Python/2.7/site-packages/.

Я не знаю, почему он не работает, строя модуль из источника.

Ответ 2

В portaudio появилась ошибка, которая до недавнего времени вызывала множество ошибок ложного переполнения в OS X (см. http://music.columbia.edu/pipermail/portaudio/2012-June/014167.html).

Я подтвердил, что ежедневный снимок portaudio с 2012-08-06 исправляет ошибку.

Ответ 3

Извините, я попал в проблему

  File "voice.py", line 65, in <module>
    if ex[1] != pyaudio.paInputOverflowed:
TypeError: 'OSError' object is not subscriptable

Пожалуйста, помогите мне, спасибо!