feat: transcribe_voice 新增 OpenAI Whisper API 后端 (#66)

默认 local,零行为变化。opt-in 双因素:transcription_backend=openai
且 openai_api_key 都齐才生效;任一缺失静默回退 local + stderr 一行警告。
首次进入云路径会 stderr 警告"语音将上传至 OpenAI 服务器"。

新增 config.json 字段:
- transcription_backend: "local" (默认) | "openai"
- local_whisper_model: "base" (替换 mcp_server.py 里硬编码 DEFAULT_WHISPER_MODEL)
- openai_api_key: "" (默认空;openai 包为 optional,按需 pip install)

关键技术选择:
- _transcribe(wav, backend) 单一 if/else 分发,不引入插件/工厂层
  (Rule of Three —— 只有一个云后端时不值得抽象)
- 文件 > 25MB 在 OpenAI() 实例化之前提前拒绝,避免无谓上传
- 错误分类清晰: 缺 key / 缺 openai 包 / 401 / 429 / APIError 各自的提示
- PR #58 缓存 schema 自然扩展: 条目加 backend 字段,命中需 backend+model_size 都匹配
- 旧条目缺 backend 字段视为 "local",向前兼容 PR #58 已落盘的所有数据
- transcribe_chat.py 批量 CLI 与 MCP 工具共享同一份配置,保持一致

新增 2 个测试 (tests/test_openai_backend.py),只覆盖回归风险最高的两条:
- 文件 > 25MB 必须在 SDK 实例化前拒绝(隐私契约的防线)
- backend 不匹配的旧条目不命中(避免切后端时返回错后端结果)

其余路径要么琐碎(默认值读取)、要么坏掉时声音很大(SDK 错误、ImportError),
要么已被 PR #58 现有测试隐式覆盖(缺 backend 字段的旧条目),不再单独写测试。

顺手把 README 里 PR #53 漏掉的 voice 三件套(get_voice_messages /
decode_voice / transcribe_voice)补进 MCP 工具表,并新增"⚠️ 语音转录隐私"
章节说清数据流向、成本(约 \$0.006/分钟)、25MB 上限、回退行为。

Closes ylytdeng/wechat-decrypt#59
This commit is contained in:
btc-z
2026-05-01 01:56:32 -04:00
committed by GitHub
parent 989badd14f
commit 66eddaff0e
6 changed files with 306 additions and 32 deletions

View File

@@ -196,11 +196,35 @@ claude mcp add wechat -- python C:\Users\你的用户名\wechat-decrypt\mcp_serv
| `get_contact_tags()` | 列出所有联系人标签及成员数量 |
| `get_tag_members(tag_name)` | 获取指定标签下的所有联系人,支持模糊匹配 |
| `get_new_messages()` | 获取自上次调用以来的新消息 |
| `get_voice_messages(chat_name)` | 列出某会话所有语音消息local_id、时长、时间戳 |
| `decode_voice(chat_name, local_id)` | 解码 SILK 语音为本地 WAV 文件 |
| `transcribe_voice(chat_name, local_id)` | 转录语音为文字(自动检测语言) |
前置条件:需要先运行 `python main.py``python find_all_keys.py` 完成密钥提取。
说明:`search_messages``limit` 最大为 `500``get_chat_history` 支持更大的 `limit`,但消息很多时仍建议配合 `offset` 分页读取。
#### ⚠️ 语音转录隐私
`transcribe_voice` 默认使用本地 WhisperCPU数据全程留在本机。`transcribe_chat.py` 批量 CLI 共享同一份配置。
如需切换到 OpenAI Whisper API更快、Mandarin 精度更高),在 `config.json` 中:
```json
{
"transcription_backend": "openai",
"openai_api_key": "sk-..."
}
```
启用后**语音文件会上传至 OpenAI 服务器**进行转录。需 `pip install openai`
- 成本:约 $0.006 / 分钟OpenAI 计价)
- 文件 > 25MB 在上传前被拒绝OpenAI 上限)
- 首次启用云后端时 stderr 会打一行警告
- `transcription_backend``openai_api_key` 任一缺失时静默回退 local
- 切换后端后旧缓存条目backend 不匹配)会自动重新转录
**[查看使用案例 →](USAGE.md)**
### 图片解密 (V2 格式)