5

我正在尝试在 Win7 上使用 PyAudio 连接 PreSonus AudioBox 1818VSL,但是一次录制超过 2 个通道(立体声)时遇到了一些问题。PreSonus 驱动程序创建了许多立体声输入音频设备(例如立体声通道 1&2、3&4 等)和一个 18 输入通道 ASIO 设备。我可以毫无问题地从任何立体声设备录制。为了最大限度地减少超过 2 个通道的延迟和记录,我正在尝试使用 ASIO 设备。

我一直在使用来自http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio的 PyAudio 版本,它编译了对 ASIO、DS、WMME、WASAPI、WDMKS 的支持。

调用pyaudio_handle.is_format_supported()显示 ASIO 设备支持 44.1、48 和 96 kHz 的 8 到 32 位数据。

下面是返回的字典pa.get_device_info_by_index(32)

{'defaultHighInputLatency': 0.046439909297052155,
'defaultHighOutputLatency': 0.046439909297052155,
'defaultLowInputLatency': 0.046439909297052155,
'defaultLowOutputLatency': 0.046439909297052155,
'defaultSampleRate': 44100.0,
'hostApi': 2L,
'index': 32,
'maxInputChannels': 18L,
'maxOutputChannels': 18L,
'name': u'AudioBox ASIO Driver',
'structVersion': 2L}

下面是我用来创建 PyAudio 输入流的代码。回调函数只是将数据推送到一个列表中并返回pyaudio.paContinue,直到我得到我想要的样本数量,然后它才返回pyaudio.paComplete

pyaudio_handle = pyaudio.PyAudio()
stream = pyaudio_handle.open(
    format=pyaudio.get_format_from_width(2,unsigned=False),
    channels=4,
    rate=48000,
    input=True,
    frames_per_buffer=256,
    input_device_index=32,
    stream_callback=pyaudio_stream_callback,
)

尝试以高于 44.1 kHz 的速率初始化 ASIO 驱动程序会导致 PyAudio 挂起而不返回。以 44.1 kHz 初始化会产生以下错误:IOError: [Errno Unanticipated host error] -9999.

您可以提供解决此错误的任何帮助都会有所帮助。在 Win7 上运行时,我什至会证明 ASIO 可以在 PyAudio 中使用 > 2 个通道。谢谢。

4

1 回答 1

5

我能够使用 96 kHZ 的 ASIO 驱动程序录制 8 声道音频(M-audio M-Track 八)。

p = pyaudio.PyAudio()
p.get_device_info_by_index(4) 

我发现 'index': 4 是 ASIO 驱动程序:

{'defaultLowInputLatency': 0.005804988662131519, 
 'defaultHighOutputLatency': 0.09287981859410431, 
 'defaultLowOutputLatency': 0.005804988662131519,
 'defaultSampleRate': 44100.0, 
 'maxInputChannels': 8, 
 'maxOutputChannels': 8,
 'structVersion': 2, 
 'name': 'M-Audio M-Track Eight ASIO', 
 'index': 4, 
 'hostApi': 2,
 'defaultHighInputLatency': 0.09287981859410431}

所以我从PyAudio上的示例代码开始,但从波形切换scipy.io.wavfile到编写多声道 .wav 文件,因为wave只支持立体声。

import pyaudio
import wave
import numpy as np
from scipy.io import wavefile

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 8
RATE = 96000
RECORD_SECONDS = 10
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                input_device_index=4,
                frames_per_buffer=CHUNK
                )

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()


#Not really sure what b'' means in BYTE STRING but numpy needs it 
#just like wave did...
framesAll = b''.join(frames)

#Use numpy to format data and reshape.  
#PyAudio output from stream.read() is interlaced.
result = np.fromstring(framesAll, dtype=np.int16)
chunk_length = len(result) / CHANNELS
result = np.reshape(result, (chunk_length, CHANNELS))

#Write multi-channel .wav file with SciPy
wavfile.write(WAVE_OUTPUT_FILENAME,RATE,result)

中提琴!96 kHz、16 位、8 通道 .wav 文件!

哦,详情

  • Win7 64位
  • M-Audio 8 位 64 位 Windows 驱动程序 1.0.11
  • Python 3.4.2 32 位
  • PyAudio 0.2.8 for Win7 从 这里
  • numpy-1.9.2
  • scipy-0.15.1-win32-superpack-python3.4
于 2015-04-20T19:04:50.073 回答