1. 环境搭建与工具链验证
任务目标
搭建端侧语音模型部署的基础环境,包括Python、PyTorch、ONNX Runtime及相关依赖,并通过一个最小语音特征提取与ONNX导出流程验证工具链可用性。
环境依赖
- Python 3.9+
- PyTorch ≥ 2.0(CPU版即可)
- ONNX Runtime ≥ 1.16
- torchaudio(用于语音特征提取验证)
安装命令
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install onnxruntime onnx
关键完整代码
以下代码完成:构造一个最小语音特征提取模型(MFCC),导出为ONNX,并用ONNX Runtime加载推理,验证两端输出一致性。
import torch
import torchaudio
import onnxruntime as ort
import numpy as np
# 1. 定义最小模型:MFCC特征提取
class MFCCModel(torch.nn.Module):
def __init__(self, sample_rate=16000):
super().__init__()
self.mfcc = torchaudio.transforms.MFCC(
sample_rate=sample_rate,
melkwargs={"n_fft": 400, "hop_length": 160, "n_mels": 40}
)
def forward(self, waveform):
# waveform: [batch, time]
return self.mfcc(waveform) # [batch, n_mfcc, time]
# 2. 创建模型并导出ONNX
model = MFCCModel()
model.eval()
# 构造固定输入:1秒16kHz单声道音频
dummy_input = torch.randn(1, 16000)
onnx_path = "mfcc_model.onnx"
torch.onnx.export(
model,
dummy_input,
onnx_path,
input_names=["waveform"],
output_names=["mfcc"],
dynamic_axes={"waveform": {1: "time"}, "mfcc": {2: "time"}},
opset_version=17
)
print(f"ONNX导出成功: {onnx_path}")
# 3. ONNX Runtime加载与推理
ort_session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
ort_input = dummy_input.numpy()
ort_output = ort_session.run(None, {"waveform": ort_input})[0]
# 4. PyTorch与ONNX输出一致性验证
with torch.no_grad():
torch_output = model(dummy_input).numpy()
# 动态时间维度,比较公共长度部分
min_len = min(torch_output.shape[2], ort_output.shape[2])
torch_out = torch_output[:, :, :min_len]
ort_out = ort_output[:, :, :min_len]
# 数值一致性检查
max_diff = np.max(np.abs(torch_out - ort_out))
print(f"最大数值差异: {max_diff:.6f}")
# 5. 工具链可用性断言
assert max_diff < 1e-4, "PyTorch与ONNX输出差异过大"
print("工具链验证通过: PyTorch → ONNX → ONNX Runtime 全链路可用")
运行方式
python verify_toolchain.py
验证方法与判定标准
- 安装验证:上述pip命令无报错,
python -c "import torch, onnxruntime, torchaudio; print(torch.__version__, ort.__version__)"能正常输出版本号。 - 功能验证:运行脚本后,控制台输出
ONNX导出成功且最大数值差异小于1e-4,最终打印工具链验证通过。 - 判定标准:脚本无异常退出,且断言通过,即证明Python/PyTorch/ONNX Runtime/torchaudio环境完整,模型导出与推理链路可用。
常见问题
- ONNX导出报错:确认opset_version≥17,且torchaudio版本与PyTorch匹配(建议同时升级)。
- 输出维度不一致:动态时间轴下,ONNX Runtime可能对边界帧处理略有差异,代码已截取公共长度比较,属正常处理。
- CPU推理慢:本案例仅验证链路,实际端侧部署建议使用INT8量化或更轻量特征提取方案。