Python 如何进行多声卡录音

对一个会议系统进行非侵入录音,录制至少有三个音源,会场主音,主持人麦克风和现场拾音器,最终保存。

方案利用一台电脑和三个外接声卡

Python是否有项目可以独立操作多个声卡进行录音?

Python可以独立操作多个声卡进行录音。有几个Python库可以实现这一功能,其中最常用的是PyAudio和sounddevice库。

使用PyAudio库,你可以在Python中独立控制多个声卡。以下是一个示例代码:


import pyaudio

# 打开声卡1进行录音
p1 = pyaudio.PyAudio()
stream1 = p1.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, input_device_index=0)

# 打开声卡2进行录音
p2 = pyaudio.PyAudio()
stream2 = p2.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, input_device_index=1)

# 打开声卡3进行录音
p3 = pyaudio.PyAudio()
stream3 = p3.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, input_device_index=2)

# 从三个声卡中读取数据
while True:
    data1 = stream1.read(1024)
    data2 = stream2.read(1024)
    data3 = stream3.read(1024)

    # 处理数据
    # ...

# 关闭声卡
stream1.stop_stream()
stream1.close()
p1.terminate()

stream2.stop_stream()
stream2.close()
p2.terminate()

stream3.stop_stream()
stream3.close()
p3.terminate()

使用sounddevice库,你可以使用下面的示例代码独立控制多个声卡:

import sounddevice as sd

# 打开声卡1进行录音
stream1 = sd.InputStream(device=0)

# 打开声卡2进行录音
stream2 = sd.InputStream(device=1)

# 打开声卡3进行录音
stream3 = sd.InputStream(device=2)

# 从三个声卡中读取数据
with stream1, stream2, stream3:
    while True:
        data1, _ = stream1.read(1024)
        data2, _ = stream2.read(1024)
        data3, _ = stream3.read(1024)

        # 处理数据
        # ...

无论你使用哪个库,你都可以使用多个声卡独立录制音频,并将其保存到文件中。

“Devil组”引证GPT后的撰写:
Python可以通过第三方库进行独立操作多个声卡进行录音。

一个流行的Python录音库是PyAudio,它可以用于在Windows、macOS和Linux操作系统上录制和播放音频。PyAudio库提供了在不同声卡之间切换的能力,因此可以用于同时录制多个音频源。

以下是一个简单的示例代码,演示如何使用PyAudio录制多个音频源并保存到磁盘:

import pyaudio
import wave

# 打开音频文件
file1 = wave.open('main_audio.wav', 'wb')
file2 = wave.open('host_audio.wav', 'wb')
file3 = wave.open('pickup_audio.wav', 'wb')

# 初始化PyAudio
p = pyaudio.PyAudio()

# 配置录音参数
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100

# 获取系统中可用的声卡数量
device_count = p.get_device_count()

# 打开每个声卡进行录制
for i in range(device_count):
    # 打开声卡i进行录制
    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK,
                    input_device_index=i)
    # 录制并保存音频
    frames = []
    for j in range(0, int(RATE / CHUNK * 5)):
        data = stream.read(CHUNK)
        frames.append(data)
    if i == 0:
        file1.setnchannels(CHANNELS)
        file1.setsampwidth(p.get_sample_size(FORMAT))
        file1.setframerate(RATE)
        file1.writeframes(b''.join(frames))
    elif i == 1:
        file2.setnchannels(CHANNELS)
        file2.setsampwidth(p.get_sample_size(FORMAT))
        file2.setframerate(RATE)
        file2.writeframes(b''.join(frames))
    elif i == 2:
        file3.setnchannels(CHANNELS)
        file3.setsampwidth(p.get_sample_size(FORMAT))
        file3.setframerate(RATE)
        file3.writeframes(b''.join(frames))
    # 关闭录音流
    stream.stop_stream()
    stream.close()

# 关闭音频文件
file1.close()
file2.close()
file3.close()

# 终止PyAudio
p.terminate()


通过遍历可用的声卡,依次打开每个声卡进行录制,并将录制的音频数据保存到不同的音频文件中。通过修改文件名和文件路径,可以将音频文件保存到指定的目录中。

  • 需要注意的是,不同的操作系统可能会有不同的声卡编号。如果无法确定正确的声卡编号,请使用PyAudio库提供的pyaudio.paFloat32格式录制一些音频数据,并使用Python的wave模块将其保存到磁盘。然后,可以使用音频编辑器(如Audacity)打开保存的音频文件,并查看每个声道的音频波形,以确定每个声卡的正确编号。