2014-02-05 2 views
6

При использовании PyAudio (Portaudio связывание) с поддержкой ASIO + DirectSound, этот код:PyAudio 'utf8' Ошибка при включении устройства

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 ") не является удовлетворительным.


Traceback

... 
{'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

Я добавил Traceback @Wooble – Basj

+0

След не соответствует вашему коду, но ошибка выглядит внутренней для pyaudio. Вы пробовали подать с ними отчет об ошибке? – geoffspear

ответ

1

Единственным успешным найденное решение:

Большое спасибо @cgohlke за то, что вы построили новое у-к-использованию монтажники: http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio

5

Ошибка 'недопустимый продолжение байт' заставляет меня думать, что текст испорчен для этого конкретного индекса.

Если вы можете изменить файл pyaudio.py (или получить файл pyaudio.py, чтобы вернуть только имя), вы можете попробовать обработать декодирование UTF-8 самостоятельно, используя «Unicode Dammit», , Это в значительной степени лучше всего подходит для кодирования. Вот ссылка на их учебник (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

1

Я раздвоенный pyAudio и модифицированный https://github.com/joelewis/PyAudio/blob/master/src/_portaudiomodule.c код для использования

PyUnicode_DecodeFSDefault 

вместо от

PyUnicode_FromString 

который, вероятно, может решить проблему uni проблема с кодом. Посмотрите, сможете ли вы найти это полезным.

вилка: https://github.com/joelewis/PyAudio/

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 с некоторыми действительными продолжение байт.