
sherpa-onnx Rust crate 使用指南从零集成离线/流式语音识别与 TTS【免费下载链接】sherpa-onnxSpeech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, HarmonyOS, Raspberry Pi, RISC-V, RK NPU, Axera NPU, Ascend NPU, x86_64 servers, websocket server/client, support 12 programming languages项目地址: https://gitcode.com/GitHub_Trending/sh/sherpa-onnx本篇技术指南围绕 sherpa-onnx Rust crate 展开讲解如何在 Rust 项目中安全、便捷地接入 sherpa-onnx 的全套离线推理 API语音识别、语音合成、VAD、说话人分离、音频标注等重点覆盖依赖配置、静态/共享两种链接模式的选择、原生库的自动下载与自定义覆盖机制以及跨平台构建的注意事项。读完本文你将能够在自己的 Cargo 项目中直接声明一行依赖即可构建出可用的语音应用并掌握在 Linux、macOS、Windows、Android 与 iOS 上正确链接与部署的完整方法。一、crate 概览安全 Rust 绑定覆盖全部推理 APIsherpa-onnx是 sherpa-onnx 官方维护的 Rust crate定位是Safe Rust bindings for the publicsherpa-onnxinference APIs即以 RAII 所有权模型封装 C API用符合 Rust 习惯的配置结构体替代裸指针操作。从 sherpa-onnx/rust/sherpa-onnx/src/lib.rs 的模块导出可以看出它覆盖了以下功能家族离线 ASROfflineRecognizer与流式 ASROnlineRecognizer离线 TTSOfflineTts支持 Pocket / Kokoro / VITS / Matcha / ZipVoice / Supertonic 等模型VAD 语音活动检测VoiceActivityDetector说话人嵌入与离线说话人分离在线/离线标点punctuation离线与流式语音增强GTCRN、DPDFNet音频标注audio tagging与关键词唤醒KWS语音情感/语言识别SpokenLanguageIdentificationWAV 读写辅助Wave、write()从源码结构看crate 内部采用典型的两段式组织上层sherpa-onnx提供安全封装底层sherpa-onnx-sys提供原始 FFI 绑定。两个 crate 版本号严格对齐当前均为 1.13.7sherpa-onnx-sys在 Cargo.toml 中通过links sherpa-onnx声明与原生库的链接关系并使用bzip2、tar、zip解包自动下载的预编译归档ureq负责下载启用了proxy-from-env特性以支持代理环境变量。二、快速开始一行依赖接入对绝大多数用户而言安装只需在Cargo.toml中声明[dependencies] sherpa-onnx 1.13.7这里有一个关键设计crate 的默认 feature 是static静态链接。在 sherpa-onnx/rust/sherpa-onnx/Cargo.toml 中可以看到 feature 定义[features] default [static] static [sherpa-onnx-sys/static] shared [sherpa-onnx-sys/shared]即默认会静态链接原生库最终产出一个近乎自包含的二进制无需在运行时手动配置库搜索路径这对交付部署非常友好。三、链接模式详解静态链接与共享链接1. 默认静态链接static默认模式下构建脚本sherpa-onnx-sys/build.rs会在未设置SHERPA_ONNX_LIB_DIR时自动从官方 release 下载与当前平台匹配的预编译-lib静态归档并用于构建。静态产物除系统库外不依赖额外的运行时.so/.dylib/.dll。2. 共享链接shared如果希望使用共享库需要关闭默认 feature 并显式开启shared[dependencies] sherpa-onnx { version 1.13.7, default-features false, features [shared] }开启共享模式后构建脚本会自动处理运行时查找路径普通用户无需手动设置LD_LIBRARY_PATH或DYLD_LIBRARY_PATHLinux / macOS构建产物同时写入指向原始库目录与可执行文件所在目录的运行时搜索路径rpath并把所需的共享运行时库拷贝到生成的 Cargo 二进制/示例旁Windows构建脚本自动把所需 DLL 拷贝到生成的二进制/示例旁。以 macOS 为例可以用otool -l验证 rpath 是否写入otool -l target/debug/examples/version | grep -A2 LC_RPATH从 for-advanced-users.md 的记录看Linux 共享模式设置 rpath 为$ORIGINmacOS 设置loader_path均指向二进制自身所在目录从而保证libsherpa-onnx-c-api.so/.dylib与libonnxruntime能被就地找到。3. 命令行等价写法在 rust-api-examples 中可直接用 Cargo 参数切换链接模式# 默认静态 cargo run --example version # 共享链接 cargo run --no-default-features --features shared --example version该示例项目自身的 Cargo.toml 同样以default [static]起步并透传static/shared两个 feature 给sherpa-onnxcrate保持配置语义一致。四、使用自有原生库SHERPA_ONNX_LIB_DIR 覆盖机制如果你本地已经编译或下载好 sherpa-onnx 原生库可以通过环境变量让构建脚本跳过自动下载export SHERPA_ONNX_LIB_DIR/path/to/sherpa-onnx/lib该覆盖对静态和共享两种构建均生效——只要设置了它构建脚本就直接使用该目录而不再下载归档。典型来源包括源码构建输出/path/to/sherpa-onnx/build/install/lib手动解压的 release 归档/path/to/sherpa-onnx-v1.13.7-linux-x64-static-lib/lib进阶用户还可以用SHERPA_ONNX_ARCHIVE_DIR指向本地存放.tar.bz2/.zip归档的目录构建脚本会优先从该目录取用归档而不是联网下载例如 iOS 的sherpa-onnx-v{VERSION}-ios-shared-onnxruntime-static.xcframework.zip与 Android 的sherpa-onnx-v{VERSION}-android.tar.bz2。五、自动下载机制与代理支持当SHERPA_ONNX_LIB_DIR未设置时sherpa-onnx-sys/build.rs会根据当前编译目标平台OS 架构自动挑选对应的预编译归档。以 v1.13.7 为例静态归档包括平台归档示例Linux x86_64sherpa-onnx-v1.13.7-linux-x64-static-lib.tar.bz2Linux aarch64sherpa-onnx-v1.13.7-linux-aarch64-static-lib.tar.bz2macOS x86_64sherpa-onnx-v1.13.7-osx-x64-static-lib.tar.bz2macOS arm64sherpa-onnx-v1.13.7-osx-arm64-static-lib.tar.bz2Windows x64sherpa-onnx-v1.13.7-win-x64-static-MT-Release-lib.tar.bz2Windows arm64sherpa-onnx-v1.13.7-win-arm64-static-MT-Release-lib.tar.bz2共享模式则对应-shared-lib系列归档。下载器会识别标准的代理环境变量包括HTTPS_PROXY、HTTP_PROXY、NO_PROXY及其小写变体——这对应 sherpa-onnx-sys/Cargo.toml 中ureq依赖所启用的proxy-from-env特性因此在受限网络环境下也能正常完成首次构建。这些归档的完整列表含各平台与 iOS xcframework 条目记录在 sherpa-onnx/rust/sherpa-onnx/src/lib.rs 的 crate 文档中可供核对当前版本支持的平台组合。六、Rust API 的通用组织模式所有 API 遵循同一套四步模式见 lib.rs 的 How the Rust API is organized构造一个*Config值为恰好一个模型家族填充字段调用create()创建运行时对象若 API 基于流stream创建一个流喂入音频或文本通过访问器方法取回结果。所有运行时包装对象在 drop 时自动释放底层 C 资源无需手动管理内存。这一模式在 FFI 层同样清晰可见例如 sherpa-onnx-sys/src/offline_asr.rs 中定义的OfflineSenseVoiceModelConfig结构体即包含model、language、use_itn三个字段与上层安全封装的字段一一对应。七、三份可直接运行的完整示例1. 离线语音识别SenseVoiceuse sherpa_onnx::{ OfflineRecognizer, OfflineRecognizerConfig, OfflineSenseVoiceModelConfig, Wave, }; let wave Wave::read(./test.wav).expect(read wave); let mut config OfflineRecognizerConfig::default(); config.model_config.sense_voice OfflineSenseVoiceModelConfig { model: Some( ./sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17-int8/model.int8.onnx.into(), ), language: Some(auto.into()), use_itn: true, }; config.model_config.tokens Some( ./sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17-int8/tokens.txt.into(), ); let recognizer OfflineRecognizer::create(config).expect(create recognizer); let stream recognizer.create_stream(); stream.accept_waveform(wave.sample_rate(), wave.samples()); recognizer.decode(stream); let result stream.get_result().expect(result); println!({}, result.text);这里Wave::read完成 WAV 文件读取language: Some(auto)让 SenseVoice 自动判断语种use_itn: true开启逆文本正则化把数字、日期等口语转写为规范书写形式。2. 流式语音识别Zipformer Transduceruse sherpa_onnx::{OnlineRecognizer, OnlineRecognizerConfig, Wave}; let wave Wave::read(./test.wav).expect(read wave); let mut config OnlineRecognizerConfig::default(); config.model_config.transducer.encoder Some( ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.int8.onnx.into(), ); config.model_config.transducer.decoder Some( ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.onnx.into(), ); config.model_config.transducer.joiner Some( ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/joiner-epoch-99-avg-1.int8.onnx.into(), ); config.model_config.tokens Some( ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/tokens.txt.into(), ); config.enable_endpoint true; config.decoding_method Some(greedy_search.into()); let recognizer OnlineRecognizer::create(config).expect(create recognizer); let stream recognizer.create_stream(); stream.accept_waveform(wave.sample_rate(), wave.samples()); stream.input_finished(); while recognizer.is_ready(stream) { recognizer.decode(stream); }流式识别的关键在于喂入完音频后调用input_finished()再循环调用decode()直到is_ready()为假。enable_endpoint true表示启用端点检测适合按句结束场景decoding_method支持greedy_search、modified_beam_search等。3. 离线 TTSPocket TTS 零样本音色克隆use sherpa_onnx::{OfflineTts, OfflineTtsConfig, OfflineTtsModelConfig, OfflineTtsPocketModelConfig}; let config OfflineTtsConfig { model: OfflineTtsModelConfig { pocket: OfflineTtsPocketModelConfig { lm_flow: Some(./sherpa-onnx-pocket-tts-int8-2026-01-26/lm_flow.int8.onnx.into()), lm_main: Some(./sherpa-onnx-pocket-tts-int8-2026-01-26/lm_main.int8.onnx.into()), encoder: Some(./sherpa-onnx-pocket-tts-int8-2026-01-26/encoder.onnx.into()), decoder: Some(./sherpa-onnx-pocket-tts-int8-2026-01-26/decoder.int8.onnx.into()), text_conditioner: Some( ./sherpa-onnx-pocket-tts-int8-2026-01-26/text_conditioner.onnx.into(), ), vocab_json: Some(./sherpa-onnx-pocket-tts-int8-2026-01-26/vocab.json.into()), token_scores_json: Some( ./sherpa-onnx-pocket-tts-int8-2026-01-26/token_scores.json.into(), ), ..Default::default() }, ..Default::default() }, ..Default::default() }; let tts OfflineTts::create(config).expect(create tts); println!({}, tts.sample_rate());TTS 配置同样遵循一个模型家族原则Pocket TTS 需要同时提供lm_flow、lm_main、encoder、decoder、text_conditioner、vocab_json、token_scores_json七个文件其余字段用..Default::default()补齐。八、运行仓库内置示例仓库在 rust-api-examples 提供了 50 个覆盖全功能面的端到端示例每个示例都有配套的run-*.sh脚本脚本会自动下载所需模型cd rust-api-examples ./run-version.sh # 查看版本 ./run-sense-voice.sh # 离线 SenseVoice ASR ./run-streaming-zipformer-zh-en.sh # 流式 ASR ./run-vits-en.sh # TTS ./run-silero-vad-remove-silence.sh # VAD 去静音 ./run-keyword-spotter.sh # 关键词唤醒 ./run-offline-speaker-diarization.sh # 说话人分离麦克风类示例需要额外启用micfeature底层使用cpal跨平台音频 I/O见 rust-api-examples/Cargo.toml 中mic [cpal]的定义# 仅麦克风 cargo run --features mic --example streaming_zipformer_microphone -- --help # 麦克风 共享链接 cargo run --no-default-features --features shared,mic \ --example streaming_zipformer_microphone -- --help模拟流式类示例如sense_voice_simulate_streaming_microphone的思路是用 Silero VAD 从麦克风检测语音片段再把每个片段交给离线识别器从而以离线模型的精度获得近似流式的交互体验。九、跨平台构建要点1. Linuxx86_64 / aarch64默认静态构建直接cargo build --release即可产物自包含共享构建使用--no-default-features --features shared构建脚本设置$ORIGINrpath 并拷贝.so。aarch64 的共享归档名带-cpu后缀linux-aarch64-shared-cpu-lib以与 GPU 变体区分。也可以从源码构建后指定SHERPA_ONNX_LIB_DIR指向build/install/lib。2. macOSarm64 / x86_64静态构建链接libc与 Foundation 框架共享构建设置loader_pathrpath 并拷贝.dylib。Apple Silicon 上可交叉编译 Intel 目标rustup target add x86_64-apple-darwin cargo build --target x86_64-apple-darwin --release3. Windowsx64 / arm64全部使用 MSVC 工具链与静态 CRT/MT。共享模式下构建脚本会自动拷贝sherpa-onnx-c-api.dll、onnxruntime.dll、onnxruntime_providers_shared.dll三个 DLL运行时缺一不可。一个常见的坑是 Cargo 可能误用 Git 自带的link.exe需显式指定 MSVC 链接器$env:CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\version\bin\HostX64\x64\link.exe4. Android仅支持共享链接Android 与 iOS 一样只支持sharedfeature。构建脚本下载包含全部 ABI 的sherpa-onnx-v{VERSION}-android.tar.bz2按 Rust target triple 自动映射 ABI 目录aarch64-linux-android→arm64-v8a并把.so放入正确的jniLibs/{abi}/位置同时设置$ORIGINrpath。归档内含libsherpa-onnx-c-api.so与libonnxruntime.so两者运行时都需要。5. iOS仅支持共享链接iOS 支持真机aarch64-apple-ios与模拟器aarch64-apple-ios-sim、x86_64-apple-ios。构建脚本自动下载sherpa-onnx-v{VERSION}-ios-shared-onnxruntime-static.xcframework.zip发布在独立的xcframeworkrelease tag 下该 xcframework 中的共享 dylib 已静态内嵌 onnxruntime无需再引入独立的 onnxruntime framework。构建脚本会从ios-arm64/SherpaOnnxC.framework/中找到 dylib并创建libsherpa-onnx-c-api.dylib符号链接供链接器按预期名字找到库。上述各平台的详细归档清单、前提条件与从源码构建流程均记录在 for-advanced-users.md 中可按需查阅。十、小结sherpa-onnxRust crate 的设计目标非常明确让普通开发者零配置上手让进阶开发者完全掌控链接细节。默认静态链接 自动下载预编译库使sherpa-onnx 1.13.7一行依赖即可跑通sharedfeature 与SHERPA_ONNX_LIB_DIR/SHERPA_ONNX_ARCHIVE_DIR环境变量则提供了共享库与自定义库的弹性底层sherpa-onnx-sys的 FFI 层与构建脚本支持代理下载、rpath 注入、跨平台归档挑选共同保证了从桌面到移动端的全平台一致性体验。配合仓库内置的 50 示例与配套run-*.sh脚本你可以快速从跑通示例过渡到集成到自己的 Rust 应用中。【免费下载链接】sherpa-onnxSpeech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, HarmonyOS, Raspberry Pi, RISC-V, RK NPU, Axera NPU, Ascend NPU, x86_64 servers, websocket server/client, support 12 programming languages项目地址: https://gitcode.com/GitHub_Trending/sh/sherpa-onnx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考