Feature Flag:
FEATURE_VOICE_MODE=1实现状态:完整可用(需要 Anthropic OAuth) 引用数:46
VOICE_MODE 实现"按键说话"(Push-to-Talk)语音输入。用户按住空格键录音,音频通过 WebSocket 流式传输到 Anthropic STT 端点(Nova 3),实时转录显示在终端中。
- Push-to-Talk:长按空格键录音,释放后自动发送
- 流式转录:录音过程中实时显示中间转录结果
- 无缝集成:转录文本直接作为用户消息提交到对话
| 操作 | 行为 |
|---|---|
| 长按空格 | 开始录音,显示录音状态 |
| 释放空格 | 停止录音,等待最终转录 |
| 转录完成 | 自动插入到输入框并提交 |
/voice 命令 |
切换语音模式开关 |
- 录音指示器:录音时显示红色/脉冲动画
- 中间转录:录音过程中显示 STT 实时识别文本
- 最终转录:完成后替换中间结果
文件:src/voice/voiceModeEnabled.ts
三层检查:
isVoiceModeEnabled() = hasVoiceAuth() && isVoiceGrowthBookEnabled()- Feature Flag:
feature('VOICE_MODE')— 编译时/运行时开关 - GrowthBook Kill-Switch:
!getFeatureValue_CACHED_MAY_BE_STALE('tengu_amber_quartz_disabled', false)— 紧急关闭开关(默认 false = 未禁用) - Auth 检查:
hasVoiceAuth()— 需要 Anthropic OAuth token(非 API key)
| 模块 | 职责 |
|---|---|
src/voice/voiceModeEnabled.ts |
Feature flag + GrowthBook + Auth 三层门控 |
src/hooks/useVoice.ts |
React hook 管理录音状态和 WebSocket 连接 |
src/services/voiceStreamSTT.ts |
WebSocket 流式传输到 Anthropic STT |
用户按下空格键
│
▼
useVoice hook 激活
│
▼
macOS 原生音频 / SoX 开始录音
│
▼
WebSocket 连接到 Anthropic STT 端点
│
├──→ 中间转录结果 → 实时显示
│
▼
用户释放空格键
│
▼
停止录音,等待最终转录
│
▼
转录文本 → 插入输入框 → 自动提交
支持两种音频后端:
- macOS 原生音频:优先使用,低延迟
- SoX(Sound eXchange):回退方案,跨平台
音频流通过 WebSocket 发送到 Anthropic 的 Nova 3 STT 模型。
- OAuth 独占:语音模式使用
voice_stream端点(claude.ai),仅 Anthropic OAuth 用户可用。API key、Bedrock、Vertex 用户无法使用 - GrowthBook 负向门控:
tengu_amber_quartz_disabled默认false,新安装自动可用(无需等 GrowthBook 初始化) - Keychain 缓存:
getClaudeAIOAuthTokens()首次调用访问 macOS keychain(~20-50ms),后续缓存命中 - 独立于主 feature flag:
isVoiceGrowthBookEnabled()在 feature flag 关闭时短路返回false,不触发任何模块加载
# 启用 feature
FEATURE_VOICE_MODE=1 bun run dev
# 在 REPL 中使用
# 1. 确保已通过 OAuth 登录(claude.ai 订阅)
# 2. 按住空格键说话
# 3. 释放空格键等待转录
# 4. 或使用 /voice 命令切换开关| 依赖 | 说明 |
|---|---|
| Anthropic OAuth | claude.ai 订阅登录,非 API key |
| GrowthBook | tengu_amber_quartz_disabled 紧急关闭 |
| macOS 原生音频 或 SoX | 音频录制 |
| Nova 3 STT | 语音转文本模型 |
| 文件 | 行数 | 职责 |
|---|---|---|
src/voice/voiceModeEnabled.ts |
55 | 三层门控逻辑 |
src/hooks/useVoice.ts |
— | React hook(录音状态 + WebSocket) |
src/services/voiceStreamSTT.ts |
— | STT WebSocket 流式传输 |