进阶 docs.voicebox.sh 2026-10-11 09:58:06 · 19 阅读

第20章 架构

开发者架构理解 Voicebox 的技术架构

系统概览

Voicebox 采用客户端-服务器架构:React 前端 + Python 后端。桌面应用基于 Tauri 构建,包含两个主要层次:

  • 前端层:React 应用,负责 UI 组件、Zustand 状态管理和 React Query(TanStack Query)数据请求。
  • 后端层:Python FastAPI 服务器,提供 REST API,运行可插拔的 TTS/STT 引擎注册表,管理 SQLite 数据库,并处理音频。

两层通过 localhost:17493 上的 HTTP 通信,前端向后端发起 API 请求。生产环境中后端用 PyInstaller 打包,作为 Tauri sidecar 启动;开发环境下则手动通过 uvicorn 运行。

前端架构

技术栈

  • 框架:React 18 + TypeScript
  • 状态管理:Zustand stores
  • 数据请求:React Query(TanStack Query)
  • 样式:Tailwind CSS
  • 音频:WaveSurfer.js
  • 桌面端:Tauri(Rust)

组件结构

后端架构

技术栈

  • 框架:FastAPI(Python 3.12)
  • TTS 引擎:Qwen3-TTS、Qwen CustomVoice、LuxTTS、Chatterbox、Chatterbox Turbo、TADA、Kokoro
  • 语音识别:Whisper(PyTorch 或 MLX-Whisper)
  • 推理后端:MLX(Apple Silicon)、PyTorch(CUDA / ROCm / XPU / DirectML / CPU)
  • 数据库:SQLite(通过 SQLAlchemy)
  • 音频:librosa、soundfile、Pedalboard

目录结构

app.pymain.pyconfig.pymodels.pyserver.pybuild_binary.py

请求流程

HTTP 请求进入路由处理器,由其校验输入并委托给 service 函数。service 通过注册表调用相应的引擎后端执行实际推理,音频后处理(裁剪、重采样、效果器)则由 utils 完成。

路由处理器刻意保持精简——只做输入校验、委托 service、格式化响应。所有业务逻辑都放在 services/ 目录。

多引擎注册表

后端的设计让新增 TTS 引擎只需修改 backends/ 目录和中央注册表,路由和 service 中没有任何针对特定引擎的分支逻辑。

  • TTSBackend Protocol(backends/__init__.py)——定义每个引擎需实现的接口:load_model、create_voice_prompt、combine_voice_prompts、generate、unload_model、is_loaded、_get_model_path。
  • ModelConfig dataclass——每个模型变体的中央元数据记录:model_name、display_name、engine、hf_repo_id、size_mb、needs_trim、languages、supports_instruct 等。
  • TTS_ENGINES dict——将引擎名("qwen"、"kokoro" 等)映射到显示名。
  • get_tts_backend_for_engine(engine)——线程安全的工厂函数,通过双重检查锁延迟实例化并缓存引擎后端。

已内置的引擎:

引擎标识显示名称Profile 类型qwenQwen TTSClonedqwen_custom_voiceQwen CustomVoicePresetluxttsLuxTTSClonedchatterboxChatterbox TTSClonedchatterbox_turboChatterbox TurboClonedtadaTADAClonedkokoroKokoroPreset

完整接口规范和集成阶段请参见 TTS Engines,候选评估中的引擎见 PROJECT_STATUS.md。

关键模块

  • app.py——FastAPI 应用工厂、CORS、生命周期事件
  • main.py——入口(导入 app,运行 uvicorn)
  • server.py——Tauri sidecar 启动器、父进程 PID 看门狗、frozen 构建环境设置
  • services/generation.py——单个函数处理所有生成模式(generate、retry、regenerate)
  • services/task_queue.py——GPU 推理的串行生成队列
  • backends/__init__.py——Protocol 定义、ModelConfig 注册表和引擎工厂
  • backends/base.py——所有引擎实现共享的工具(设备选择、进度跟踪、输出裁剪)

推理后端选择

服务器在启动时检测最佳推理后端,所有支持它的引擎都会使用:

