
VoiceStudio 中的 KittenTTS 引擎纯 CPU 实时英文合成、八种预设音色与长输入加固【免费下载链接】VoiceStudioVoiceStudio is the open-source, fully-local ElevenLabs alternative — voice cloning, voice design, video dubbing, dictation, transcription audiobook creation in 646 languages.项目地址: https://gitcode.com/GitHub_Trending/om/VoiceStudioKittenTTSKittenML是 VoiceStudio 的轻量级英文 Flash/Turbo 档合成引擎一个仅 25–80 MB 的 ONNX 模型内置 8 种预设音色不需要 torch、CUDA 或任何 GPU即可在任意 CPU 上实时合成。本文围绕 docs/engines/kittentts.md 展开结合 backend/services/tts_backend.py 中的KittenTTSBackend实现与 tests/test_kitten_input_shape_1173.py 回归测试完整讲解它的适用场景、安装配置、音色选择、模型加载机制、512-token 长输入加固原理与已知限制读完后你可以在 VoiceStudio 中独立启用并用它完成快速英文旁白、演示朗读与短句合成。何时选择 KittenTTSKittenTTS 在 VoiceStudio 引擎体系中定位为 ElevenLabs-Flash 档位见 backend/services/tts_backend.py 的类注释它的设计目标非常聚焦纯英文内容当速度与极小安装体积比声音克隆更重要时无可用 GPU 的机器ONNX 图本身只有 CPU 路径任何平台都能跑。它的取舍对比 OmniVoice 非常明确不支持声音克隆、仅支持英文但换来的是显著更快的合成速度与小得多的安装体积。在源码中这体现为两个类级属性backend/services/tts_backend.pyid kittentts display_name KittenTTS (English, 8 preset voices, CPU realtime) gpu_compat (cpu,) # 只有 CPU 路径 supports_cloning False # 固定预设音色ref_audio 被忽略gpu_compat (cpu,)是 VoiceStudio GPU 兼容矩阵中的一个可验证声明docs/specs/longform/21-gpu-compat-matrix.md也收录了该引擎的 CPU-only 定位。当你的场景是快速拿一段英文旁白、demo 朗读、短句而不需要参考音频克隆时它就是首选。安装与启用安装依赖pip install kittentts需要安装到VoiceStudio 自身的 Python 环境中若使用虚拟环境或 uv 管理的环境请对应激活。安装后KittenTTSBackend.is_available()通过尝试import kittentts判断引擎是否可用backend/services/tts_backend.py失败时会在 Model Catalogue 中呈现为引擎不可用状态并提示缺失的依赖。选择引擎的两种方式UI 方式打开Model Catalogue的 TTS 标签页找到 KittenTTS 条目点击Use环境变量方式设置export OMNIVOICE_TTS_BACKENDkittentts引擎解析链在 backend/core/prefs.py 中resolve(tts_backend, envOMNIVOICE_TTS_BACKEND, defaultomnivoice)——环境变量优先于设置项默认值是omnivoice显式设置为kittentts即完成切换。注册关系位于 backend/services/tts_backend.pykittentts: KittenTTSBackend对应的安装提示文案在 backend/services/tts_backend.py。模型目录收录backend/config/models.yaml 将KittenML/kitten-tts-mini-0.8登记为可选 TTS 模型- repo_id: KittenML/kitten-tts-mini-0.8 label: KittenTTS (English, 8 preset voices, CPU realtime) role: TTS engines: [kittentts] size_gb: 0.08 curated_on: [all]size_gb: 0.08约 80 MB印证了文档中25–80 MB的体量curated_on: [all]表示该模型在全部平台上都被策展收录与 CPU-only 定位一致。八种预设音色KittenTTS 提供 8 种预设音色组成四对男女声expr-voice-2-m expr-voice-2-f (默认: expr-voice-2-f) expr-voice-3-m expr-voice-3-f expr-voice-4-m expr-voice-4-f expr-voice-5-m expr-voice-5-f源码中的音色表与默认值backend/services/tts_backend.pyPRESET_VOICES [ expr-voice-2-m, expr-voice-2-f, expr-voice-3-m, expr-voice-3-f, expr-voice-4-m, expr-voice-4-f, expr-voice-5-m, expr-voice-5-f, ] DEFAULT_VOICE expr-voice-2-f音色通过generate()的voice参数传入对应 OpenAI 兼容路由中的 voice 字段。未知音色 ID 不会被当作错误generate()会记录一条 info 日志并回退到默认音色expr-voice-2-fbackend/services/tts_backend.py因此即使在多引擎调度的统一调用点误传了其他引擎的音色名也不会导致请求失败。模型选择变量默认值含义OMNIVOICE_KITTENTTS_MODELKittenML/kitten-tts-mini-0.8要加载的 HuggingFace checkpoint加载逻辑backend/services/tts_backend.pycheckpoint os.environ.get( OMNIVOICE_KITTENTTS_MODEL, KittenML/kitten-tts-mini-0.8 ) self._model _retry_once_with_fresh_hf_client( lambda: KittenTTS(checkpoint), whatKittenTTS )首次使用时会从 HuggingFace 下载约 80 MB 的模型下载发生在generate路径内部懒加载而非应用启动时。针对首次下载的弱网场景VoiceStudio 使用_retry_once_with_fresh_hf_clientbackend/services/tts_backend.py在连接抖动时用全新 client 重试一次而不是直接失败与文档flaky connection 时重试一次的描述吻合。离线/镜像环境的下载配置见 downloading-models.md。行为细节源码级输出规格24 kHz 单声道sample_rate属性固定返回24000backend/services/tts_backend.py依据来自 ONNX 模型配置CPU-onlyONNX 图没有 CUDA/MPS 路径gpu_compat (cpu,)generate()返回值统一包装为 torch 张量一维自动unsqueeze(0)多声道取均值降为单声道backend/services/tts_backend.py保证下游管线拿到的是规范化的(1, n_samples)24 kHz 波形。非英文与参考音频参数被忽略generate()收到非英文language值时不在{en, english, auto}范围内会记录一条日志提示应改用 OmniVoice 做多语言合成backend/services/tts_backend.pyref_audio/instruct等参数同样被忽略并写日志。这种统一调用点无需知道自己在跟哪个引擎说话的适配器设计让上层路由包括 OpenAI 兼容路由可以透明地切换引擎。速度旋钮speed参数是 KittenTTS 上唯一可调的合成旋钮默认1.0经float(kw.get(speed, 1.0))透传给 ONNX 会话的speed输入见 backend/services/tts_backend.py与文档Preset voices only — speed is the one knob的结论一致。长输入加固512-token 上限与 #1173这是 KittenTTS 引擎最值得注意的工程细节。上游模型图对输入有一个硬性的 512-token 位置编码上限针对kitten-tts-mini-0.8实测超过即会在 onnxruntime 内部以难以理解的Expand node … invalid expand shapeInvalidArgument 中止。而问题在于上游chunk_text是按400 个文本字符切块的实际 token 数是音素化phonemized后字符串的长度——espeak 会把数字等词条爆炸式读出110 个数字字符就能音素化出约 1150 个 tokenOpenAI 兼容路由是天然触发点OpenAI 调用者通常不传language应用层normalize_for_tts()因此跳过数字转单词原始数字直达 espeak。另一类崩溃空输入 / 纯标点输入会命中np.concatenate([])need at least one array to concatenate同样返回 500。修复采用适配器级方案对所有路由生效核心逻辑在 backend/services/tts_backend.py先运行引擎自身的 preprocessor数字转单词等清理步骤用chunk_text按上游逻辑切块后逐块用模型自己的 tokenizer 预测量 token 数onnx._prepare_inputs(...)[input_ids].shape[1]超限块在词边界二分递归切分直到每片音素化后 ≤_MAX_ONNX_TOKENS 512若遇到无空白可切的单个巨型 token例如 500 位数字退化为字符串字符二分——宁可牺牲韵律也不让 ONNX 中止若清理后没有任何可读内容空串、纯标点抛出类型化异常TTSInputError路由层映射为400而非 500。整个加固对正常文本零影响test_normal_text_is_not_split验证预算内的文本按上游原样切块、不被拆分tests/test_kitten_input_shape_1173.py。TTSInputError定义于 backend/services/tts_backend.py测试test_speech_route_maps_tts_input_error_to_400验证了/v1/audio/speech路由把该异常映射为 400 响应tests/test_kitten_input_shape_1173.py。回归测试分两层tests/test_kitten_input_shape_1173.pyMock 级测试始终运行用伪造的 ONNX 会话数字按 60 token/字符放大验证数字爆炸被切分、单个巨型 token 被二分、空输入抛TTSInputError真实推理测试仅在本地 HF 缓存中已有约 80 MB 的KittenML/kitten-tts-mini-0.8时才运行_needs_kitten_model跳过标记其中test_real_model_digit_explosion_synthesizes复现了 #1173 原始触发场景10 组9999999999约 1150 token修复后能得到 1 秒以上的真实音频。已知限制仅支持英文不支持克隆、不支持声音设计、无情绪控制。多语言/克隆/情绪需求参考 expressive-speech.md仅预设音色唯一的可调参数是语速speed不加载参考音频无克隆传入ref_audio会被忽略并记录日志。故障排查现象处理方式引擎不可用Model Catalogue 显示 unavailable在 VoiceStudio 的 Python 环境中执行pip install kittentts后重启首次合成较慢首次使用会从 HuggingFace 下载约 80 MB 模型属正常现象连接不稳定时内置一次重试报invalid expand shape或 500确认使用的是仓库当前版本的适配器已内置 512-token 加固空/纯标点输入现在返回 400 而非 500其他问题参见 install/troubleshooting.md延伸阅读引擎横向对比benchmarks.md磁盘占用说明disk-usage.md引擎总览docs/engines/README.md模型下载与镜像配置downloading-models.md多语言替代方案OmniVoice 引擎一言以蔽之KittenTTS 是 VoiceStudio 里无 GPU 机器上的快速英文旁白最省心的选项——安装只需pip install kittentts切换只需一个环境变量而 #1173 的适配器级加固让数字密集的长文本与空输入也能稳定产出音频而不是在 onnxruntime 里报出一串难以理解的形状错误。【免费下载链接】VoiceStudioVoiceStudio is the open-source, fully-local ElevenLabs alternative — voice cloning, voice design, video dubbing, dictation, transcription audiobook creation in 646 languages.项目地址: https://gitcode.com/GitHub_Trending/om/VoiceStudio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考