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),仅供参考

相关新闻

Prisma 数据导入指南:`prisma import` 命令、NDF 格式与导入 API 实战

Prisma 数据导入指南:`prisma import` 命令、NDF 格式与导入 API 实战

后端数据库GraphQL 【免费下载链接】prisma1 💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated] 项目地址: https://gitcode.com/gh_mirrors/pr/prisma1 点击查看 免费下载 导读 prisma import 是 …

2026/9/24 17:01:12 阅读更多 →
抖音无水印下载工具 douyin-downloader:从单条视频到主页批量采集的完整指南

抖音无水印下载工具 douyin-downloader:从单条视频到主页批量采集的完整指南

抖音无水印下载工具 douyin-downloader:从单条视频到主页批量采集的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and b…

2026/9/24 17:01:12 阅读更多 →
QuantsPlaybook量化研报复现指南:10分钟跑通

QuantsPlaybook量化研报复现指南:10分钟跑通

QuantsPlaybook量化研报复现指南:10分钟跑通 【免费下载链接】QuantsPlaybook 量化研究-券商金工研报复现 项目地址: https://gitcode.com/GitHub_Trending/qu/QuantsPlaybook QuantsPlaybook用Python复现了100份券商金工研报:25个择时策略、22个…

2026/9/24 17:01:12 阅读更多 →

最新新闻

Linux与Windows系统运维:参数查询与配置命令对照实战

Linux与Windows系统运维:参数查询与配置命令对照实战

很多时候,我们干的活儿并不是什么高深莫测的架构设计,反而是那些每天都在重复的“查一下参数、改一个配置”。尤其是当你的手头同时管着 Windows 服务器和 Linux 服务器时,这种“精神分裂”的感觉会特别明显:明明在 Windows 上用图…

2026/9/24 18:28:13 阅读更多 →
RabbitMQ安装详解:Windows与Docker高频坑与权限排查

RabbitMQ安装详解:Windows与Docker高频坑与权限排查

先聊点实际的。你点进这篇文章,多半是因为项目里突然要用消息队列,或者面试题刷到“RabbitMQ和Kafka怎么选”,又或者已经在Windows上装了RabbitMQ,结果服务死活起不来,管理界面也打不开。不管你是哪种情况,…

2026/9/24 18:28:13 阅读更多 →
Linux与Windows参数查询与配置:双系统实战速查手册

Linux与Windows参数查询与配置:双系统实战速查手册

1. 项目背景:为什么我要维护一份“Linux与Windows参数查询与配置”手册自从开始同时接触Linux服务器和Windows桌面环境,我就一直被同一个问题反复折磨:某个参数上次明明调通了,下次换台机器又得从头翻文档。更让人崩溃的是&#x…

2026/9/24 18:28:13 阅读更多 →
Flutter状态边界:UI树才是决定setState刷新范围的关键

Flutter状态边界:UI树才是决定setState刷新范围的关键

有人问我一个很经典的问题:setState明明调了,数据也变了,界面就是不动,到底哪里出了问题?我听完他的代码描述,第一反应不是去看状态管理库配没配好,而是反问他一句:你这段状态&#…

2026/9/24 18:28:13 阅读更多 →
基于OpenCV模板匹配的车牌识别毕业设计实战指南

基于OpenCV模板匹配的车牌识别毕业设计实战指南

简介:这是一套基于OpenCV模板匹配的车牌识别毕业设计源码,使用Python 3.8与OpenCV 4.2开发,并配有简单的GUI界面。项目面向计算机相关专业的学生或课程设计用户,主要解决从车辆图像中定位车牌、校正倾斜、判别牌照颜色、分割字符并…

2026/9/24 18:28:13 阅读更多 →
【Coze】【视频】治愈系老爷爷工作流

【Coze】【视频】治愈系老爷爷工作流

今天给大家演示一个 老爷爷语录视频自动生成工作流。该工作流通过大语言模型和图像生成模型的协作,自动完成从文本语录生成、格式化处理、配图生成,再到视频合成和音频配乐的完整流程。结合效果展示,用户只需提供简单的输入,就能得到带有温馨画面和背景音乐的成品视频,大幅…

2026/9/24 18:27:12 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →