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