2014-02-05 31 views
6

時PyAudio 'utf-8' 的錯誤當使用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) 

...產生此錯誤:

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

如何我們能解決這個問題嗎?


的問題可能會因爲一個不成功的UTF8解碼從 「pyaudio.py」,線路990:

  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 
+0

顯示完整的追溯... – geoffspear

+0

我添加了追蹤@Wooble – Basj

+0

回溯與您的代碼不匹配,但該錯誤確實看起來像pyaudio的內部。你有沒有試過向他們提交錯誤報告? – geoffspear

回答

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! 
+0

地獄我不知道這個答案是否會幫助OP,但+1提到這個我不知道的圖書館。太好了! – Fenikso

+0

+1,但不幸的是它沒有解決問題... – Basj

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字符的一些字節序列。例如。

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

使用0xe9一些有效延續字節