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量化或更轻量特征提取方案。