如何将麦克风/回环输入的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
相关产品推荐
相关产品推荐

