做了一个 STT 音频网关:弱网下实时断句 + VAD 前置,减少 30% 无效识别 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
guocf20
V2EX    分享创造

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

  •  
  •   guocf20 11 天前 871 次点击

    大家好,最近在做实时语音识别( 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  
       11 天前
    有点意思,我部署测试一下
    guocf20
        2
    guocf20  
    OP
       11 天前
    @liangdi 客户端需要采用 相同的参数编码参数,没有做协商,后面再慢慢完善。并且格式要和数据包对齐哈,音频帧长度(2 字节)+音频帧+参考音频长度(2 字节)+音频参考帧。没有远端输入的话就设置长度为 0 ,主要是用于实时对话的回音消除需要。而且现在没有做 FEC 这些。
    hanguofu
        3
    hanguofu  
       11 天前 via Android
    谢谢分享~请问支持什么语言啊?
    guocf20
        4
    guocf20  
    OP
       10 天前   1
    @hanguofu 客户端不限制语言。 这是服务端,你按照代码格式传 opus 数据即可,就会得到干净的 pcm 数据,这样喂给 STT 的数据少,而且清晰,减少误判。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5522 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 01:57 PVG 09:57 LAX 17:57 JFK 20:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86