Transcribro如何知道你何时停止说话?Silero VAD状态机源码分析

发布时间:2026/10/14 18:04:00

Transcribro如何知道你何时停止说话?Silero VAD状态机源码分析 Transcribro如何知道你何时停止说话Silero VAD状态机源码分析【免费下载链接】TranscribroPrivate and on-device speech recognition keyboard and service for Android.项目地址: https://gitcode.com/gh_mirrors/tr/TranscribroTranscribro 是一款运行在 Android 上的私有端侧语音识别键盘与识别服务所有语音都在本机处理不上传云端。它用 Silero VADVoice Activity Detection语音活动检测回答一个关键问题——我什么时候停止说话的。本文带你逐段看懂 Silero VAD 状态机源码搞懂它如何用三个变量和一对阈值自动判断语音的起止。为什么语音识别需要 VAD你按下键盘上的麦克风开始说话说完后并不需要再按一次停止。Transcribro 会在你停下来后自动结束录音把这句话交给 Whisper 转成文字然后继续监听下一句。️这个自动判停能力由 Silero VAD 提供它是一个极轻量的小型神经网络ONNX 格式对每一小段音频输出一个 0~1 的语音概率。但光有概率还不够——真正让判定稳定不抖动的是外面包着的一层状态机。Transcribro 的 VAD 默认配置参数在 MainRecognitionService.kt 中Transcribro 给状态机设定了这组参数⚙️参数值含义SAMPLE_RATE16000 Hz音频采样率START_THRESHOLD0.6语音开始概率阈值END_THRESHOLD0.45语音结束概率阈值MIN_SILENCE_DURATION_MS3000 ms确认真正停止所需的最小静音时长SPEECH_PAD_MS0 ms语音前后边界填充未启用注意开始阈值0.6高于结束阈值0.45中间形成滞回区间概率落在 0.45~0.6 之间时状态保持不变避免在边界附近来回抖动。Silero VAD 状态机拆解三个变量与四种状态整个状态机在 SileroVadDetector.kt 里只靠三个变量驱动triggered是否已检测到语音核心开关tempEnd静音开始的样本位置0 表示没有待定的结束currentSample当前已处理到的样本序号状态转移规则如下表当前状态触发条件状态机动作未触发概率 ≥ 0.6置 triggeredtrue返回start说话开始已触发概率 0.45若 tempEnd0 则记录当前位置开始静音计时静音计时中概率 ≥ 0.6清空 tempEnd——你还在说话取消结束判定静音计时中静音 ≥ 3000 ms返回end真的说完了重置全部状态静音计时中静音未达 3000 ms返回空继续等待对应源码分别是 开始判定逻辑 和 结束判定逻辑。apply() 每一步在做什么每次 apply() 接收一小段音频流程是累加currentSample把这段音频的样本数计入总长度调用 ONNX 模型得到语音概率speechProb若概率 ≥ 0.6 且存在待定的tempEnd先清空它——这是取消误判的关键一步你刚停顿了一下又开口结束计时立即作废若概率 ≥ 0.6 且尚未触发进入触发态并返回start若概率 0.45 且已触发开始并延续静音计时只有累计静音达到minSilenceSamples16000 × 3 48000 个样本即整整 3 秒才返回end。返回值里的start/end是样本序号不是秒数主服务直接用它们去切片音频。音频数据流从麦克风到状态机音频经过三层调用才进入状态机MainRecognitionService.kt麦克风以 16kHz、16bit 单声道持续读入缓冲逐块送入检测SileroVadRepository.kt把 16bit 整型样本除以 32767归一化到 -1~1 的浮点数组再交给检测器SileroVadOnnxModel.kt封装 ONNX Runtime 会话维护模型内部的 LSTM 隐状态两组 64 维的 h/c 张量让模型能记住上一小段音频。模型文件 silero_vad.with_runtime_opt.ort 以 ONNX 格式直接打包在应用的 assets 资源里随应用安装这也是端侧检测如此轻快的原因。reset() 重置流程为什么每句话说完都要清零每检测到一次end主服务都会调用 reset()把 LSTM 隐状态 h/c 归零见 resetStates()防止上一句话的声学特征泄漏到下一句triggered回到 false、tempEnd归 0、currentSample归 0开启全新的一轮检测。识别被取消或服务销毁时同样会触发重置保证状态机不会带着脏状态残留到下一次录音。状态机结果如何驱动整个识别流程在 MainRecognitionService.kt 中状态机的返回值被这样消费收到start→ 通知系统开始说话记录本句起点收到end→ 通知系统结束说话在后台线程用 Whisper 转写这一句、发出部分识别结果然后重置 VAD、开始监听下一句若开启了自动停止第一句结束后直接停止录音并返回最终结果。也就是说Silero VAD 是 Transcribro 的节奏指挥它决定何时开始、何时交棒给 Whisper、何时继续下一句而 Whisper 只负责把划定的音频片段转成文字。相关模块路径速查模块职责文件路径VAD 状态机核心SileroVadDetector.kt音频归一化与检测入口SileroVadRepository.ktONNX 模型封装SileroVadOnnxModel.kt检测器懒加载SileroVadLocalDataSource.kt阈值配置与流程调度MainRecognitionService.kt小结Transcribro 判断你何时停止说话的答案浓缩成一句话就是一个 0~1 的语音概率、一对 0.6/0.45 的滞回阈值、一个 3 秒的静音确认窗口再加上triggered、tempEnd、currentSample三个变量组成的状态机。轻量、确定、可解释——这正是端侧语音助手最需要的可靠性。【免费下载链接】TranscribroPrivate and on-device speech recognition keyboard and service for Android.项目地址: https://gitcode.com/gh_mirrors/tr/Transcribro创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/13 4:52:09

