
VoiceStudio 是一个完全本地运行的开源语音工作站------克隆声音、设计音色、给视频配音、转录录音、做有声书,646 种语言全覆盖。
读完本文你将了解:安装步骤 | 语音克隆原理 | 系统架构设计 | 适用场景与限制
🎯 这个项目解决什么问题?
做内容创作、做翻译、做无障碍适配,迟早都绕不开「要一段配音」。ElevenLabs 是目前最成熟的商业方案,但按字符收费、数据走云端,一个月下来开销不小。如果你处理的是中文方言、小语种,或者对声纹隐私有要求,SaaS 方案的灵活度和安全性都不太够。
VoiceStudio(📄 GitHub,67069 星)给出了另一条路:全部跑在你自己的机器上 。它不是某个单一功能的脚本,而是一个完整的语音工作站------Electron 桌面应用 + Python 后端,安装后打开界面就能用。
核心能力一览(📄 官方 README):
| 功能 | 说明 |
|---|---|
| 语音克隆 | 3-10 秒参考音频,克隆出可用声线 |
| 语音设计 | 文字描述音色特征,生成自定义声音 |
| 视频配音 | 自动对齐时间轴,多语言配音 |
| 听写 | 浮动挂件,实时转文字 |
| 转录 | 音频转文本 |
| 有声书 | 批量长文本转语音 |
与 ElevenLabs 的关键差异
| 维度 | ElevenLabs | VoiceStudio |
|---|---|---|
| 部署 | 云端 SaaS | 完全本地 |
| 计费 | 按字符收费 | 免费 (AGPL-3.0) |
| 数据流向 | 走云端 | 不出机器 |
| 语言覆盖 | 30+ | 646 |
| 引擎 | 闭源 | 可插拔开源引擎 |
| Agent 集成 | REST API | REST API + MCP 协议 |
ElevenLabs 在效果稳定性和易用性上仍然领先------它的语音自然度、情感控制、实时延迟都是目前最好的。但它的定价对高频使用者不友好,而且声音数据出境在某些场景下是合规红线。VoiceStudio 的定位很明确:不追求超越 ElevenLabs 的效果,而是把「够用的语音合成」做到完全本地、可审计、零边际成本。
默认引擎是 k2-fsa/OmniVoice(📄 官方文档),支持 NVIDIA CUDA、Apple Silicon Metal、CPU 三种加速模式。许可证 AGPL-3.0,商用需开放源码或购买商业授权。
🔧 快速上手
一键安装(macOS / Linux)
bash
curl -fsSL https://voicestudio.sh/install | sh
Windows 用户在 PowerShell 里跑:
powershell
irm https://voicestudio.sh/install | iex
(📄 官方安装文档)安装包提供了 macOS .dmg、Windows .exe、Linux .AppImage / .deb 多种格式,也支持 Docker 部署。
硬件要求
| 硬件 | 加速方式 | 说明 |
|---|---|---|
| NVIDIA GPU | CUDA | 最佳性能(📄 官方文档) |
| Apple Silicon (M1-M4) | Metal (MPS) | 原生加速 |
| 无独显 | CPU | 可用但慢,需约 5GB 磁盘装 CPU 版 PyTorch |
基本使用流程
打开 Electron 应用,进入 Voice Cloning 工作区。选一个内置示范声音,或者拖入 3-10 秒的干净参考录音。输入要合成的文本,首次使用会提示下载模型,按确认即可。点生成,等几秒就能播放。
Docker 部署
不想装 Electron 桌面应用?VoiceStudio 也提供了 Docker 镜像(📄 官方文档 docker.md)。适合在服务器上跑后端 API,前端通过浏览器访问。这对 CI/CD 流水线里自动生成语音、或者给团队共享一个语音服务实例的场景很有用。
从源码运行也行(📄 官方文档):
bash
git clone https://github.com/debpalash/VoiceStudio.git
cd VoiceStudio
bun install
bun run setup:api # 准备 Python 依赖
bun run dev # 启动 Electron 预览
⚙️ 技术原理
语音克隆怎么工作的
语音克隆的核心问题:怎么用几秒钟的参考音频,让模型学会一个人的声纹特征,然后用任意文本生成那个人的声音?
传统做法需要大数据集微调,耗时且效果不稳。现代方案走的是 零样本克隆 路线------模型在大规模多语言语音数据上预训练,推理时把参考音频的声纹特征作为条件输入,直接生成目标声音的语音。
#mermaid-svg-NGWugueK4RsIOmZa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NGWugueK4RsIOmZa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NGWugueK4RsIOmZa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NGWugueK4RsIOmZa .error-icon{fill:#552222;}#mermaid-svg-NGWugueK4RsIOmZa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NGWugueK4RsIOmZa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NGWugueK4RsIOmZa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NGWugueK4RsIOmZa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NGWugueK4RsIOmZa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NGWugueK4RsIOmZa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NGWugueK4RsIOmZa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NGWugueK4RsIOmZa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NGWugueK4RsIOmZa .marker.cross{stroke:#333333;}#mermaid-svg-NGWugueK4RsIOmZa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NGWugueK4RsIOmZa p{margin:0;}#mermaid-svg-NGWugueK4RsIOmZa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NGWugueK4RsIOmZa .cluster-label text{fill:#333;}#mermaid-svg-NGWugueK4RsIOmZa .cluster-label span{color:#333;}#mermaid-svg-NGWugueK4RsIOmZa .cluster-label span p{background-color:transparent;}#mermaid-svg-NGWugueK4RsIOmZa .label text,#mermaid-svg-NGWugueK4RsIOmZa span{fill:#333;color:#333;}#mermaid-svg-NGWugueK4RsIOmZa .node rect,#mermaid-svg-NGWugueK4RsIOmZa .node circle,#mermaid-svg-NGWugueK4RsIOmZa .node ellipse,#mermaid-svg-NGWugueK4RsIOmZa .node polygon,#mermaid-svg-NGWugueK4RsIOmZa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NGWugueK4RsIOmZa .rough-node .label text,#mermaid-svg-NGWugueK4RsIOmZa .node .label text,#mermaid-svg-NGWugueK4RsIOmZa .image-shape .label,#mermaid-svg-NGWugueK4RsIOmZa .icon-shape .label{text-anchor:middle;}#mermaid-svg-NGWugueK4RsIOmZa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NGWugueK4RsIOmZa .rough-node .label,#mermaid-svg-NGWugueK4RsIOmZa .node .label,#mermaid-svg-NGWugueK4RsIOmZa .image-shape .label,#mermaid-svg-NGWugueK4RsIOmZa .icon-shape .label{text-align:center;}#mermaid-svg-NGWugueK4RsIOmZa .node.clickable{cursor:pointer;}#mermaid-svg-NGWugueK4RsIOmZa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NGWugueK4RsIOmZa .arrowheadPath{fill:#333333;}#mermaid-svg-NGWugueK4RsIOmZa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NGWugueK4RsIOmZa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NGWugueK4RsIOmZa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NGWugueK4RsIOmZa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NGWugueK4RsIOmZa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NGWugueK4RsIOmZa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NGWugueK4RsIOmZa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NGWugueK4RsIOmZa .cluster text{fill:#333;}#mermaid-svg-NGWugueK4RsIOmZa .cluster span{color:#333;}#mermaid-svg-NGWugueK4RsIOmZa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NGWugueK4RsIOmZa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NGWugueK4RsIOmZa rect.text{fill:none;stroke-width:0;}#mermaid-svg-NGWugueK4RsIOmZa .icon-shape,#mermaid-svg-NGWugueK4RsIOmZa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NGWugueK4RsIOmZa .icon-shape p,#mermaid-svg-NGWugueK4RsIOmZa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NGWugueK4RsIOmZa .icon-shape .label rect,#mermaid-svg-NGWugueK4RsIOmZa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NGWugueK4RsIOmZa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NGWugueK4RsIOmZa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NGWugueK4RsIOmZa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 参考音频
3-10秒
声纹特征提取
目标文本
文本编码
模型推理
生成语音
OmniVoice 引擎(📄 官方文档)就是这条路线的实现:在大量语音数据上预训练,支持 646 种语言,推理时不需要额外微调。这也是 VoiceStudio 能做到「装上就能用」的底层原因------模型已经预训练好了,用户只是提供声纹参考和文本输入。
OmniVoice 的 token 化策略把语音切成离散单元,类比文字的 BPE 分词。不同引擎的 token 化粒度不同------切太粗会丢声纹细节,切太细会增加序列长度、降低推理速度。这也是为什么 VoiceStudio 支持多引擎切换:不同场景的最优 token 化策略不一样。短文本克隆适合细粒度 token,长文本批量合成则要兼顾速度。
工作流与配方系统
除了单次生成,VoiceStudio 还有两个面向批量的设计:Reusable Recipes 和 Watch Folders。配方(Recipe)把常用的语音合成参数组合保存下来------引擎选择、语速、采样率、参考音频------下次直接复用,不用每次重新调参。Watch Folders 更进一步:指定一个文件夹,拖进去的文本文件会被自动按预设配方批量生成语音。做有声书、播客批量出片的时候,这个功能省掉大量重复操作(📄 官方文档)。
引擎可插拔设计
VoiceStudio 不绑定单一引擎。默认用 OmniVoice,但架构上预留了引擎切换能力(📄 官方文档 feature-catalog)。后端目录结构(📄 GitHub API 实测):
| 目录 | 职责 |
|---|---|
backend/engines/ |
语音引擎适配层 |
backend/api/ |
REST API 接口 |
backend/mcp_server.py |
MCP 协议服务,给 AI Agent 调用 |
backend/core/ |
核心逻辑 |
backend/services/ |
业务服务 |
backend/plugins/ |
插件系统 |
electron/ |
桌面 UI |
#mermaid-svg-OZWyKqngm7aFeiTK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OZWyKqngm7aFeiTK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OZWyKqngm7aFeiTK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OZWyKqngm7aFeiTK .error-icon{fill:#552222;}#mermaid-svg-OZWyKqngm7aFeiTK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OZWyKqngm7aFeiTK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OZWyKqngm7aFeiTK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OZWyKqngm7aFeiTK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OZWyKqngm7aFeiTK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OZWyKqngm7aFeiTK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OZWyKqngm7aFeiTK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OZWyKqngm7aFeiTK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OZWyKqngm7aFeiTK .marker.cross{stroke:#333333;}#mermaid-svg-OZWyKqngm7aFeiTK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OZWyKqngm7aFeiTK p{margin:0;}#mermaid-svg-OZWyKqngm7aFeiTK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OZWyKqngm7aFeiTK .cluster-label text{fill:#333;}#mermaid-svg-OZWyKqngm7aFeiTK .cluster-label span{color:#333;}#mermaid-svg-OZWyKqngm7aFeiTK .cluster-label span p{background-color:transparent;}#mermaid-svg-OZWyKqngm7aFeiTK .label text,#mermaid-svg-OZWyKqngm7aFeiTK span{fill:#333;color:#333;}#mermaid-svg-OZWyKqngm7aFeiTK .node rect,#mermaid-svg-OZWyKqngm7aFeiTK .node circle,#mermaid-svg-OZWyKqngm7aFeiTK .node ellipse,#mermaid-svg-OZWyKqngm7aFeiTK .node polygon,#mermaid-svg-OZWyKqngm7aFeiTK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OZWyKqngm7aFeiTK .rough-node .label text,#mermaid-svg-OZWyKqngm7aFeiTK .node .label text,#mermaid-svg-OZWyKqngm7aFeiTK .image-shape .label,#mermaid-svg-OZWyKqngm7aFeiTK .icon-shape .label{text-anchor:middle;}#mermaid-svg-OZWyKqngm7aFeiTK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OZWyKqngm7aFeiTK .rough-node .label,#mermaid-svg-OZWyKqngm7aFeiTK .node .label,#mermaid-svg-OZWyKqngm7aFeiTK .image-shape .label,#mermaid-svg-OZWyKqngm7aFeiTK .icon-shape .label{text-align:center;}#mermaid-svg-OZWyKqngm7aFeiTK .node.clickable{cursor:pointer;}#mermaid-svg-OZWyKqngm7aFeiTK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OZWyKqngm7aFeiTK .arrowheadPath{fill:#333333;}#mermaid-svg-OZWyKqngm7aFeiTK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OZWyKqngm7aFeiTK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OZWyKqngm7aFeiTK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OZWyKqngm7aFeiTK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OZWyKqngm7aFeiTK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OZWyKqngm7aFeiTK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OZWyKqngm7aFeiTK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OZWyKqngm7aFeiTK .cluster text{fill:#333;}#mermaid-svg-OZWyKqngm7aFeiTK .cluster span{color:#333;}#mermaid-svg-OZWyKqngm7aFeiTK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OZWyKqngm7aFeiTK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OZWyKqngm7aFeiTK rect.text{fill:none;stroke-width:0;}#mermaid-svg-OZWyKqngm7aFeiTK .icon-shape,#mermaid-svg-OZWyKqngm7aFeiTK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OZWyKqngm7aFeiTK .icon-shape p,#mermaid-svg-OZWyKqngm7aFeiTK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OZWyKqngm7aFeiTK .icon-shape .label rect,#mermaid-svg-OZWyKqngm7aFeiTK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OZWyKqngm7aFeiTK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OZWyKqngm7aFeiTK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OZWyKqngm7aFeiTK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Electron Desktop UI
Backend API
Python / FastAPI
Engine Layer
OmniVoice
k2-fsa 默认
其他引擎
可扩展
MCP Server
AI Agents
Claude / Cursor / Codex
Model Manager
本地模型
PyTorch / CUDA / MPS
MCP Server 是一个值得展开的点。VoiceStudio 内置了 MCP 协议支持,意味着 Claude Code、Cursor、Codex 这些 AI 编程助手可以直接通过 MCP 调用语音合成能力------不用写胶水代码,Agent 自动完成「生成语音 → 保存文件 → 嵌入项目」的流程(📄 官方文档 agentic-voice.md)。
MCP 的工作方式:后端启动时自动注册一组工具(如 generate_speech、clone_voice、list_voices),Agent 通过标准 MCP 握手发现这些工具,然后像调用函数一样使用它们。开发者不需要在 Agent 和 VoiceStudio 之间写任何桥接代码。这意味着一个 Cursor 用户可以在对话框里直接说「给这段旁白配一个中年男性中文声音」,Agent 自己去调 VoiceStudio 的 MCP 接口完成生成------从写代码到配音,不用切窗口。
✅ 优缺点 & 适用场景
优点
- 完全本地:数据不出机器,声纹隐私有保障
- 646 种语言:覆盖面远超大多数商业方案
- 多引擎架构:不绑定单一模型,可扩展
- MCP 协议:AI Agent 可直接调用,自动化场景友好
- 一键安装:非开发者也跑得起来
限制
- AGPL-3.0:商用需开放源码或购买商业授权
- 模型下载体积:首次使用要下模型,几 GB 起步
- 硬件依赖:CPU 模式可用但慢,好的 GPU 或 Apple Silicon 体验差距明显
- Windows on ARM:实验性支持,验证未完成(📄 官方文档)
适用场景
| 场景 | 适合度 |
|---|---|
| 个人创作者配音 | ⭐⭐⭐⭐⭐ |
| 多语言内容本地化 | ⭐⭐⭐⭐⭐ |
| 有声书制作 | ⭐⭐⭐⭐ |
| 隐私敏感的语音处理 | ⭐⭐⭐⭐⭐ |
| 大规模商业 SaaS | ⭐⭐(AGPL 限制) |
VoiceStudio GitHub: https://github.com/debpalash/VoiceStudio
许可证: AGPL-3.0