列出设备时出现PyAudio'utf8'错误

时间:2014-02-05 13:07:57

标签: python audio binding portaudio pyaudio

使用带有ASIO + DirectSound支持的PyAudio(Portaudio绑定)时,此代码:

import pyaudio

p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
    print p.get_device_info_by_index(i)

...产生此错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 1: invalid continuation byte

我们如何解决这个问题?


问题可能来自“pyaudio.py”,第990行,因为utf8解码不成功:

           return {'index' : index,
                    'structVersion' : device_info.structVersion,
                    'name' : device_info.name,

这里的答案Special characters in audio devices name : 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

4 个答案:

答案 0 :(得分:5)

错误'无效的连续字节'让我认为该文本对于该特定索引是腐败的。

如果您能够修改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!

答案 1 :(得分:1)

我已经将pyAudio和修改后的https://github.com/joelewis/PyAudio/blob/master/src/_portaudiomodule.c代码分叉使用

PyUnicode_DecodeFSDefault

而不是

 PyUnicode_FromString

可能解决unicode问题。 看看你是否觉得它有用。

叉: https://github.com/joelewis/PyAudio/

答案 2 :(得分:1)

唯一成功的解决方案是:

非常感谢@cgohlke建立了新的即用型安装程序: http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio

答案 3 :(得分:0)

我认为这里的线索是

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 1: invalid continuation byte

无论出于何种原因,get_device_info_by_index()(可能是name字段)返回的内容都包含字节0xe9,如果您将字节字符串解释为UTF8,则表示“连续字节” ”。这意味着它期望一些有效字节跟随0xe9有效字节表示构成合法UTF8字符的某些字节序列。 E.g。

http://hexutf8.com/?q=e981a8

使用0xe9和一些有效的连续字节