You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将麦克风/回环输入的NumPy数组转为Torchaudio波形用于PyTorch分类器

解决方案:将Soundcard录音数据转换为TorchAudio兼容格式

一、直接内存转换(推荐,实时性最优)

TorchAudio通过torchaudio.load返回的张量格式为**[channels, frames]的float32类型Tensor,而soundcard返回的是[frames, channels]**的float32类型NumPy数组。只需调整维度并转换为Tensor,即可直接输入分类器,无需文件IO操作。

示例代码

import soundcard as sc
import torch
import torchaudio

# 加载训练好的分类器模型
model = ...  # 替换为你的模型加载逻辑
model.eval()

# 确保录音采样率与模型训练时一致,不一致则需重采样
TARGET_SR = 148000

speakers = sc.all_speakers()
default_speaker = sc.default_speaker()
mics = sc.all_microphones(include_loopback=True)
default_mic = mics[0]

with default_mic.recorder(samplerate=TARGET_SR) as mic:
    print("Recording...")
    # 按需调整录制帧数(控制单次处理的音频时长)
    data = mic.record(numframes=100000)
    print("Processing audio...")

    # 1. 转换NumPy数组维度:frames×channels → channels×frames
    audio_np = data.T
    # 2. 转换为Torch张量,与torchaudio.load输出格式完全兼容
    sig = torch.from_numpy(audio_np).float()

    # 若模型训练采样率与当前不同,执行重采样
    # sig = torchaudio.functional.resample(sig, orig_freq=TARGET_SR, new_freq=16000)

    # 输入模型分类
    with torch.no_grad():
        output = model(sig)
        pred_class = torch.argmax(output, dim=1).item()
        print(f"预测类别:{pred_class}")

二、内存生成WAV文件读取(备选方案)

如果需要严格复用torchaudio.load后续的处理流程,可以通过内存文件对象模拟WAV文件,再用TorchAudio读取。此方法存在额外的编码解码开销,实时性略逊于直接转换。

示例代码(使用soundfile库)

import soundcard as sc
import torch
import torchaudio
import soundfile as sf
from io import BytesIO

TARGET_SR = 148000
model = ...  # 替换为你的模型加载逻辑

speakers = sc.all_speakers()
default_speaker = sc.default_speaker()
mics = sc.all_microphones(include_loopback=True)
default_mic = mics[0]

with default_mic.recorder(samplerate=TARGET_SR) as mic:
    print("Recording...")
    data = mic.record(numframes=100000)
    print("Processing via in-memory WAV...")

    # 创建内存文件对象
    mem_file = BytesIO()
    # 将音频数据写入内存WAV文件
    sf.write(mem_file, data, samplerate=TARGET_SR, format='WAV')
    # 重置文件指针至开头
    mem_file.seek(0)

    # 用torchaudio加载内存中的WAV文件,得到与本地文件一致的输出
    sig, sr = torchaudio.load(mem_file)

    # 输入模型分类
    with torch.no_grad():
        output = model(sig)
        pred_class = torch.argmax(output, dim=1).item()
        print(f"预测类别:{pred_class}")

关键注意事项

  • 采样率一致性:必须保证录音采样率与模型训练时使用的采样率匹配,否则必须通过torchaudio.functional.resample重采样,否则模型性能会严重下降。
  • 实时流优化:若需真正的实时处理,建议分块录制(比如每次录制1秒对应的帧数)并逐块处理,避免单次录制过多帧导致延迟。
  • 数据类型匹配:soundcard返回的float32数组与TorchAudio默认输出的float32张量类型一致,无需额外转换。

内容的提问来源于stack exchange,提问作者Jalau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:55:12