02 — 架构

进程模型

Vocal10n 由两个协作进程运行:

flowchart LR
    App["vocal10n.app<br/>(venv_main)<br/>PySide6 UI · STT · LLM"]
    SoVITS["GPT-SoVITS api_v2.py<br/>(venv_tts subprocess)"]
    Qwen3["Qwen3-TTS server<br/>(venv_qwen3tts subprocess)"]
    OBS["OBS Browser Source"]

    App <-->|"HTTP :9880"| SoVITS
    App <-.->|"HTTP (alt backend)"| Qwen3
    App -->|"HTTP :5124"| OBS

选择 Qwen3-TTS 后端时,会从 vocal10n.tts.qwen3_server 启动额外托管子进程。任意时刻仅有一个 TTS 后端激活;UI 通过 tts_container_tab 切换。

线程模型

主进程由 Qt 主线程和少量工作线程组成。边界由 vocal10n.pipeline.events 中的 EventDispatcher(发布/订阅)定义。

线程所属职责
Qt 主线程QApplicationUI、signal/slot 分发、SystemState 读写
STTWorkervocal10n.stt.worker拉取音频帧、运行 Whisper、发布文本事件
AudioCapture 回调sounddevice麦克风块 → 环形缓冲 + AEC
LLMWorker(位于 LLMControllervocal10n.llm.controller翻译 confirmed 与 pending 文本
TTSQueue 工作线程vocal10n.tts.queue拉取翻译文本并调用 TTS HTTP API
音频播放线程vocal10n.tts.audio_outputsounddevice 输出流 + 交叉淡化
文件写入线程vocal10n.pipeline.file_writer异步 SRT/TXT/WAV I/O
GPU 监控线程vocal10n.utils.gpu周期性采样显存/利用率

SystemStatevocal10n.state.SystemState)是带 threading.RLockQObject。每个属性 setter 都会发出 Qt 信号,UI 组件无需轮询即可绑定。

数据流(Happy Path)

flowchart TD
    Mic(["mic chunk"]) --> Cap["AudioCapture<br/>16 kHz mono · 0.2 s"]
    Cap --> AEC["AEC<br/>NLMS + double-talk detector"]
    AEC --> Whisper["Whisper sliding window<br/>window_seconds = 6.5"]
    Whisper --> Segs["STTEngine.transcribe<br/>SegmentResult[]"]
    Segs --> Filt["HallucinationFilter<br/>dedup · phonetic correction"]

    Filt --> Partial{{"STT_PARTIAL"}}
    Filt --> Confirmed{{"STT_CONFIRMED"}}

    Partial --> OBSlive["OBS overlay<br/>(live)"]

    Confirmed --> LLMp["LLMController.translate_pending"]
    Confirmed --> LLMc["LLMController.translate_confirmed"]

    LLMp --> TPartial{{"TRANSLATION_PARTIAL"}}
    LLMc --> TConfirmed{{"TRANSLATION_CONFIRMED"}}

    TPartial --> OBSlive
    TConfirmed --> Q["TTSQueue.enqueue"]
    TConfirmed --> FW["FileWriter<br/>TXT · SRT"]
    TConfirmed --> OBS2["OBS overlay<br/>(confirmed)"]

    Q --> HTTP["TTS HTTP"] --> Play["AudioPlayer"]

模块映射

src/vocal10n/
├── app.py              # 入口:创建 QApplication、主题、状态、MainWindow。
├── config.py           # YAML 加载、点号键访问、get_config 单例。
├── constants.py        # 枚举:Language、ModelStatus、EventType。
├── state.py            # SystemState QObject(线程安全、发信号)。

├── stt/
│   ├── audio_capture.py
│   ├── playback_aec.py
│   ├── engine.py
│   ├── filters.py
│   ├── transcript.py
│   ├── diarizer.py
│   ├── controller.py
│   └── worker.py

├── llm/
│   ├── engine.py
│   ├── api_backend.py
│   ├── corrector.py
│   ├── translator.py
│   ├── rag.py
│   └── controller.py

├── tts/
│   ├── client.py
│   ├── server_manager.py
│   ├── queue.py
│   ├── audio_output.py
│   ├── controller.py
│   ├── qwen3_server.py
│   ├── qwen3_client.py
│   └── qwen3_controller.py

├── pipeline/
│   ├── events.py
│   ├── coordinator.py
│   ├── latency.py
│   └── file_writer.py

├── obs/
│   ├── server.py
│   └── overlay.html

├── ui/
│   ├── main_window.py
│   ├── section_a.py
│   ├── section_b.py
│   ├── tabs/
│   ├── widgets/
│   └── styles/theme.qss

└── utils/
    ├── gpu.py
    └── logger.py

完整仓库目录见 03 — 仓库结构