Python 音频: 使用 sounddevice 调用 ASIO 声卡驱动

# coding:utf8

"""
    本模块讲述如何使用sounddevice库, 对声卡的ASIO驱动进行调用, 进行播放, 录音操作

    使用ASIO驱动的好处:
        1. 延迟低, 就是时延小, 播放录音操作过程中的软硬件时延;
        2. 通道个数多(是MME, WDM-KS 等驱动的两倍数量, 因为ASIO可以控制单个插孔)

    本机使用了 FireFace 802 系列的声卡, 支持 ASIO 驱动
    https://www.rme-audio.com/home.html

"""

import os
import sounddevice as sd
import soundfile

test_wav_file_path = r"F:\sounddevice_test_wav\wav_test\张杰 - 往事随风.wav"

data_array, sample_rate = soundfile.read(test_wav_file_path)

# 初始化一个录音文件路径
rec_file_path = os.path.join(os.path.abspath(os.path.join(os.getcwd(), os.path.pardir)),
                             "sounddevice_test_wav", "rec_files", "rec_1.wav")

# 使用ASIO播放
# 第一步, 找到 ASIO 总的唯一id.
# 就是通过 python -m sounddevice 查询出来的信息中--最左侧的数字, 当然是对应 ASIO 那个驱动, 有且只有一个;
# 前提是你的电脑连接的声卡支持ASIO驱动, 本机用的是 FireFace 802 系列
# 比如: 48 ASIO .....

asio_top_only_one_id = 48  # 这里, 我先假设, 当前电脑连接了有ASIO驱动的声卡(比如 FireFace 802系列), 其ASIO驱动是48索引

# 下面这两个id ---> 举个例子:  "Analog 1" 对应的id是 0;   "Analog 2" 对应的id是 1
asio_single_channel_id_1 = 0  # 相当于使用了 Analog 1 这个通道,  也就是 FireFace 802 声卡硬件后侧的编号为1的插口
asio_single_channel_id_2 = 1  # 相当于使用了 Analog 2 这个通道,  也就是 FireFace 802 声卡硬件后侧的编号为2的插口

# 要想使用 sounddevice 调用 ASIO 驱动, 就需要按照下边设置一下
asio_in = sd.AsioSettings(channel_selectors=[asio_single_channel_id_1])
asio_out = sd.AsioSettings(channel_selectors=[asio_single_channel_id_2])

# 播放方式一
sd.default.extra_settings = None, asio_out  # 单独播放, 就只用配置一个输出id
sd.default.device[1] = asio_top_only_one_id  # 这里要配置ASIO唯一那个索引id, 本机是48
sd.play(data_array, blocking=True, samplerate=sample_rate, mapping=None)

# 播放方式二
sd.default.device[1] = asio_top_only_one_id  # 这里要配置ASIO唯一那个索引id, 本机是48
sd.play(data_array, blocking=True, samplerate=sample_rate, mapping=None, extra_settings=(None, asio_out))

# 录音方式一
sd.default.extra_settings = asio_in, None  # 单独录制, 就只用配置一个输入id
sd.default.device[0] = asio_top_only_one_id  # 这里要配置ASIO唯一那个大id, 本机是48
res_data_array_1 = sd.rec(frames=48000 * 30, samplerate=48000, channels=1, mapping=None, blocking=True)

# 录音方式二
sd.default.device[0] = asio_top_only_one_id  # 这里要配置ASIO唯一那个大id, 本机是48
res_data_array_2 = sd.rec(frames=48000 * 30, samplerate=48000, channels=1, mapping=None, blocking=True,
                          extra_settings=(asio_in, None))

# 如果是边录边播, 需要设置两个
sd.default.extra_settings = asio_in, asio_out
sd.default.device[0] = asio_top_only_one_id
sd.default.device[1] = asio_top_only_one_id
res_data_array = sd.playrec(data_array, samplerate=sample_rate, blocking=True,
                            input_mapping=None, output_mapping=None, channels=2)

soundfile.write(rec_file_path, res_data_array, samplerate=sample_rate, subtype="PCM_16")

代码作为参考, 可以根据各自需求拆分组装, 最好不要直接复制粘贴运行

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值