#!/bin/sh # 构建 sherpa-mnn.xcframework(端侧 SenseVoice ASR,跑在 MNN 后端),供「记录问诊」离线转写用。 # 产物:Frameworks/sherpa-mnn.xcframework(device arm64 + simulator),被 .gitignore 不入库。 # # 这是「全代码已就位、构建/真机验证由你来跑」中的构建步骤(详见 docs/release/sensevoice-integration.md)。 # App 侧 SenseVoiceBridge.mm 用 __has_include() 探测: # - 未接入(当前默认)→ 编为桩,问诊自动回退系统端侧识别(SFSpeech),不影响编译/运行; # - 接入本脚本产物 + 设好 HEADER_SEARCH_PATHS → 自动切到真实 SenseVoice。 # # 用法: # MNN_SRC=/Users/xuhuayong/apps/MNN-src sh scripts/build-sherpa-mnn-xcframework.sh # # 需求:已 clone MNN 源码(含 apps/frameworks/sherpa-mnn)、CMake、Xcode。约 15-40 分钟。 set -e MNN_SRC="${MNN_SRC:-/Users/xuhuayong/apps/MNN-src}" SHERPA_DIR="${MNN_SRC}/apps/frameworks/sherpa-mnn" APP_FRAMEWORKS="$(cd "$(dirname "$0")/.." && pwd)/Frameworks" export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" [ -d "$SHERPA_DIR" ] || { echo "❌ 找不到 sherpa-mnn:$SHERPA_DIR(检查 MNN_SRC)"; exit 1; } # ① 准备 MNN 静态库供 sherpa-mnn 链接。 # sherpa-mnn 的 build-ios.sh 用 MNN_LIB_DIR 找 libMNN.a + 头文件。 # 这里复用本项目的 MNN device/sim 构建产物;若尚未构建,先跑 scripts/build-mnn-xcframework.sh。 # 注意:sherpa 的 build-ios.sh 默认还会编 simulator x86_64,Apple Silicon 上通常用不到—— # 如只在 arm64 Mac/真机验证,可在 sherpa 的 build-ios.sh 里去掉 simulator_x86_64 段,加快构建。 if [ -z "${MNN_LIB_DIR}" ]; then echo "ℹ️ 未显式指定 MNN_LIB_DIR,默认用 MNN_SRC 内的构建产物目录。" echo " 若 sherpa cmake 报找不到 MNN,请先构建 MNN(scripts/build-mnn-xcframework.sh)" echo " 并 export MNN_LIB_DIR=指向含 libMNN.a + include 的目录。" export MNN_LIB_DIR="${MNN_SRC}/project/ios/build" fi echo "MNN_LIB_DIR=${MNN_LIB_DIR}" # ② 调 sherpa-mnn 自带的 iOS 构建(已含 libtool 合并 + create-xcframework + 拷头到 Headers/)。 cd "$SHERPA_DIR" sh build-ios.sh [ -d "$SHERPA_DIR/sherpa-mnn.xcframework" ] || { echo "❌ 构建未产出 sherpa-mnn.xcframework"; exit 1; } # ③ 拷进 App 的 Frameworks/(供 Xcode 链接 + HEADER_SEARCH_PATHS 指向其 Headers/)。 mkdir -p "$APP_FRAMEWORKS" rm -rf "$APP_FRAMEWORKS/sherpa-mnn.xcframework" cp -R "$SHERPA_DIR/sherpa-mnn.xcframework" "$APP_FRAMEWORKS/" echo "✅ 输出: $APP_FRAMEWORKS/sherpa-mnn.xcframework" echo "下一步(Xcode,见 docs/release/sensevoice-integration.md):" echo " 1) 把 sherpa-mnn.xcframework 拖进 target 的 Frameworks, Libraries, and Embedded Content(Do Not Embed,静态库)" echo " 2) 在 Build Settings → HEADER_SEARCH_PATHS 追加(recursive):" echo " \$(PROJECT_DIR)/Frameworks/sherpa-mnn.xcframework/Headers" echo " 3) 转换并安装 SenseVoice 模型:sh scripts/convert-sensevoice-mnn.sh"