资讯动态

speech-to-speech 语音智能体 TTS 模式全指南:7 种开源语音合成后端的选型、配置与实战

发布时间:2026/9/15 5:52:52 来源:尧图企业网站定制
speech-to-speech 语音智能体 TTS 模式全指南7 种开源语音合成后端的选型、配置与实战【免费下载链接】speech-to-speechBuild voice agents with open-source models项目地址: https://gitcode.com/GitHub_Trending/sp/speech-to-speech本篇技术指南以 src/speech_to_speech/TTS/README.md 为骨架系统讲解 speech-to-speech 项目中--tts参数支持的 7 种开源 TTSText-to-Speech模式ChatTTS、Facebook MMS、Pocket TTS、Kokoro、Qwen3-TTS、OmniVoice 与 Supertonic。你将掌握每种模式的参数前缀、可用取值、平台适配与真实命令行用法并能结合源码理解各 Handler 的底层实现机制从而在构建语音 Agent 时做出正确的 TTS 选型。TTS 模式总览--tts支持的运行时取值--tts是 speech-to-speech 项目中最核心的运行时参数之一其合法取值由 src/speech_to_speech/s2s_pipeline.py 定义每个取值对应src/speech_to_speech/TTS/目录下的一个独立 Handler 实现--tts取值Handler 实现文件说明chatTTSchatTTS_handler.pyChatTTS 对话式合成支持流式输出facebookMMSfacebookmms_handler.py基于 VITS 的多语言 MMS 模型按语言切换模型pocketpocket_tts_handler.pyKyutai Labs 轻量模型自带语音克隆kokorokokoro_handler.pyKokoro 82M 多语言模型Apple Silicon 走 MLXqwen3qwen3_tts_handler.pyQwen3-TTS支持 GGML / Torch / MLX 三后端omnivoiceomnivoice_handler.pyk2-fsa OmniVoice支持克隆 / 设计 / 自动三种音色supertonicsupertonic_tts_handler.pySupertone ONNX 实时合成内置 10 个音色这些取值与 Handler 的映射关系在 src/speech_to_speech/backend_registry.py 中通过build_backend_registry(tts, ...)统一注册同时绑定各自的参数解析类如PocketTTSHandlerArguments、Qwen3TTSHandlerArguments与config_prefix前缀如pocket_tts、qwen3_tts。注意历史遗留的 MeloTTS 等旧实现已从主流程移除相关代码归档在 archive/TTS不再接入s2s_pipeline.py。当前所有 TTS 能力都以src/speech_to_speech/TTS/下的 Handler 为准。1) ChatTTS对话场景的流式合成ChatTTS 模式的主参数前缀为--chat_tts_*一个最小可运行示例speech-to-speech serve \ --tts chatTTS \ --chat_tts_device cuda \ --chat_tts_stream true \ --chat_tts_chunk_size 512从 chatTTS_handler.py 的setup可以看到核心行为--chat_tts_device指定运行设备如cuda代码在mps设备上会额外调用torch.mps.synchronize()与torch.mps.empty_cache()清理显存降低长时间运行的失败概率--chat_tts_stream控制是否使用流式推理streamTrue时逐块产出音频--chat_tts_chunk_size每次向外输出的音频块大小样本数默认 512每次 setup 会通过sample_random_speaker()随机抽取一个说话人嵌入并执行一次infer(text)预热。流式模式下Handler 把模型输出的 24 kHz 音频先用librosa.resample重采样到 16 kHz再转为int16按chunk_size切块并补齐末尾不足块。需要说明的是模型内嵌音色每次启动随机抽取因此同一进程内的两次会话音色可能不同。2) Facebook MMS按语言自动换模型的 VITS 方案Facebook MMS 模式的主参数前缀为--facebook_mms_*并额外依赖--tts_languagespeech-to-speech serve \ --tts facebookMMS \ --facebook_mms_device cuda \ --tts_language en该 Handler 的核心机制是语言码映射 模型热切换facebookmms_handler.py 中维护了WHISPER_LANGUAGE_TO_FACEBOOK_LANGUAGE映射表将 STT 侧产出的语言码如en、fr、es转换为 MMS 模型后缀如eng、fra、spa进而加载形如facebook/mms-tts-eng的 VITS 模型process()每收到一个 utterance 都会检查其携带的language_code若与当前已加载模型不一致就调用load_model()重新加载对应语言的模型见 load_model 实现遇到不支持的语种会回退到英语会话结束时通过on_session_end()恢复初始语言与初始自定义模型避免污染下一个会话见 on_session_end。仓库中的 test_facebookmms_language_map.py 覆盖了这份语言映射的准确性适合需要多语种回复的语音 Agent。3) Pocket TTS轻量 内置语音克隆Pocket TTSKyutai Labs模式的主参数前缀为--pocket_tts_*speech-to-speech serve \ --tts pocket \ --pocket_tts_voice jean \ --pocket_tts_device cpu \ --pocket_tts_sample_rate 16000可用预设音色--pocket_tts_voicealba、marius、javert、jean、fantine、cosette、eponine、azelma。从 pocket_tts_handler.py 的setup可以了解更多细节--pocket_tts_voice除了预设名还可以是本地音频文件路径或 Hugging Face 路径如hf://kyutai/tts-voices/...通过get_state_for_audio_prompt()直接加载音色状态实现克隆--pocket_tts_devicecpu/cuda/mps默认cpu--pocket_tts_sample_rate输出采样率默认 16000。模型原生产出 24 kHzHandler 内部会先按scipy.signal.resample_poly做多相重采样24k→16k 即 up2/down3再按blocksize默认 512切块输出以保证与流水线的固定块大小对齐模型生成的是约 10–20ms 一包的微小块Handler 将min_time_to_debug覆盖为 100ms避免单块日志刷屏。4) Kokoro82M 参数的跨平台多语言方案Kokoro 模式的主参数前缀为--kokoro_*speech-to-speech serve \ --tts kokoro \ --kokoro_device auto \ --kokoro_voice bm_fable \ --kokoro_lang_code b行为要点与 kokoro_handler.py 的setup一一对应平台自动选后端--kokoro_device auto时Apple Silicondarwin自动走mps并使用mlx-community/Kokoro-82M-bf16其他平台自动探测 CUDA / CPU 并使用原生 kokoro 流水线hexgrad/Kokoro-82M--kokoro_voice指定音色默认bm_fable英式男声--kokoro_lang_code指定 Kokoro 语言码默认b英式英语。Kokoro 语言码是一字母缩写a(美式英语)、b(英式)、e(西)、f(法)、h(印地)、i(意)、j(日)、p(葡)、z(中文)自动切换语音/语言Handler 维护WHISPER_LANGUAGE_TO_KOKORO_LANG映射见源码当 STT 语言码变化时会自动切到对应语言的默认音色例如中文zh映射到z默认音色zf_xiaobei。对不支持的语言如德语、俄语会回退到英式英语MLX 后端会在启动时预热常用语言英语、西语、法语的音色以减少首句下载延迟并借助 MLXLockContext 保证 MLX 资源互斥。5) Qwen3-TTS三后端、多模式的旗舰方案Qwen3-TTS 模式的主参数前缀为--qwen3_tts_*是文档中篇幅最大、能力最全的模式支持语音克隆voice cloning、自定义音色custom voice与音色设计voice design三种生成模式。5.1 后端选型Qwen3TTSHandler.setup 按平台自动选择后端非 macOS使用faster-qwen3-tts默认ggml后端传--qwen3_tts_backend torch可改用 CUDA-graphs 的 Torch 后端Apple Silicon使用mlx-audio模型 ID 自动从Qwen/...映射为mlx-community/...默认选择6bit量化变体可通过--qwen3_tts_mlx_quantization bf16|4bit|6bit|8bit覆盖。5.2 GGML 量化的基本用法speech-to-speech serve \ --tts qwen3 \ --qwen3_tts_model_name Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice \ --qwen3_tts_device cuda \ --qwen3_tts_backend ggml \ --qwen3_tts_speaker Aiden \ --qwen3_tts_language auto \ --qwen3_tts_non_streaming_mode True支持通过--qwen3_tts_ggml_quantization选择 GGML 量化档位BF16|Q8_0|Q4_K_M|F32源码中由 VALID_GGML_QUANTIZATIONS 校验。例如用 Q4_K_M 直接跑量化模型speech-to-speech serve \ --tts qwen3 \ --qwen3_tts_backend ggml \ --qwen3_tts_model_name Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice \ --qwen3_tts_ggml_quantization Q4_K_M \ --qwen3_tts_speaker Aiden5.3 加载本地 GGUF 文件提供 talker 与 codec 两个 GGUF 路径即可加载本地模型二者必须同时提供否则 setup 会抛ValueError见 校验逻辑。模型名要与本地 talker 的类型保持一致这样 Handler 才能通过_infer_model_type_from_name()正确识别生成模式speech-to-speech serve \ --tts qwen3 \ --qwen3_tts_backend ggml \ --qwen3_tts_model_name Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign \ --qwen3_tts_gguf_talker_path /models/qwen-talker-1.7b-voicedesign-Q4_K_M.gguf \ --qwen3_tts_gguf_codec_path /models/qwen-tokenizer-12hz-BF16.gguf \ --qwen3_tts_instruct Warm, confident narrator5.4 GGML 语音克隆与参考缓存使用原始参考音频克隆时首次使用会自动缓存.spk/.rvq等参考文件默认缓存目录为~/.cache/faster-qwen3-tts/qwentts_refs可用--qwen3_tts_ref_cache_dir覆盖。原始参考音频的首次克隆speech-to-speech serve \ --tts qwen3 \ --qwen3_tts_backend ggml \ --qwen3_tts_model_name Qwen/Qwen3-TTS-12Hz-1.7B-Base \ --qwen3_tts_ref_audio /voices/freeman.wav \ --qwen3_tts_ref_text The transcript for the reference audio. \ --qwen3_tts_ref_cache_dir /voices/cache缓存文件.spk、.rvq、.json使用相同的 SHA-256 缓存键作为文件名主干。查看缓存目录找到与参考音频对应的CACHE_KEY后即可跳过原始音频直接复用缓存speech-to-speech serve \ --tts qwen3 \ --qwen3_tts_backend ggml \ --qwen3_tts_model_name Qwen/Qwen3-TTS-12Hz-1.7B-Base \ --qwen3_tts_ref_spk /voices/cache/CACHE_KEY.spk \ --qwen3_tts_ref_rvq /voices/cache/CACHE_KEY.rvq \ --qwen3_tts_ref_text The transcript for the reference audio.注意三种输入的互斥与约束关系由 参数校验 强制保证原始--qwen3_tts_ref_audio与缓存的--qwen3_tts_ref_spk/--qwen3_tts_ref_rvq互斥.rvq输入必须同时提供.spk与参考文本--qwen3_tts_ref_text仅传.spk时只做说话人条件.spk.rvq 参考文本组合则用于 ICLin-context learning条件合成。5.5 Apple Silicon 上的 MLX 用法默认使用 6-bit MLX 变体无需参考音频默认 CustomVoice 模型 说话人Aidenspeech-to-speech serve \ --tts qwen3 \ --qwen3_tts_model_name Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice \ --qwen3_tts_speaker Aiden显式指定 4-bit 量化speech-to-speech serve \ --tts qwen3 \ --qwen3_tts_model_name Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice \ --qwen3_tts_mlx_quantization 4bit \ --qwen3_tts_speaker Aiden5.6 MLX 量化变体基准对比仓库提供了 scripts/benchmark_tts.py可在 Apple Silicon 上横向对比各量化档位的性能.venv/bin/python benchmark_tts.py \ --handlers qwen3 \ --iterations 3 \ --qwen3_mlx_quantizations bf16 4bit 6bit 8bit该命令会为qwen3[bf16]、qwen3[4bit]、qwen3[6bit]、qwen3[8bit]分别生成独立的基准条目。5.7 Linux GGML 安装注意版本相关PyPI 默认的qwentts-cpp-pythonwheel 面向 CUDA 12.8 与manylinux_2_39例如 Ubuntu 24.04如果默认 wheel 与宿主机的 CUDA runtime 或 glibc 不匹配可在安装speech-to-speech之前安装 Hugging Face wheelhouse 中的对应构建。可用的 wheelhouse 目录包括cu124、cu128、cu130与cpupip install qwentts-cpp-python0.3.1cu130 \ -f https://huggingface.co/datasets/andito/qwentts-cpp-python-wheels/tree/main/whl/cu130 pip install speech-to-speech5.8 其他关键行为源码佐证Token 预算估算Handler 会根据词数、字符数、CJK 字符数、标点数量估算每个 utterance 所需的 codec token 数见 qwen3_tts_handler.py#L616-L659避免长文本被max_new_tokens截断文本合并_coalesce_pending_tts_input()会把同一 response 内连续到达的文本块合并成一句话再合成降低句间割裂感中断处理流式生成循环会检查cancel_scope.is_stale()检测到用户打断时立即终止MLX 后端还通过MLXLockContext串行化生成并记录 TTFA 与 RTF 日志会话级音色覆盖_apply_session_voice_override()支持通过 Realtime API 的 session / response 音色字段动态覆盖说话人CustomVoice 需为受支持的 speaker 名Base 模型则接受音频文件路径。6) OmniVoice克隆 / 设计 / 自动三合一OmniVoice 模式的主参数前缀为--omnivoice_*属于可选依赖speech-to-speech[omnivoice]需要按 PyTorch 安装情况选择设备。6.1 语音克隆参考音频在 Handler setup 时只编码一次得到的克隆提示clone prompt会复用于后续每个文本块pip install speech-to-speech[omnivoice] speech-to-speech serve \ --tts omnivoice \ --omnivoice_model_name k2-fsa/OmniVoice \ --omnivoice_device cuda \ --omnivoice_dtype float16 \ --omnivoice_ref_audio /voices/reference.wav \ --omnivoice_ref_text Transcript of the reference clip.如需复用上游VoiceClonePrompt.save(...)保存的提示文件跳过参考音频重新编码可将两个 reference 参数替换为--omnivoice_voice_clone_prompt /voices/saved-prompt.pt6.2 音色设计Voice Design音色设计模式省略克隆参数改用指令描述目标音色speech-to-speech serve \ --tts omnivoice \ --omnivoice_device mps \ --omnivoice_instruct female, low pitch, British accent6.3 自动音色与其他参数自动音色auto voice同时省略--omnivoice_ref_audio、--omnivoice_voice_clone_prompt与--omnivoice_instruct模型自行决定音色。--omnivoice_language固定语言名或语言码不设置时Handler 会透传每个 utterance 携带的语言码--omnivoice_num_steps扩散步数默认 32--omnivoice_speed语速。设备与精度上游支持的设备值包括 CUDAcuda或cuda:0、Apple Siliconmps、Intel GPUxpu--omnivoice_dtype可选float16、bfloat16、float32需与设备支持匹配源码校验。依赖与平台speech-to-speech[omnivoice]在 Linux、Windows、macOS 上均受支持。非 macOS 平台上faster-qwen3-tts0.4.0与 OmniVoice 共享 Transformers 5因此该 extra 可与内置 Qwen3 后端共存Linux 默认使用 Qwen3 的 GGML extra宿主与默认 CUDA 12.8 /manylinux_2_39wheel 不匹配时需按上文 5.7 安装对应 wheelIntel XPU 需要匹配的 Intel PyTorch 构建。性能特征OmniVoice 返回完整的 24 kHz float 音频数组Handler 会下采样到 16 kHz、裁剪为int16再按固定块大小输出。这是播放切块而非模型流式上游generate()是阻塞调用因此首个音频块的时间包含整句合成耗时若用户在生成期间打断阻塞调用返回后整段结果会被丢弃见 omnivoice_handler.py#L145-L151。上游在加速基准中报告过低至 0.025 的实时率但实际延迟取决于设备、dtype、扩散步数与文本长度。[!WARNING] OmniVoice 的代码采用 Apache-2.0 协议但k2-fsa/OmniVoice预训练权重因训练数据约束采用 CC-BY-NC 协议不可商用。语音克隆需要获得授权与同意上游模型的安全声明禁止未经授权的克隆、冒充、欺诈、诈骗及其他违法或不道德的使用。7) SupertonicONNX 实时合成与 10 个内置音色Supertonic 模式的主参数前缀为--supertonic_tts_*属于可选依赖pip install speech-to-speech[supertonic] speech-to-speech serve \ --tts supertonic \ --supertonic_tts_voice M1 \ --supertonic_tts_speed 1.0行为要点对应 supertonic_tts_handler.py 的实现使用 Supertone 的 ONNX runtime 模型做实时文本转语音模型自动下载到本地~/.cache/supertonic3/内置10 个音色模型M1–M5与F1–F5语言处理优先使用每个 utterance 携带的语言码源码维护了SUPERTONIC_LANGUAGE_CODES支持集合见 supertonic_tts_handler.py#L22-L57不支持时回退到--supertonic_tts_lang输出原生 44.1 kHz在流水线内会被下采样到 16 kHz 以统一播放多相重采样后按 512 样本块对齐输出支持--supertonic_tts_speed控制语速。快速上手两套现成配置模板低延迟 GPU 方案STT 用 Whisper、TTS 用 Pocket典型低延迟组合speech-to-speech serve \ --stt whisper \ --tts pocketApple Silicon 方案一条命令应用 macOS 最优设置默认--tts qwen3并映射到mps设备见 s2s_pipeline.py#L316-L325 中对 macOS 用户的推荐逻辑speech-to-speech local \ --mac-optimal-settings此外--tts pocket、--tts kokoro、--tts omnivoice在 macOS 上同样是合法选项。选型建议与限制说明综合各 Handler 的源码实现与运行特征可参考以下维度选型低延迟 / 轻量Pocket TTS流式、设备可选、内置克隆与 SupertonicONNX 实时更契合低延迟场景多语言自动切换Facebook MMS按语种热切换模型与 Kokoro语言码映射 默认音色自动跟随适合多语种 AgentKokoro 在 Apple Silicon 上可经 MLX 获得本地加速音色自由度最高Qwen3-TTS克隆 / 自定义 / 音色设计三模式 三种后端 量化选择与 OmniVoice克隆 / 设计 / 自动三合一 扩散步数控制能力最完整但需注意 OmniVoice 权重的 CC-BY-NC 商用限制与阻塞式生成特性对话风格ChatTTS 面向对话场景提供流式合成但注意其音色每次启动随机抽样需要固定音色时应考虑其他模式。所有参数的实际默认值与取值范围均可进一步查阅 src/speech_to_speech/arguments_classes/ 下对应参数类如chat_tts_arguments.py、qwen3_tts_arguments.py、supertonic_tts_arguments.py等各 Handler 的完整实现见 src/speech_to_speech/TTS/配套测试位于 tests/例如test_facebookmms_language_map.py、test_qwen3_tts_handler_backend.py、test_omnivoice_tts_handler.py、test_supertonic_tts_handler.py、test_pocket_tts_handler.py可作为深入理解每个后端行为的起点。废弃的 MeloTTS 等实现可查阅 archive/TTS 作历史参考。【免费下载链接】speech-to-speechBuild voice agents with open-source models项目地址: https://gitcode.com/GitHub_Trending/sp/speech-to-speech创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价