#!/bin/sh # 把官方 SenseVoice ONNX 模型转换成 MNN 格式,产出「记录问诊」端侧转写要用的两件套: # SenseVoice/model.mnn —— MNNConvert 量化转换(weightQuant 8bit)的图 # SenseVoice/tokens.txt —— id↔token 映射(直接拷 onnx 包里的) # # 产物目录可: # - 旁路导入:拷到模拟器/真机沙盒 Application Support/Models/SenseVoice/(demo 现场重装兜底); # - 或上传到你的镜像,后续做成 App 内下载项(本期默认旁路导入,见集成文档)。 # # 用法: # MNN_SRC=/Users/xuhuayong/apps/MNN-src sh scripts/convert-sensevoice-mnn.sh # # 需求:MNNConvert(从 MNN 源码 -DMNN_BUILD_CONVERTER=ON 编出)、wget/curl、tar。 set -e MNN_SRC="${MNN_SRC:-/Users/xuhuayong/apps/MNN-src}" OUT_DIR="$(cd "$(dirname "$0")/.." && pwd)/build/SenseVoice" WORK_DIR="$(cd "$(dirname "$0")/.." && pwd)/build/sensevoice-src" MODEL_TAR="sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17" MODEL_URL="https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/${MODEL_TAR}.tar.bz2" # ① 找 MNNConvert。 MNNCONVERT="${MNNCONVERT:-${MNN_SRC}/build/MNNConvert}" if [ ! -x "$MNNCONVERT" ]; then echo "❌ 找不到 MNNConvert:$MNNCONVERT" echo " 先编译转换器(在 MNN 源码里):" echo " cd \"$MNN_SRC\" && mkdir -p build && cd build \\" echo " && cmake .. -DMNN_BUILD_CONVERTER=ON -DMNN_LOW_MEMORY=ON -DMNN_SEP_BUILD=OFF && make MNNConvert -j8" echo " 或 export MNNCONVERT=/path/to/MNNConvert 后重跑。" exit 1 fi # ② 下载 + 解包 SenseVoice ONNX(含 fp32 model.onnx / int8 / tokens.txt)。 mkdir -p "$WORK_DIR" cd "$WORK_DIR" if [ ! -d "$MODEL_TAR" ]; then echo "⬇️ 下载 SenseVoice ONNX 模型…" if command -v wget >/dev/null 2>&1; then wget -c "$MODEL_URL" else curl -L -O "$MODEL_URL" fi tar xvf "${MODEL_TAR}.tar.bz2" fi SRC_ONNX="${WORK_DIR}/${MODEL_TAR}/model.onnx" SRC_TOKENS="${WORK_DIR}/${MODEL_TAR}/tokens.txt" [ -f "$SRC_ONNX" ] || { echo "❌ 缺 model.onnx(应为 fp32,勿用 int8):$SRC_ONNX"; exit 1; } [ -f "$SRC_TOKENS" ] || { echo "❌ 缺 tokens.txt:$SRC_TOKENS"; exit 1; } # ③ 转换:fp32 onnx → mnn(权重 8bit 量化,降体积+配合 MNN_LOW_MEMORY 降运行内存)。 # 红线:转 fp32 的 model.onnx,不要转 model.int8.onnx(README 明确)。 mkdir -p "$OUT_DIR" echo "🔧 转换 model.onnx → model.mnn(weightQuant 8bit)…" "$MNNCONVERT" -f ONNX \ --modelFile "$SRC_ONNX" \ --MNNModel "$OUT_DIR/model.mnn" \ --weightQuantBits=8 --weightQuantBlock=64 cp "$SRC_TOKENS" "$OUT_DIR/tokens.txt" echo "✅ 输出: $OUT_DIR/{model.mnn, tokens.txt}" echo "安装到沙盒(见 docs/release/sensevoice-integration.md):" echo " - 模拟器:拷到 ~/Library/Developer/CoreSimulator/.../Application Support/Models/SenseVoice/" echo " - 真机:经「我的 · 模型管理」旁路导入,或预拷进沙盒 Models/SenseVoice/"