Python IOError输入溢出:使用Tkinter接口录制音频

Python IOError输入溢出:使用Tkinter接口录制音频,python,exception,tkinter,pyaudio,ioerror,Python,Exception,Tkinter,Pyaudio,Ioerror,我正在尝试做一个简单的GUI应用程序,它只有一个按钮:Record 你按下按钮,录音就开始了。松开按钮后,录制将停止并保存录制 但是,单击该按钮时出现以下错误: Traceback (most recent call last): ... data = self.stream.read(self.CHUNK) File (...), line 608, in read return pa.read_stream(self._stream, num_frames, ex

我正在尝试做一个简单的GUI应用程序,它只有一个按钮:Record

你按下按钮,录音就开始了。松开按钮后,录制将停止并保存录制

但是,单击该按钮时出现以下错误:

Traceback (most recent call last):
    ...
    data = self.stream.read(self.CHUNK)
  File (...), line 608, in read
    return pa.read_stream(self._stream, num_frames, exception_on_overflow)
IOError: [Errno -9981] Input overflowed
Exception in Tkinter callback
但是,我在录制没有按钮和Tkinter(他们给出的代码示例)的简单音频时没有问题

代码如下:

import Tkinter as tk
import pyaudio, wave

class AppRecording:
    def __init__(self, root):
        self.root = root
        self.mouse_pressed = False
        recordingButton = tk.Button(root, text = "Record")
        recordingButton.pack()
        recordingButton.bind("<ButtonPress-1>", self.OnMouseDown)
        recordingButton.bind("<ButtonRelease-1>", self.OnMouseUp)
        self.CHUNK = 1024
        self.FORMAT = pyaudio.paInt16
        self.CHANNELS = 2
        self.RATE = 44100
        self.WAVE_OUTPUT_FILENAME = "output.wav"

        self.p = pyaudio.PyAudio()

        try: self.stream = self.p.open(format=self.FORMAT,
                    channels=self.CHANNELS,
                    rate=self.RATE,
                    input=True,
                    frames_per_buffer=self.CHUNK)
        except:
            raise Exception("There is no connected microphone. Check that you connect to the left hole if you have a PC.")
            return None

        self.frames = []

    def recordFrame(self):
        try:
            data = self.stream.read(self.CHUNK)
            print "after try"
        except IOError as ex:
            print "inside except"
            if ex[1] != pyaudio.paInputOverflowed:
                print "before raise"
                raise
                print "after raise"

            data = '\x00' * self.CHUNK  # or however you choose to handle it, e.g. return None

        self.frames.append(data)

    def finishRecording(self):

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

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

    def OnMouseDown(self, event):
        self.mouse_pressed = True
        self.poll()

    def OnMouseUp(self, event):
        self.root.after_cancel(self.after_id)
        print "Finished recording!"
        self.finishRecording()

    def poll(self):
        if self.mouse_pressed:
            self.recordFrame()
            self.after_id = self.root.after(1, self.poll)

root=tk.Tk()
app = AppRecording(root)
root.mainloop()
将Tkinter作为tk导入
导入音频、波形
班级评议记录:
定义初始化(自,根):
self.root=根
self.mouse_pressed=False
recordingButton=tk.Button(根,text=“记录”)
recordingButton.pack()
recordingButton.bind(“,self.OnMouseDown)
recordingButton.bind(“,self.OnMouseUp)
self.CHUNK=1024
self.FORMAT=pyaudio.paInt16
self.CHANNELS=2
自费率=44100
self.WAVE\u OUTPUT\u FILENAME=“OUTPUT.wav”
self.p=pyaudio.pyaudio()
try:self.stream=self.p.open(format=self.format,
通道=自通道,
速率=自速率,
输入=真,
帧(每个缓冲区=self.CHUNK)
除:
引发异常(“没有连接的麦克风。如果您有电脑,请检查是否连接到左孔”)
一无所获
self.frames=[]
def记录帧(自):
尝试:
data=self.stream.read(self.CHUNK)
打印“试用后”
除IOError外,例如:
打印“内部除外”
如果ex[1]!=pyaudio.PainPut溢出:
打印“加薪前”
提升
打印“加薪后”
data='\x00'*self.CHUNK#或您选择如何处理它,例如,返回None
self.frames.append(数据)
def finishRecording(自):
self.stream.stop_stream()
self.stream.close()
self.p.终止()
wf=wave.open(self.wave\u输出\u文件名'wb')
设置通道(自通道)
设置采样宽度(self.p.get_样本大小(self.FORMAT))
wf.setframerate(自速率)
wf.writeframes(b“”。连接(自帧))
wf.close()
def OnMouseDown(自身、事件):
self.mouse_pressed=True
self.poll()
def OnMouseUp(自我、事件):
self.root.after\u取消(self.after\u id)
打印“已完成录制!”
self.finishRecording()
def轮询(自我):
如果按下self.mouse_:
self.recordFrame()
self.after_id=self.root.after(1,self.poll)
root=tk.tk()
app=AppRecording(根目录)
root.mainloop()
我试图更改
self.CHUNK
self.RATE
。我的iMac的内部麦克风显示速率为44100。在一些地方,我读到应该更改块或速率值,尝试了这两种方法,但没有人帮助。另一个地方告诉我添加
,除了IOError作为ex:(…)


PyAudio版本:0.2.10

pyaudio.get\u portaudio\u version()
:1246720

pyaudio.get_portaudio_version_text()
:portaudio V19.6.0-devel,版本396fe4b6699ae929d3a685b3ef8a7e97396139a4

Tkinter.\uuuuu版本\uuuuuu
:$Revision:81008$



谢谢你的帮助,谢谢

哪个python/tk/portaudio/pyaudio版本

我确认您的代码在Ubuntu 14.04 LTS x64(带有portaudio19 dev和PyAudio-0.2.10的Python 2.7)下是好的(没有问题),所以我假设这个问题可能与您的Python、tk、PyAudio或portaudio版本有关


您确定您的计算机上安装了最新的portaudio&tk版本吗?

在运行录制时,请禁用某些元素/功能以重新调用
<代码>初始化调用设备和另一个函数调用
self.stream=None
稍后(在函数下)
self.stream=self.p.open(format=self.format,…..
,您在每个进程上都有一个管道。@dsgdfg您能更好地解释一下吗?我不知道如何修复此问题。需要进行portaudio版本升级(参见此处:=>“我今天早上将portaudio安装升级到新版本19.20140130,它解决了我系统上的问题”)我编辑了我的问题,添加了您想知道的所有内容的版本。此外,我确实将
portaudio
更新为
V19.6.0-devel
,但仍然存在相同的问题。@ASTEFANI哪个应用程序在Ubuntu Required ProcessEnumarator上管理您的
声音流管道
,用于创建设备流。这个问题的意思是
打开设备twist或我的设备id在哪里?
@Pichi Look:还有: