ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RunAnywhere Kotlin SDK 之 runanywhere-onnx:Android 端侧 STT/TTS/VAD 后端的安装、注册与语音 API 实战指南

RunAnywhere Kotlin SDK 之 runanywhere-onnx:Android 端侧 STT/TTS/VAD 后端的安装、注册与语音 API 实战指南 AI模型推理服务推理引擎本地部署多模态【免费下载链接】runanywhere-sdksProduction ready toolkit to run AI locally项目地址https://gitcode.com/gh_mirrors/ru/runanywhere-sdks点击查看免费下载runanywhere-onnx 是 RunAnywhere Kotlin SDK 的可选语音后端模块通过 ONNX Runtime 与 Sherpa-onnx 在 Android 设备上本地完成语音转文字STT、文字转语音TTS和语音活动检测VAD音频数据不出设备。本文以该模块的官方 README 为主线结合仓库源码深入讲解其依赖配置、初始化注册流程、语音 API 调用方式与底层 JNI 实现原理帮助你在一款 Android 应用中完整跑通端侧语音能力。模块定位可插拔的语音后端RunAnywhere Kotlin SDK 采用核心 SDK 可选后端的架构。核心制品runanywhere-sdk提供初始化、模型下载/加载、生命周期管理和统一公开 API而具体的推理能力由各后端模块提供能力制品模型格式说明LLM / VLMrunanywhere-llamacppGGUF (.gguf)流式生成、结构化输出、工具调用STTrunanywhere-onnxONNX (.onnx,.ort)Whisper、Sherpa 流式识别TTSrunanywhere-onnxONNX、Piper 语音系统 TTSAndroidTextToSpeechVAD核心 runanywhere-onnxONNX语音活动检测NPUrunanywhere-qhexrt-android可选QNN / Hexagon仅高通设备本模块的定位在 README 中写得很明确Optional ONNX/Sherpa backend for the RunAnywhere Kotlin SDK — on-device STT, TTS, and VAD on Android。也就是说它不是独立 SDK而是核心 SDK 的语音能力补充注册后即可通过核心 SDK 的语音 API 直接使用。值得注意的细节从 ONNX.kt 的源码注释可以看到该模块内部同时承载两类能力——ONNX Runtime 负责文本嵌入如 all-MiniLM 模型Sherpa 模块负责语音原语STT/TTS/VAD。一次注册即同时向 C 服务注册表注册 ONNX 后端与 Sherpa 后端这正是其 README 描述STT、TTS、VAD能力的来源。环境要求根据模块 README 与 Kotlin SDK 主 README 的要求使用前需确认要求最低版本AndroidAPI 24Android 7.0Kotlin2.0JVMJava 17权限RECORD_AUDIO麦克风采集、INTERNET模型下载与 SDK 鉴权RECORD_AUDIO是运行时权限需要在代码中动态申请INTERNET是普通权限直接在AndroidManifest.xml声明即可uses-permission android:nameandroid.permission.INTERNET /安装配置添加 Gradle 依赖模块 README 明确要求同时引入核心 SDK 与本模块二者版本必须保持一致dependencies { // Core SDK必需 implementation(io.github.sanchitmonga22:runanywhere-sdk:0.20.37) // Optional: STT, TTS, VAD via ONNX/Sherpa (~25 MB) implementation(io.github.sanchitmonga22:runanywhere-onnx:0.20.37) }其中runanywhere-onnx约 25 MB对比runanywhere-llamacpp约 34 MB其体积包含 ONNX Runtime、Sherpa-onnx 的 C 原生库.so以及 JNI 桥接层。由于该制品发布在 Maven Central坐标io.github.sanchitmonga22:runanywhere-onnx在settings.gradle.kts中声明mavenCentral()仓库后即可解析。初始化流程先注册后端再初始化 SDK模块 README 给出的使用范式非常简洁且顺序是硬约束——必须在RunAnywhere.initialize()之前注册后端import com.runanywhere.sdk.core.onnx.ONNX import com.runanywhere.sdk.public.RunAnywhere import com.runanywhere.sdk.public.extensions.transcribe // At app startup ONNX.register() RunAnywhere.initialize(context this, /* ... */) // After download/load an STT model via core APIs val output RunAnywhere.transcribe(audioData) println(output.text)注册的源码级原理ONNX.register()是一个挂起函数suspend内部通过Mutex保证并发安全。真正的工作发生在registerInternal()中见 ONNX.kt先确保 commons JNIlibrac_commons.so已加载——它提供核心服务注册表再加载本模块专用 JNI 库librac_backend_onnx_jni.so见 ONNXBridge.kt调用rac_backend_onnx_register()向 C 服务注册表注册 ONNX 后端若librac_backend_sherpa.so存在System.loadLibrary(rac_backend_sherpa)其 ELF 构造函数会自动把 Sherpa 的 STT/TTS/VAD 原语注册进统一插件注册表若该库未打包则仅注册 ONNX 后端日志提示Sherpa backend library not packaged; continuing with ONNX backend only。注册结果是幂等的返回码0成功或-4RAC_ERROR_MODULE_ALREADY_REGISTERED模块已注册都被视为正常其他错误码仅记录日志而不会抛出异常避免注册失败导致应用崩溃。这也解释了为什么重复调用ONNX.register()是安全的。对应的原生侧符号定义在 engines/onnx/rac_backend_onnx_register.cpp 与 engines/onnx/jni/rac_backend_onnx_jni.cpp通过RAC_DEFINE_ENGINE_JNI_BRIDGE宏绑定 Kotlin 侧的ONNXBridge而 RAG 场景下的嵌入能力如 all-MiniLM则由 engines/onnx/onnx_embedding_provider.cpp 提供在 CMakeLists.txt 中受RAC_BACKEND_RAG开关控制。Android 侧上下文初始化模块还提供ONNXAndroid.initialize(context)用于持有 Application Context使用WeakReference避免内存泄漏典型调用顺序为ONNXAndroid.initialize(this) ONNX.register()不过ONNXAndroid中持有的上下文仅为模块自身使用核心 SDK 初始化仍需传入context参数。语音 API 实战STT / TTS / VAD注册完成后语音能力的调用入口是核心 SDK 的公开 API而非本模块——这是本模块薄封装设计的关键所有业务逻辑都在 C commons 层Kotlin 侧只是注册的搬运工。STT 语音转文字模块 README 展示的RunAnywhere.transcribe(audioData)是历史扩展函数现已在 RunAnywhereSTT.kt 中标记Deprecated它内部会先校验RunAnywhere.isInitialized、ensureServicesReady()再通过currentModel()查询MODEL_CATEGORY_SPEECH_RECOGNITION分类下是否已加载模型未加载则抛出SDKException.modelNotLoaded()。推荐使用新的命名空间 API见 SttNamespace.kt// 批量转写整段音频一次处理 val text RunAnywhere.stt.transcribe(AudioInput.wav(recording)).text // 实时流式转写先确定音频格式再推入 PCM 帧 val stream RunAnywhere.stt.openStream(format, options) stream.events.collect { event - when (event) { is TranscriptionEvent.Partial - updateUI(event.alternatives.first().text) is TranscriptionEvent.TranscriptFinal - showFinal(event) is TranscriptionEvent.Completed - finish() else - {} } } stream.pushFrame(...) stream.finish()源码中有一个值得留意的工程细节SttNamespace.ktopenStream只接受原始 PCMint16容器格式如 WAV 文件头必须走批量transcribe且历史教训是绝不能把 float32 数据交给 Sherpa否则会被误读为 int16 而转写成一堆噪声注释中记录了 clear speech came back as [Music] and (wind) 的真实案例。TTS 文字转语音TTS 命名空间提供三个层次的 API见 TtsNamespace.kt// 1) 合成整段音频并返回 Audio 缓冲 val audio: Audio RunAnywhere.tts.synthesize(Hello, TtsOptions(speed 1.1f)) // 2) 增量合成边合成边播放减少首字延迟 RunAnywhere.tts.synthesizeStream(longText).collect { chunk - /* 播放 chunk */ } // 3) 合成并直接播放返回 SpeechHandle 用于打断 val handle RunAnywhere.tts.speak(Deployment finished) handle.interrupt() // 需要中断时speak()返回的SpeechHandle是打断播放的推荐方式无全局tts.stop()旧的stop()已被弃用。VAD 语音活动检测VAD 在 Kotlin 侧由 commons 的rac_vad_stream_*流事件驱动解码适配器位于 VADStreamAdapter.kt它把 C 层产出的VADStreamEvent序列化字节映射为公开的VadEvent。VAD 组件通过 ComponentVTable.kt 中racVadComponentCreate/LoadModel/IsLoaded/Destroy等原生函数接入统一组件生命周期。典型用法是配合 VoiceAgent 或 STT 实现检测到语音才开始识别的节能流程。模型管理下载与加载使用语音 API 前必须先通过核心 SDK 的模型生命周期 API 准备好模型模块 README 中强调 After download/load an STT model via core APIsimport com.runanywhere.sdk.public.extensions.downloadModelStream import com.runanywhere.sdk.public.extensions.loadModel // 下载带进度 RunAnywhere.downloadModelStream(RAModelInfo(id modelId)).collect { progress - // 更新 UIprogress.overall_progress } // 加载 RunAnywhere.loadModel( RAModelLoadRequest( model_id modelId, category ModelCategory.MODEL_CATEGORY_SPEECH_RECOGNITION, ), )模型格式方面本模块对应 ONNX 生态格式扩展名后端用途ONNX.onnxONNX RuntimeSTT、TTS、VADORT.ortONNX Runtime优化后的 STT/TTS模型由 SDK 目录catalog统一管理可用RunAnywhere.listModels()查询语音类模型Whisper、Sherpa 流式、Piper 语音等均归属本模块支持范围。需要注意的是stt.transcribe在未加载语音识别模型时会抛出SDKException因此生产代码应先用RunAnywhere.stt.state()查询就绪状态。ProGuard / R8 混淆注意事项模块自带 proguard-rules.pro关键规则包括保留全部com.runanywhere.sdk.**类、接口、枚举及构造器JNI 反射依赖类名与方法签名保留native方法-keepclasseswithmembernames class * { native methods; }保留 ONNX Runtime 的ai.onnxruntime.**类并忽略其警告-dontwarn ai.onnxruntime.**。使用混淆构建时确保该规则文件已随制品合并进应用否则可能因 JNI 符号被重命名导致运行时UnsatisfiedLinkError。常见问题与边界未注册后端就调用语音 API会得到服务不可用或rac_plugin_route返回错误如-423务必把ONNX.register()放在RunAnywhere.initialize()之前。Sherpa 库缺失如果 APK 中未打包librac_backend_sherpa.so仅 ONNX 嵌入可用STT/TTS/VAD 不可用——日志会出现rac_backend_sherpa not present警告此时应检查制品是否完整。重复注册ONNX.register()幂等-4视为成功可安全地在多个初始化路径调用。权限麦克风采集必须动态申请RECORD_AUDIO没有该权限时流式 STT 将拿不到任何音频帧。隐私边界模型下载完成后推理全程在设备端进行网络仅用于 SDK 鉴权、模型下载与可选的遥测分析。语音数据默认不会上传云端做推理。延伸阅读Kotlin SDK 完整文档与示例bindings/kotlin/README.md、bindings/kotlin/docs/Documentation.md模块注册源码ONNX.kt、ONNXBridge.kt语音 API 实现SttNamespace.kt、TtsNamespace.ktC 后端注册engines/onnx/rac_backend_onnx_register.cpp、engines/onnx/rac_backend_onnx_jni.cpp许可证LICENSE赞分享AI模型推理服务推理引擎本地部署多模态【免费下载链接】runanywhere-sdksProduction ready toolkit to run AI locally项目地址https://gitcode.com/gh_mirrors/ru/runanywhere-sdks点击查看免费下载相关推荐RunAnywhere Kotlin SDK 完整指南端侧 LLM / STT / TTS / VAD 全模态 API 实战RunAnywhere Kotlin SDK 完整指南端侧 LLM / STT / TTS / VAD 全模态 API 实战 本篇技术指南以 bindingsAI模型推理服务推理引擎本地部署多模态Qwen Code 后台任务通知的会话回放落位机制background_notification 源标记与 Web Shell 系统消息渲染Qwen Code 后台任务通知的会话回放落位机制 background_notification 源标记与 Web Shell 系统消息渲染 输出文章 QAI模型推理服务推理引擎本地部署多模态n8n 二进制与文件数据处理完全指南$binary 与 $json 双槽位、AI Agent 工具 JSON 边界与聊天界面 CDN 要求n8n-mcp 实战n8n 二进制与文件数据处理完全指南$binary 与 $json 双槽位、AI Agent 工具 JSON 边界与聊天界面 CDN 要求n8n mcp 实AI模型推理服务推理引擎本地部署多模态上一篇qBittorrent 聚合搜索从零到一5 分钟装好 search-plugins一个搜索框搜遍全网资源下一篇无需系统模拟位置权限的应用级虚拟定位FakeLocation 完整上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表