feat: 集成豆包 ASR 语音识别后端,支持 /voice doubao 切换 (#357)

* feat: 集成豆包 ASR 语音识别后端,支持 /voice doubao 切换

- 新增 src/services/doubaoSTT.ts 适配模块,将 doubaoime-asr 的
  AsyncGenerator 协议适配为现有 VoiceStreamConnection 接口
- /voice doubao 启用豆包后端,/voice 使用默认 Anthropic 后端
- 后端选择持久化到 settings.json 的 voiceProvider 字段
- 豆包后端跳过 Anthropic OAuth 认证、语言限制和 Focus Mode
- 豆包后端松手即出结果,跳过 processing 状态
- 凭证文件存放在 ~/.claude/tts/doubao/credentials.json
- doubaoime-asr 作为 optionalDependencies 安装
- 移除 /voice 命令的 claude-ai 可用性限制,所有用户可用

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* docs: 更新 Voice Mode 文档,添加豆包 ASR 后端说明和致谢

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
claude-code-best
2026-04-25 13:57:30 +08:00
committed by GitHub
parent ad09f38fd1
commit 2e7fc428cd
13 changed files with 545 additions and 89 deletions

View File

@@ -44,11 +44,18 @@ export function hasVoiceAuth(): boolean {
}
/**
* Full runtime check: auth + GrowthBook kill-switch. Callers: `/voice`
* (voice.ts, voice/index.ts), ConfigTool, VoiceModeNotice — command-time
* paths where a fresh keychain read is acceptable. For React render
* paths use useVoiceEnabled() instead (memoizes the auth half).
* Full runtime check for Anthropic voice_stream backend.
* Returns true when both auth + GrowthBook kill-switch pass.
*/
export function isVoiceModeEnabled(): boolean {
return hasVoiceAuth() && isVoiceGrowthBookEnabled()
}
/**
* Check if voice mode can be activated with any STT backend.
* Always returns true when VOICE_MODE feature flag is on and GrowthBook
* kill-switch is off — the Doubao backend does not require Anthropic auth.
*/
export function isVoiceAvailable(): boolean {
return isVoiceGrowthBookEnabled()
}