Pytest大厂测试实战:核心技巧与面试指南

1. 为什么Pytest成为大厂测试标配 在头部互联网企业的测试技术栈中,Pytest已经取代了传统的unittest和nose成为Python测试框架的首选。根据2023年最新的测试工具调研报告显示,超过78%的Python测试岗位要求候选人具备Pytest实战经验。这背后有几个关键原因…

2026/10/15 4:08:09

AI接客户,先补交接单

销售和客服都在用AI,客户还会不会被反复问同一个问题?关键要看交接的信息是不是同一份。Microsoft在10月8日介绍把Dynamics 365客户信息带进Copilot和Teams的更新。Teams里的CRM体验处于公开预览;公告中的其他代理能力也有各自的开放范围&…

2026/10/15 4:08:09

# C#正则表达式Regex学习:从字符串匹配到数据提取

一、什么是正则表达式? 在C#开发过程中,经常需要对字符串进行处理,例如: 判断手机号格式是否正确验证邮箱格式从字符串中提取指定数据替换字符串中的某些内容 如果使用传统字符串方法,例如: Contains()&…

2026/10/15 4:08:09

Linux misc驱动实践

阅读了正点原子的《I.MX6U嵌入式Linux驱动开发指南》第五十七章Linux MISC驱动实验,了解到misc驱动也是字符设备驱动,并且嵌套在platform总线驱动中,既然前面学习了platform总线驱动的框架,所以决定在理解misc驱动原理后&#xff…

2026/10/15 4:08:09

优化开票任务Demo开发(章节2)

听起来很复杂像是ConcurrentHashMap把线程隔离开了,但其实就是创建了两个线程池,这两个线程池本来就是隔开的,跟ConcurrentHashMap没啥关系ConcurrentHashMap只是为了解决数据争用项目中通过一个Cache类,把用户的相关开票数据搬到…

2026/10/15 4:03:08

家长怎么远程控制孩子手机 家长控制孩子手机的方法

家长怎么远程控制孩子手机?很多家长日常工作忙碌,无法时刻陪伴孩子,难以实时掌握孩子的手机使用情况,管控十分被动。家长怎么远程控制孩子手机呢?无需复杂设备和繁琐设置,无界趣连2.0适配亲子远程管控场景&…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