PyAudio IOError:没有可用的默认输入设备
我在Ubuntu 10.10 x64上使用Enthought Python Distribution(Python 2.6.6)里的PyAudio。
>>> import pyaudio
>>> pa = pyaudio.PyAudio()
>>> pa.get_default_input_device_info()
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
pa.get_default_input_device_info()
File "/usr/lib/python_epd/lib/python2.6/site-packages/pyaudio.py", line 936, in get_default_input_device_info
device_index = pa.get_default_input_device()
IOError: No Default Input Device Available
如果我尝试打开一个输入流,也会出现同样的错误。错误信息是“IOError: 没有可用的默认输出设备”。
6 个回答
2
最后,这个方法对我有效:
首先,从源代码构建并安装portaudio,然后安装最新版本的pyaudio。接着,把/libportaudio.so.2.0.0这个文件在/usr/local/lib目录下重命名为oldlibportaudio.so.2.0.0,然后创建一个新的软链接,指向/usr/lib/x86_64-linux-gnu里的那个文件。sudo mv libportaudio.so.2.0.0 oldlibportaudio.so.2.0.0
sudo ln -s /usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0 libportaudio.so.2.0.0
在Ubuntu 20.04 x64上测试过
3
我推荐使用 PYO 来处理音频输入和合成,我觉得它非常容易上手。
下面是一段代码,展示了我如何使用 PYO 获取音频输入,并在处理后输出,改变它的音调:
from pyo import *
serv = Server(duplex=1).boot()
serv.start()
shiftfreq = 329.63
# 329.63 is the frequency for the E note
mic = Input(chnl=0)
shift = FreqShift(mic, shift=shiftfreq, mul=.5).out()
serv.gui(locals())
PYO 还允许你实时改变频率和合成参数,或者其他任何东西,这对我来说是最大的吸引力,因为我主要用它来编程实时合成器乐器。
它还有一本很棒的 手册...
3
好的,这里有一个解决方案,虽然看起来不太美观,但对我来说有效。根据我对ulidtko回答的评论,问题不在于pyaudio,而是在于pyaudio所依赖的底层PortAudio。
在ubuntu上,portaudio驱动是通过这个软件包安装的:
sudo apt-get install python-gnuradio-audio-portaudio
你应该已经安装了这个,因为你说你的标准ubuntu能正常运行你的代码(虽然有一些可以忽略的调试信息)
如果你查询一下portaudio模块的位置,当你运行enthought的python时,你会发现以下内容:
>>> import pyaudio
>>> pyaudio.pa.__file__
'/opt/epd-7.2-2-rh5-x86_64/lib/python2.7/site-packages/_portaudio.so'
而在标准ubuntu上则会显示以下内容:
In [1]: import pyaudio
In [2]: pyaudio.pa.__file__
Out[2]: '/usr/lib/pymodules/python2.7/_portaudio.so'
我把enthought的_portaudio.so文件移开了,并用系统的_portaudio.so文件创建了一个链接,现在包括chaco演示/高级目录中的漂亮频谱分析器在内的一切都能正常工作了:
cd /opt/epd-7.2-2-rh5-x86_64/lib/python2.7/site-packages/
mv _portaudio.so _portaudio.so.originalEPD
ln -s /usr/lib/pymodules/python2.7/_portaudio.so