Bas*_*asj 6 python audio binding portaudio pyaudio
使用PyAudio(Portaudio绑定)和ASIO + DirectSound支持时,此代码:
import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
print p.get_device_info_by_index(i)
Run Code Online (Sandbox Code Playgroud)
...产生此错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 1: invalid continuation byte
Run Code Online (Sandbox Code Playgroud)
我们怎样才能解决这个问题?
问题可能来自"pyaudio.py",第990行,因为utf8解码不成功:
return {'index' : index,
'structVersion' : device_info.structVersion,
'name' : device_info.name,
Run Code Online (Sandbox Code Playgroud)
这里的答案音频设备中的特殊字符名称:Pyaudio("不要使用PyAudio")并不令人满意.
追溯
...
{'defaultSampleRate': 44100.0, 'defaultLowOutputLatency': 0.0, 'defaultLowInputLatency': 0.12, 'maxInputChannels': 2L, 'structVersion': 2L, 'hostApi': 1L, 'index': 8, 'defaultHighOutputLatency': 0.0, 'maxOutputChannels': 0L, 'name': u'Microphone interne (Conexant 20672 SmartAudio HD)', 'defaultHighInputLatency': 0.24}
Traceback (most recent call last):
File "D:\test\test.py", line 5, in <module>
print p.get_device_info_by_index(i)
File "C:\ProgramData\Anaconda\lib\site-packages\pyaudio.py", line 977, in get_device_info_by_index
pa.get_device_info(device_index)
File "C:\ProgramData\Anaconda\lib\site-packages\pyaudio.py", line 990, in _make_device_info_dictionary
'name' : device_info.name,
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 1: invalid continuation byte
Run Code Online (Sandbox Code Playgroud)
错误'无效的延续字节'让我认为该文本对于该特定索引是腐败的.
如果你能够修改pyaudio.py文件(或者让pyaudio.py文件只返回名称),你可以尝试使用'Unicode Dammit'自己处理UTF-8解码.它几乎可以最好地猜测编码是什么.这是他们教程的链接(http://www.crummy.com/software/BeautifulSoup/bs4/doc/#unicode-dammit)
我认为代码看起来就像教程:
from bs4 import UnicodeDammit
dammit = UnicodeDammit(audiodevicename)
print(dammit.unicode_markup) ## Wéird Device Name!
Run Code Online (Sandbox Code Playgroud)
找到的唯一成功的解决方案是:
非常感谢 @cgohlke 构建了新的即用型安装程序: http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio