Skip to content

feat(voice): 主聊天界面语音输入与录音增强线(实时打字听写 + WAV原声降噪归档) - #214

Merged
lioensky merged 1 commit into
lioensky:mainfrom
Ldl-h:feat/main-chat-voice-composer
Sep 29, 2026
Merged

lioensky merged 1 commit into
lioensky:mainfrom
Ldl-h:feat/main-chat-voice-composer

Conversation

@Ldl-h

@Ldl-h Ldl-h commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor
### 💡 核心设计与权属边界

底层的 Windows 语音输入引擎(rust_voice_input_engine)、**语音聊天窗口(voicechat)**以及无痕输入跳板窗口(voice-input-capture)均为原作者既有的原生架构与完整实现。

全局物理快捷键(如 F7)专属归属于原作者的语音聊天窗口,本次开发的主聊天界面没有、也不占用任何全局物理快捷键,纯粹依靠主输入框旁的麦克风按钮进行鼠标交互。

本次提交是在完全尊重原作者已有体系、绝不入侵既有代码结构的前提下,额外并联搭建了一条服务于主聊天界面的独立语音线:

  1. 麦克风左键(打字听写 STT):复用底层输入法/Win+H跳板,识别文字实时平滑回填主聊天输入框;
  2. 麦克风右键(原声录音 WAV):纯前端完成声学降噪与标准 WAV 编码,直接调用现有的 handleFileDrop 注入附件系统;
  3. 两套系统自律互斥与零入侵复用:
    • 仅在 Rust 引擎的 Command::FocusReady 指令扩展了一个可选布尔字段 programmatic: bool,允许来自主界面的鼠标点击程序化复用引擎,原作者的所有快捷键监听与原有分支 100%
      原貌运行;
    • 语音聊天窗口拥有绝对优先权:当语音聊天窗口正在使用快捷键听写时,主聊天主动放弃争抢;若主聊天听写期间用户按下了物理快捷键,主聊天立即注销退出、无条件向语音聊天窗口让位。

🛠️ 关键技术实现

  1. 声学数字信号处理 (DSP) 纯前端实现 (modules/voice/audioRecorder.js):
    • 80Hz 二阶巴特沃斯高通滤波器:在频域上对 30Hz~60Hz 机箱散热风扇与空调次低频轰鸣实现超 70% 的物理衰减,保证人声自然清晰;
    • 停顿区自适应软噪声门:在说话中间停顿、换气期间平滑压低底噪(-20dB),彻底消除环境底噪与话筒沙沙声;
    • 升余弦首尾淡入淡出:自动切除前后冗余静音并施加余弦平滑,消除首尾爆音。
  2. 静默人声活动检测 (VAD) 哨兵 (modules/voice/passiveVoiceSentinel.js):
    • 动态底噪跟踪 + 冲激能量比(拦截键盘敲击与鼠标瞬态脉冲)+ 114Hz~355Hz 自相关基频周期检验,实现多帧防抖静默唤醒。
  3. 防御式安全设计:
    • AI 流式吐字互斥:AI 正在流式输出时自动屏蔽“发送”快捷短语,保留为普通文字,防止半截草稿被误发;
    • 手动强退最高权限:用户在录音听写中手动点击麦克风时,视为主动中止,立即强制销毁全部资源并退出,绝无死等卡顿;
    • 语音聊天窗口精准销毁判定:在语音聊天窗口关闭时,仅清理真正属于该窗口的捕获会话,避免跳板窗口在异常情况下悬挂。

🧪 自动化测试验证矩阵

  • 独立测试套件 tests/main-chat-voice-composer.test.js 24 项单测与集成测试全部通过(覆盖指令解析、状态机、DSP 滤波、WAV 头部规范、VAD 脉冲拦截与窗口互斥);
  • 项目级 npm run check:uiux(114 项 Primitives + 36 项设置项金测)150 项测试 100% 通过;

@lioensky
lioensky merged commit 3d69c62 into lioensky:main Sep 29, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants