OmniVoice Studio:把 ElevenLabs 焊回你自己的机器
OmniVoice Studio:把 ElevenLabs 焊回你自己的机器
昨天有个朋友问我,他要给一个五十条 YouTube 教程做中文配音,试了半天 ElevenLabs,账单预估 300 美元/月,还得先把视频音轨上传到别人服务器。
我把 debpalash/OmniVoice-Studio 甩过去。
一小时后他回消息:跑起来了,一个 python 都没有再装,MP4 拖进去出 SRT 出配音,喉音也克隆到了。
这不是一个"我又发现了一个宝藏项目"的故事。这是一个当"云语音"变成必需品之后,本地端能做到什么程度的现场检查。
一、这个项目要解决的具体矛盾
它自己在 README 顶部写得很直:
Your voice is the most personal data you have. So why rent it back from a cloud?
翻译过来更直接:你的语音是你最私人的数据,你为什么要按月租回来。
ElevenLabs 是"按 character 收费 + 音频上传到云端"的路径;OmniVoice Studio 走的是"按你自己的显卡跑 + 全部数据不出网"。这不是 zero-sum:ElevenLabs 的调度、后处理、企业合规确实有它的市场;但如果你只是想做几十条视频配音、几本有声书、把一台 Mac 变成随时能听写的口述工具,本地路径不再是"技术玩票",而是可以做完整活。
关键区别我抄一段官方对照表(数据以仓库 README 为准):
| ElevenLabs | OmniVoice Studio | |
|---|---|---|
| 定价 | $5–$330/mo,按字符 | 免费开源(AGPL-3.0) |
| 克隆 | 3 秒片段 | 3 秒片段,zero-shot |
| 语言 | 32 | 646 |
| 视频配音 | 云端 | 完全本地 |
| API key | 必需 | 不需要 |
| GPU | 云端 | CUDA · Apple Silicon MPS · ROCm · CPU |
| TTS 引擎 | 1 | 14 |
| ASR 引擎 | 1 | 10 |
| MCP server | 无 | 有 |
数量不重要,工程重要。下面按"它到底怎么把这些做出来"拆。
二、它的心智模型:一份 picker + 一份 OpenAI 兼容 API
第一次装完 OmniVoice Studio,Launchpad 长这样:

上面挂了六块工作台:Studio(生成 + 克隆一体)、Voice Design(造音色)、Voice Gallery(音色库)、Video Dubbing(视频配音)、Stories/Audiobook(长音频)、Dictation(听写)。每一块共享同一件东西——当前激活的 TTS / ASR / LLM 引擎。
它没有为每个工作台各自选一次引擎。它把这三个族全放在 Settings → Engines 一张表里,全局切换:

这个决定比看起来重要。多数开源语音项目要么每次任务里下拉选一个引擎(生成/配音/听写各选一次,一致性直接崩),要么用环境变量指定(改一次要重启)。OmniVoice Studio 允许 UI 切但同时保留环境变量兜底:OMNIVOICE_TTS_BACKEND / OMNIVOICE_ASR_BACKEND 一旦设了,就锁定,UI 不再能改——这是给部署方留的一根钉子,防止运行时被误改。
14 TTS × 10 ASR 的矩阵
TTS 侧的完整名单(从 README 抄,删除了不必要的表情):
- 默认 OmniVoice(600+ 语言)永远可用
- 自动检测的 opt-in:CosyVoice 3、GPT-SoVITS、VoxCPM2、MOSS-TTS-Nano、KittenTTS、MLX-Audio、Sherpa-ONNX
- 惰性安装的重量级(首次用到才装):IndexTTS 2、OmniVoice GGUF、Supertonic 3、MOSS-TTS-v1.5(8B)、dots.tts(2B)、Confucius4-TTS
ASR 侧同样是分层的:WhisperX 是跨平台默认(word-level timing),此外还有 Faster-Whisper / Faster-Whisper Isolated(子进程隔离)/ MLX Whisper / PyTorch Whisper / Parakeet TDT / Moonshine / FunASR / sherpa-onnx(实时听写)/ OpenAI-compatible(可以指向 Qwen3-ASR)。
“隔离子进程"这一条值得单独讲:Faster-Whisper (isolated) 是把 ASR 跑在独立进程里,一次崩溃不再拖垮整个 app——这不是所有项目会做的选择,是从生产事故里长出来的模式。
一份 OpenAI 兼容 API:localhost:3900/v1
我最欣赏的设计是它把上面这一堆全部套了一层 OpenAI 兼容协议:

