OmniVoice Studio:把 ElevenLabs 焊回你自己的机器

导读从 CHANGELOG 到 CUDA / MPS 路由:一份把 14 TTS × 10 ASR × OpenAI 兼容 API × MCP Server 落到本地的工程视角拆解。646 语言、零 key、AGPL-3.0,跑在你自己的机器上。

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 为准):

ElevenLabsOmniVoice Studio
定价$5–$330/mo,按字符免费开源(AGPL-3.0)
克隆3 秒片段3 秒片段,zero-shot
语言32646
视频配音云端完全本地
API key必需不需要
GPU云端CUDA · Apple Silicon MPS · ROCm · CPU
TTS 引擎114
ASR 引擎110
MCP server

数量不重要,工程重要。下面按"它到底怎么把这些做出来"拆。

二、它的心智模型:一份 picker + 一份 OpenAI 兼容 API

第一次装完 OmniVoice Studio,Launchpad 长这样:

OmniVoice Studio Launchpad

上面挂了六块工作台:Studio(生成 + 克隆一体)、Voice Design(造音色)、Voice Gallery(音色库)、Video Dubbing(视频配音)、Stories/Audiobook(长音频)、Dictation(听写)。每一块共享同一件东西——当前激活的 TTS / ASR / LLM 引擎

它没有为每个工作台各自选一次引擎。它把这三个族全放在 Settings → Engines 一张表里,全局切换:

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 兼容协议:

OpenAI-compatible API

三个接口:

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_urlapi.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 的工作台:

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 fitWon’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-versionpyproject.tomluv 是它推荐的包管理器:

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 工作台:

Studio workspace

流程:

  1. 拖一个 3 秒的干净参考音(无背景、单说话人)
  2. 输入目标文本(任何目标语言)
  3. 选择当前 TTS 引擎(默认 OmniVoice 就够,646 语言全覆盖)
  4. 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 Macx86_64 PyTorch 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 cloneuv sync + uv run + Tauri dev。
  • 想选引擎Settings → Engines,一表切换 TTS/ASR/LLM;生产上用 OMNIVOICE_TTS_BACKEND / OMNIVOICE_ASR_BACKEND 环境变量锁定。
  • 想把已有脚本接过来base_url=http://localhost:3900/v1api_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 项目里已经很少见了。