平台后端加速方式macOS(Apple Silicon)MLXMetal / Neural EngineWindows / Linux(NVIDIA)PyTorchCUDA(cu128)Linux(AMD)PyTorchROCmWindows / Linux(Intel Arc)PyTorchXPU(IPEX)Windows(其他 GPU)PyTorchDirectML任意平台PyTorchCPU 回退

各平台的说明和手动覆盖方法见 GPU Acceleration。

数据模型

核心表(见 backend/database/models.py):

  • profiles——音色档案,通过 voice_type 区分(cloned | preset | designed),包含 preset_engine、preset_voice_id 和 default_engine。
  • profile_samples——cloned 档案的参考音频片段和转写文本,preset 档案为空。
  • generations——生成的音频,记录文本、引擎、模型、语言、seed 和时长。
  • generation_versions——同一次生成的不同效果器链处理版本。
  • audio_channels + channel_device_mappings + profile_channel_mappings——多输出路由。

详见 Voice Profiles 和 Effects Pipeline。

桌面应用(Tauri)

Rust 后端

Cargo.tomltauri.conf.jsonsrc/

职责

  • 以 sidecar 进程启动 Python 后端
  • 原生文件对话框
  • 系统托盘集成
  • 自动更新(Tauri updater + 自定义 CUDA 后端替换)
  • 父进程 PID 看门狗,应用崩溃时后端随之退出

构建流程

开发

just dev # 启动后端 + Tauri 应用 just dev-web # 启动后端 + Web 应用(无 Tauri) just dev-backend # 仅后端 just dev-frontend # 仅 Tauri 应用(后端需已在运行)

生产

just build # CPU 服务器二进制 + Tauri 安装包 just build-local # CPU + CUDA 二进制 + Tauri 安装包(Windows) just build-server # 仅服务器二进制 just build-tauri # 仅 Tauri 应用

PyInstaller 的具体工作方式,以及 CUDA 二进制如何拆分打包,参见 Building。

数据流

生成流程

  1. 用户输入——在 React 组件中输入文本,选择引擎和档案
  2. 状态更新——Zustand 生成表单 store 记录请求
  3. API 请求——React Query mutation 调用 POST /generate
  4. 路由——routes/generate.py 校验输入,分发给 services/generation.py
  5. 音色提示——service 通过引擎后端创建或读取缓存的 voice prompt
  6. 队列——services/task_queue.py 串行化生成任务,避免 GPU 争抢
  7. 推理——引擎后端执行 generate(),返回音频和采样率
  8. 后处理——可选裁剪(部分引擎需要),按 generation 版本应用效果器链
  9. 存储——音频写入 generations 目录,元数据保存到 SQLite
  10. 响应——后端返回生成记录;前端更新 React Query 缓存并播放音频

性能考量

前端

  • 代码分割——路由懒加载
  • 记忆化——重型组件使用 React.memo
  • 虚拟滚动——用于长列表
  • 防抖——搜索和输入处理

后端

  • 异步 I/O——所有 I/O 均为异步;推理通过 asyncio.to_thread 运行
  • 串行任务队列——避免多个引擎争抢 GPU
  • Voice prompt 缓存——按引擎区分,以音频哈希 + 参考文本为键
  • 模型固定——每个引擎同时只加载一个模型,切换时卸载前一个
  • 引擎后端缓存——每个引擎在每个进程中只实例化一次

安全性

现状

  • 默认仅限本机(绑定 127.0.0.1:17493)
  • 无身份验证(信任 localhost)
  • 通过 Tauri 实现文件系统沙箱

规划中

  • 远程模式的 API key 认证
  • 用户账户
  • 速率限制
  • HTTPS 支持

部署模式

本地模式

  • 后端以 sidecar 方式运行
  • 所有数据保留在本机
  • 无需联网

远程模式

  • 后端运行在另一台机器上(Docker 或裸机)
  • 前端(桌面端或 Web)通过 HTTP 连接
  • 详见 Remote Mode 和 Docker

下一步

开发环境搭建配置你的开发环境TTS Engines如何添加新引擎Contributing参与 Voicebox 开发在 GitHub 上编辑开发环境搭建配置 Voicebox 的本地开发环境Contributing如何为 Voicebox 做贡献

评论 (0)