三个接口:
POST /v1/audio/speech → 文本进,音频出(mp3/wav/flac/opus/pcm)
POST /v1/audio/transcriptions → 音频进,文本出(json/text/verbose_json/srt/vtt)
GET /v1/audio/voices → 扩展:列出你所有克隆音色 + 引擎
意思是:你所有已经写好、指向 OpenAI 的脚本、agent、workflow,把 base_url 从 api.openai.com/v1 换成 localhost:3900/v1,一行代码都不用改。voice 参数吃你本地的克隆音色 ID,model=tts-1 自动映射到当前激活的引擎。
from openai import OpenAI
client = OpenAI(base_url="http://localhost:3900/v1", api_key="none") # 任意字符串都行
# 用你的克隆音色合成
result = client.audio.speech.create(
model="tts-1",
voice="my-cloned-voice-id",
input="生成在我自己的显卡上。",
)
这一层是本地语音的"标准化接头”。有了它,之后任何 agent 生态(Claude Code、Cursor、langchain 的 workflow)都能直接用。
三、视频配音:从"识别 → 翻译 → 克隆"到"这条对不上时间轴"
这是 Video Dubbing 的工作台:

真实的配音流水线是这样的:YouTube URL 或 MP4 → 音源分离(Demucs) → ASR 转写(WhisperX,带 word-level 时间戳) → LLM 翻译 → 目标语音克隆合成 → 时间轴对齐 → 视频回填。
多数号称"AI 配音"的工具,在中间这一层要么没有说话人分离、要么翻译不带术语表、要么克隆后的时长根本对不上原视频,最后你还是要手工回时间轴。OmniVoice Studio 在 v0.3.15 之前的 CHANGELOG 里能看到它是怎么被真实用户虐出来的:
术语表 + reflect pass(v0.3.16 Unreleased):翻译前先扫全稿建 glossary(你的手工术语永远赢),每段用同一份术语;直译完还可以做一次 reflect,把生硬句子改写成自然口语——失败静默回退直译。
时长预警(v0.3.16 Unreleased):翻译完每段先给一个 duration estimate(用已渲染段自校准到你的引擎和语言),配上 badge:Tight fit 或 Won’t fit +Ns。用户还可以打开"Suggest shorter lines"让 LLM 提出保义缩写——永远不自动应用,永远你自己按。这是"AI 建议但不越界"的经典把关。
参考音-参考文匹配(v0.3.13):跨语言配音以前会出现"克隆音色照着源语参考文说源语内容"的荒诞现场——原因是 ASR 分段文本和实际音频存在漂移,一个字之差就让 zero-shot TTS 把 prompt 读了出来。修复方式很直接:每一段参考音重跑一次 ASR,保证 (audio, text) 由构造就匹配。
这些不是宣传稿。这是"社区跑了几十个五十视频批处理后一条条报出来的问题、被作者一条条按住"的证据。
四、v0.3.15 到 v0.3.16:读 CHANGELOG 就能读出的工程选择
如果你想判断一个开源项目值不值得下载,读它最近三个 patch 版本的 CHANGELOG 比读 README 有效。v0.3.15 叫 “the cold-start release”,三条修复摊在阳光下:
1. 首次生成不再在 300 秒时爆超时(#1033, #1037)
老代码把"引擎懒下载多 GB 权重"和"生成音频"共用一个 300s 计时器。冷启动机器跑第一条:0% GPU 全窗口——一个 Tesla T4 用户的测量证据——最后失败在"too heavy for the available compute",误导极强。修复:模型加载和生成分开各计一次时,加载先在一个更大预算下跑,生成时钟只在引擎 warm 之后启动;真的下载卡住有专门的错误引到 Settings → Models。
2. 更新不再删你自己装的引擎(#1029)
Settings → Engines 页面明明鼓励你 pip install voxcpm2 / kittentts,结果每次 app 更新都把这些"不在 lockfile"里的包扫掉。修复:常规更新只保留你的 additions;“Clean & Retry” 修复路径保留(因为坏环境有时就是多包引起的)。
3. 克隆音色再也不每次都重跑 Whisper(#1032)
v0.3.6 之后,如果你保存 clone profile 时没有手动填 transcript(默认没有),每次合成都会加载 ASR + 转写参考音,这就是"v0.3.6 之后 TTS 明显变慢"的直接原因。修复:第一次自动转写的结果落到 profile 里,之后重复上传同一片段走内容哈希缓存;手工填的 transcript 永不覆盖。
这三条合起来告诉你一件事:这个项目的 owner 会真的按 issue 定位、找出根因、贴上修复,而不是打 workaround 就发布。
五、上手:五分钟从零到一段克隆音频
我按最短路径写一遍。
桌面版最快
去 Releases 下载你的平台安装包:
- macOS Apple Silicon:DMG
- Windows x64:MSI
- Linux x64:AppImage
装完启动,第一次打开会在后台下载默认引擎(OmniVoice,600+ 语言)。在冷启动完成前不要点生成——v0.3.15 以后 timeout 已经解耦,但 UX 上还是先等 Settings → Engines 里绿灯亮起来更放心。
想跑 latest:直接 clone
因为它是 active beta,README 明说:“clone the repo and run from source rather than the pre-built installers” 是拿到最新修复的路径。仓库根有 .python-version 和 pyproject.toml,uv 是它推荐的包管理器:
git clone https://github.com/debpalash/OmniVoice-Studio.git
cd OmniVoice-Studio
uv sync
uv run python backend/main.py --diagnose # 自检
uv run python backend/main.py # 起后端
# 前端另开终端
cd frontend && bun install && bun run tauri dev
如果 diagnose 报缺库或权限问题,docs/install/troubleshooting.md 挂了 top 10 问题清单,UI 报错也是直接 deeplink 过去的。
一次跨语言克隆
Studio 工作台:

流程:
- 拖一个 3 秒的干净参考音(无背景、单说话人)
- 输入目标文本(任何目标语言)
- 选择当前 TTS 引擎(默认 OmniVoice 就够,646 语言全覆盖)
- Generate → 拿到目标语言的克隆音色
注意水印:OmniVoice Studio 默认开 AudioSeal 隐形水印(Meta 出的方案)。v0.3.16 修复了长音频水印的内存问题(一次 ~2GB 分配变成 30s 分块),所以生成再长也不会 OOM。要禁用请去 Settings → Watermarking——但别关,这是给你自己留的溯源手段。
用 OpenAI 客户端串起来
# TTS
curl http://localhost:3900/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model":"tts-1","voice":"alloy","input":"Generated on my own hardware.","response_format":"wav"}' \
--output speech.wav
# ASR
curl http://localhost:3900/v1/audio/transcriptions \
-F "file=@clip.wav" -F "model=whisper-1" -F "response_format=srt"
任何你写过的对着 OpenAI 的 shell script、Python、Node,把 endpoint 换过来就能用。
六、谁适合上,谁应该再等
适合马上上的人:
- 内容创作者:多语言配音、长音频、Podcast 声线控制——这条路径可以省掉 ElevenLabs 的月费
- 开发者 / Agent 建设者:需要"能给我克隆一批可复用音色、暴露 OpenAI API、支持 MCP"的本地基础设施
- 企业内部工具:合规上不能把音频送出网,OmniVoice Studio 的 AGPL-3.0 允许内部使用;商用产品要检查 Commercial license
- 想学习"如何把 14 家开源 TTS 做统一封装"的人:
backend/是好例子——引擎路由、GPU preflight、崩溃隔离、OpenAI-compat 适配层,都是可读的量
应该再等的人:
- Intel Mac:
x86_64PyTorch wheel 已经不再发布,UI 装得上,backend 跑不起来(#889) - 只有 ≤4GB VRAM 或纯 CPU 笔记本:能跑,但选引擎要挑轻的(KittenTTS、MOSS-TTS-Nano 是 CPU-realtime 的;重的 8B MOSS-TTS-v1.5、2B dots.tts 会痛苦)
- 需要企业级 SLA、SSO、审计:这是 active beta,作者也自己写了"things may break between releases"——你要接受版本间可能小碎——ElevenLabs 那边有企业合约你就该继续用
七、可收藏的 30 秒清单
- 想装本地 ElevenLabs:Release 下 DMG/MSI/AppImage;要 latest patch 就
git clone跑uv sync + uv run+ Tauri dev。 - 想选引擎:
Settings → Engines,一表切换 TTS/ASR/LLM;生产上用OMNIVOICE_TTS_BACKEND/OMNIVOICE_ASR_BACKEND环境变量锁定。 - 想把已有脚本接过来:
base_url=http://localhost:3900/v1,api_key="none",接口跟 OpenAI 完全一样。 - 想视频配音:Video Dubbing → YouTube URL / 文件 → 选目标语言 + 引擎,打开术语表 + reflect + duration badge。
- 想让 Agent 用:MCP server 自带,Claude Code / Cursor / 任意 MCP client 直接接。
- 担心冷启动:v0.3.15+ 的 timeout 已经解耦,第一条不再爆 300s;下载进度看 Settings → Models。
八、我自己的判断
我看开源项目有个偏见:看它 issue 里最没面子的 bug 修得怎么样。OmniVoice Studio 的 #1032(克隆变慢的回归)、#1029(updater 删用户装的引擎)、#1004(跨语言配音把源语言念出来)——这三条如果换成一个融资项目,能藏就藏;作者选择在 CHANGELOG 里把根因、复现、修复方式全写清楚。
这是一个愿意把工程判断亮在阳光下的项目。
主页地址:https://github.com/debpalash/OmniVoice-Studio
如果你手上正好有一批要配音的视频、或者想把语音克隆做进自己的 agent workflow,把它作为本地基础设施装上,一年至少省一份订阅、几万条不用送出网的音频。
作者说了:不打算等 v0.4,v0.3.x 会一直往前走,每个 issue 都会被消化到这条线里。这种 cadence 在 open-source AI 项目里已经很少见了。