V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
guocf20
V2EX  ›  分享创造

做了一个 STT 音频网关:弱网下实时断句 + VAD 前置,减少 30% 无效识别

  •  
  •   guocf20 · 2 天前 · 630 次点击

    大家好,最近在做实时语音识别( STT )相关的项目时,踩了不少坑。

    目前市面上大多数 STT 服务,基本都是基于「原始音频流 + TCP 直推」的假设来设计的, 默认网络稳定、客户端性能充足。但在弱网、实时交互、边缘设备等场景下, 音频往往是零碎、不连续的,直接送给 STT 会导致:

    • 断句慢,响应延迟高
    • 静音、噪声大量占用识别资源
    • 实时对话体验很差

    所以我单独做了一个 STT 前置音频网关, 放在客户端和 STT 服务之间,专门负责音频的预处理和断句。

    这个网关主要做了几件事:

    • 在弱网络环境下,对碎片化音频进行重组
    • 基于 VAD 自动判断语音起止,减少无效音频送入 STT
    • 将连续语音拼接成更“干净”的音频片段,再转发给后端识别
    • 相当于在客户端和 STT 之间,加了一层高性能的音频“整理管道”

    整体效果如下:

    实现上目前集成了:

    • WebRTC VAD
    • Silero VAD
    • WebRTC 经典 3A (降噪 / 回声消除 / 自动增益)

    目标并不是替代 STT ,而是在 不改动 STT 服务本身的前提下, 显著改善实时语音交互体验,尤其是在弱网和实时对话场景。

    项目地址: https://github.com/guocf20/Aeroshell_audio

    目前功能还在持续迭代中,代码也比较原始,欢迎试用、拍砖、提 PR 。

    4 条回复    2026-01-12 11:48:32 +08:00
    liangdi
        1
    liangdi  
       1 天前
    有点意思,我部署测试一下
    guocf20
        2
    guocf20  
    OP
       1 天前
    @liangdi 客户端需要采用 相同的参数编码参数,没有做协商,后面再慢慢完善。并且格式要和数据包对齐哈,音频帧长度(2 字节)+音频帧+参考音频长度(2 字节)+音频参考帧。没有远端输入的话就设置长度为 0 ,主要是用于实时对话的回音消除需要。而且现在没有做 FEC 这些。
    hanguofu
        3
    hanguofu  
       1 天前 via Android
    谢谢分享~请问支持什么语言啊?
    guocf20
        4
    guocf20  
    OP
       1 天前   ❤️ 1
    @hanguofu 客户端不限制语言。 这是服务端,你按照代码格式传 opus 数据即可,就会得到干净的 pcm 数据,这样喂给 STT 的数据少,而且清晰,减少误判。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   3982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 05:15 · PVG 13:15 · LAX 21:15 · JFK 00:15
    ♥ Do have faith in what you're doing.