音频设备中的特殊字符名称:Pyaudio

时间:2013-04-08 11:52:41

标签: python utf-8 portaudio pyaudio

我目前面临一个难题。我需要在法语窗口环境中使用Pyaudio,默认情况下音频设备的名称包含éè

这是我出现特殊字符时出现的错误:

   u=self.p.get_device_info_by_index(e)
  File "C:\Python27\lib\site-packages\pyaudio.py", line 977, in get_device_info_
by_index
    pa.get_device_info(device_index)
  File "C:\Python27\lib\site-packages\pyaudio.py", line 987, in _make_device_inf
o_dictionary
    print device_info.name
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 13: invalid
continuation byte

如果我可以访问代码,这不会有问题(我需要在字符串链中添加一个“...”)。

问题是我查看了Pyaudio代码,导致bug的方法在pyd文件(_portaudio.pyd)中定义,因此,我无法修改它!

我试着下载_portaudio来自己编译,但是我发现的发行版用C语言编写而且很重(我不知道关于C的第一件事)。也许我可以在那里做点什么,但我不确切知道在哪里和如何。

我还可以通过评论获取音频设备名称的行来处理这个问题,但是要识别特定的音频输入而不向用户显示其名称会更加困难。

编辑:

以下是整个过程: 我从pyaudio调用函数:

      import pyaudio

      self.p= pyaudio.PyAudio()

      i=self.p.get_device_count()

      for e in range(i):
          u=self.p.get_device_info_by_index(e)

这将引导我进入调用方法的pyaudio模块:

device_info.name

device_info是_portaudio.pyd中定义的对象。 由于特定音频设备的名称包含“é”或“è”(谢谢窗口),并且_portaudio.pyd未编码以处理这些字符。它返回错误:

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

1 个答案:

答案 0 :(得分:-1)

我面临着同样的问题。就我而言,音频设备名称中有中文字符,当print device_info.name

时出现UnicodeDecode错误

这是我的解决方案。

使用pymedia代替pyaudio。试试这个:

>>> import pymedia 
>>> dict_list = pymedia.audio.sound.getIDevices()
>>> print dict_list
({'name': '\xc2\xf3\xbf\xcb\xb7\xe7 (Realtek High Definition', 'channels': 2, 'manufId': '1', 'formats': 1048575, 'id': 0, 'productId': '65'},)
>>> dict_list = pymedia.audio.sound.getODevices()
>>> print dict_list
({'name': '\xd1\xef\xc9\xf9\xc6\xf7 (MV USB AUDIO)', 'channels': 2, 'manufId': 'ffff', 'formats': 1048575, 'id': 0, 'productId': 'ffff'}, {'name': '\xd1\xef\xc9\xf9\xc6\xf7 (Realtek High Definition', 'channels': 2, 'manufId': '1', 'formats': 1048575, 'id': 1, 'productId': '64'})

我正在使用python 2.7。