使用Python sounddevice在两个设备上进行多通道采集

时间:2019-01-04 10:20:16

标签: python python-sounddevice

我正在尝试从RME Fireface UCX声卡输出多达4通道的音频,并在miniDSP 16通道麦克风阵列上获取16通道的音频数据。目前,如果我结合使用query_devices命令中列出的设备,则可以使16进2出系统正常工作,但似乎无法增加输出通道的数量。

从设备列表中:

0 name:Microsoft Sound Mapper - Input input ch:2 out ch:0
1 name:ADAT (7+8) (RME Fireface UCX) input ch:2 out ch:0
2 name:Line (miniDSP micArray Multi-ch input ch:2 out ch:0
...
46 name:ASIO Fireface USB input ch:18 out ch:18
47 name:ASIO4ALL v2 input ch:2 out ch:2
48 name:miniDSP ASIO Driver input ch:16 out ch:2
...
60 name:Line (miniDSP micArray Multi-channels) input ch:16 out ch:0
72 name:Line (nanoSHARC micArray16 UAC2.0) input ch:16 out ch:0
73 name:Analog (1+2) (Fireface Analog (1+2)) input ch:0 out ch:8
74 name:Analog (1+2) (Fireface Analog (1+2)) input ch:2 out ch:0
...

因此,如果我有x(这是一个具有44100 * 5行乘以三列的numpy数组,代表以44.1 kHz(= fs)采样的5秒钟3通道数据),我可以这样做:

sd.default.device = [46, 46]
rx_data = sd.playrec(x, samplerate=fs, channels=8)

,这将同时播放3个声道输出到我的扬声器,并在我的RME声卡输入上获取8个声道。同样,如果我这样做:

duration = 5
sd.default.device = [48, 48]
sd.rec(int(duration * fs), samplerate=fs, channels=16)

我可以让我的miniDSP录制16通道的音频,持续5秒钟。另外,如果我这样做:

sd.default.device = [60, 73]
rx_data = sd.playrec(x, samplerate=fs, channels=16)

我可以让miniDSP h / w采集16声道音频,而RME仅输出2声道(是的,尽管numpy阵列具有3列,并且设备列表说设备可以输出8声道,但仅2声道? )。没关系,但是正如我所说,我希望有3或4个音频输出通道。

我考虑过合并ASIO设备,即

sd.default.device = [48, 46]
rx_data = sd.playrec(x, samplerate=fs, channels=16)

但这(并不奇怪)会导致PortAudioError -9993 I / O设备的非法组合。

因此,我考虑使用InputStreams和OutputStreams,但我并未完全遵循sounddevice文档中的一些示例代码。但这也许是解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:0)

PortAudio库(在sounddevice模块中使用)实际上不允许具有不同输入和输出(硬件)设备的流。它可能适用于某些主机API和某些设备组合,但尚未得到官方支持。

另请参阅https://github.com/spatialaudio/python-sounddevice/issues/154

您也许可以在操作系统级别将多个设备组合成一个“虚拟设备”,但是我不知道该设备是否/如何在Windows上运行(它可以在Linux / ALSA中使用配置文件{{ 1}},并在macOS上通过定义“聚合设备”来实现。)

如果这不是一种选择,则可以使用不同的流进行输入和输出(如您在问题中所述)。在这种情况下,输入和输出块的时序通常不匹配,因此您不应该尝试同步处理输入和输出。 您应该使用.asoundrc之类的东西将音频数据从输入回调传输到输出回调。

文档中确实没有任何示例。 但是你可以尝试结合 rec_unlimited.py (用于输入回调) 与 play_long_file.py (用于输出回调)。