mirror of
https://github.com/aiclientproxy/proxycast.git
synced 2026-09-24 23:10:56 +08:00
voice/ - 语音输入模块
语音输入功能的 Tauri 后端模块,提供全局快捷键、悬浮窗、ASR 识别、LLM 润色等功能。
文件索引
| 文件 | 说明 |
|---|---|
mod.rs |
模块入口,导出子模块 |
asr_service.rs |
ASR 桥接层(纯逻辑已迁移到 crates/services/src/voice_asr_service.rs) |
commands.rs |
Tauri 命令,供前端调用 |
config.rs |
配置桥接层(纯逻辑已迁移到 crates/services/src/voice_config_service.rs) |
output_service.rs |
输出桥接层(纯逻辑已迁移到 crates/services/src/voice_output_service.rs) |
processor.rs |
润色桥接层(纯逻辑已迁移到 crates/services/src/voice_processor_service.rs) |
recording_service.rs |
录音桥接层(纯逻辑已迁移到 crates/services/src/voice_recording_service.rs) |
shortcut.rs |
全局快捷键管理 |
window.rs |
悬浮窗管理 |
录音服务架构
由于 cpal::Stream 不实现 Send trait,无法直接在 Tauri 的 async 命令中使用。
录音服务采用独立线程 + channel 通信的方案:
┌─────────────────┐ Command ┌─────────────────┐
│ Tauri Command │ ───────────────> │ Recording │
│ (async) │ │ Thread │
│ │ <─────────────── │ (owns Stream) │
└─────────────────┘ Response └─────────────────┘
录音命令
| 命令 | 说明 |
|---|---|
start_recording |
开始录音 |
stop_recording |
停止录音,返回音频数据 |
cancel_recording |
取消录音 |
get_recording_status |
获取录音状态(是否录音中、音量、时长) |
依赖关系
voice/
├── asr_service.rs ──→ lime-services (voice_asr_service)
├── recording_service.rs ──→ lime-services (voice_recording_service)
├── config.rs ──→ lime-services (voice_config_service)
├── output_service.rs ──→ lime-services (voice_output_service)
├── processor.rs ──→ lime-services (voice_processor_service)
└── commands.rs ──→ 上述所有服务
ASR 服务支持
| Provider | 状态 | 说明 |
|---|---|---|
| Whisper Local | ✅ | 本地离线识别,需下载模型文件 |
| OpenAI Whisper | ✅ | 云端 API,支持自定义 base_url |
| 百度语音 | ✅ | 云端 API |
| 讯飞语音 | ✅ | WebSocket 流式识别 |
云端回退机制
当云端 ASR 服务(OpenAI、百度、讯飞)失败时,系统会自动回退到本地 Whisper 进行识别:
- 首先尝试用户选择的云端服务
- 如果云端失败,记录警告日志
- 自动查找已配置的本地 Whisper 凭证
- 使用本地 Whisper 进行回退识别
- 如果回退也失败,返回详细错误信息
Whisper 模型文件
模型文件存储路径:~/Library/Application Support/lime/models/whisper/
下载地址:https://huggingface.co/ggerganov/whisper.cpp/tree/main
| 模型 | 文件名 | 大小 |
|---|---|---|
| tiny | ggml-tiny.bin |
~75MB |
| base | ggml-base.bin |
~142MB |
| small | ggml-small.bin |
~466MB |
| medium | ggml-medium.bin |
~1.5GB |