
Xinference 内置 ChatTTS 语音合成零样本音色克隆与统一推理 API 实战指南【免费下载链接】inferenceSwap GPT for any LLM by changing a single line of code. Xinference lets you run open-source, speech, and multimodal models on cloud, on-prem, or your laptop — all through one unified, production-ready inference API.项目地址: https://gitcode.com/GitHub_Trending/in/inference本文以 Xinference 内置音频模型 ChatTTS 为主线介绍如何通过统一推理服务一条命令拉起文本转语音TTS与零样本音色克隆能力并深入源码剖析其加载、推理、种子复现与流式输出机制。读完本文你将掌握 ChatTTS 在 Xinference 中的启动方式、Python 客户端与 OpenAI 兼容接口的调用方法以及voice、seed、speed、stream等核心参数背后的实现原理。ChatTTS 模型规格概览在 Xinference 内置模型文档中ChatTTS 是一个独立的音频模型家族其核心规格如下见 doc/source/models/builtin/audio/chattts.rstModel Name:ChatTTSModel Family:ChatTTSAbilities:[text2audio, text2audio_zero_shot]Multilingual:TrueModel ID:2Noise/ChatTTS两个能力标识分别表示text2audio即常规文本转语音text2audio_zero_shot即零样本zero-shot语音合成——不需要针对目标说话人进行任何微调仅凭一段音色描述或说话人嵌入speaker embedding即可生成指定风格的语音。内置模型注册信息Xinference 的音频模型注册表 xinference/model/audio/model_spec.json 中保存了 ChatTTS 的完整运行元数据模型源Hugging Face 上2Noise/ChatTTS固定 revision1a3c04a8b0651689bd9242fbb55b1f4b5a9aef84ModelScope 镜像为AI-ModelScope/ChatTTS虚拟环境依赖首次加载时由 Xinference 自动安装到独立虚拟环境ChatTTS0.2.4transformers4.53.2#system_torch#、#system_torchaudio#、#system_numpy#复用系统已安装的 PyTorch 生态组件这意味着你无需手工 pip 安装 ChatTTS 依赖Xinference 会在加载模型时按需创建并准备好运行环境。一条命令启动 ChatTTS根据内置文档启动 ChatTTS 只需执行xinference launch --model-name ChatTTS --model-type audio命令执行后Xinference 会依据 model_spec.json 中的虚拟环境声明准备运行环境从 Hugging Face 或 ModelScope 下载2Noise/ChatTTS权重可用--download-hub指定下载源在 xinference/model/audio/core.py 中根据model_spec.model_family ChatTTS路由到ChatTTSModel实现类完成实例化与加载。启动后模型会获得一个model_uid未指定时默认与model-name相同即ChatTTS后续所有推理请求都通过该 UID 进行路由。通过 Python 客户端调用语音合成基础合成from xinference.client import Client client Client(http://localhost:9997) model_uid client.launch_model( model_nameChatTTS, model_typeaudio, compileFalse, download_hubhuggingface, ) model client.get_model(model_uid) # 文本转语音返回音频字节 audio model.speech(chat T T S is a text to speech model designed for dialogue applications.) assert type(audio) is bytes上述调用方式与 xinference/model/audio/tests/test_chattts.py 中的集成测试用例完全一致。零样本音色控制voice参数speech的voice参数是 ChatTTS 零样本能力的入口在 xinference/model/audio/chattts.py 的实现中支持两种形态音色名称字符串任意小于等于 400 字符的字符串会被_voice_seed通过xxhash.xxh32_intdigest哈希为一个整数种子并用该种子采样说话人嵌入。因此同一个voice字符串总能复现同一个音色实现按名字锁定声线的效果def _voice_seed(voice: str) - int: import xxhash return xxhash.xxh32_intdigest(voice.encode(utf-8))说话人嵌入base64 编码当voice长度超过 400 字符时它会被当作 base64 编码的说话人嵌入张量解码经_encode_spk_emb编码后直接作为目标音色实现真正意义上的零样本克隆——只需提供一段目标说话人的嵌入数据即可。if len(voice) 400: b base64.b64decode(voice) bio BytesIO(b) tensor torch.load(bio, map_locationcpu, weights_onlyTrue) rnd_spk_emb self._model._encode_spk_emb(tensor)流式与格式控制# 流式返回生成器逐块产出音频字节 response model.speech(hello world, streamTrue) for chunk in response: ... # 指定响应格式与语速 audio model.speech( 你好世界, voiceecho, response_formatpcm, speed1.2, )speed参数会换算为 ChatTTS 内部的速度提示[speed_N]源码中infer_speed int(5 * speed)即以默认速度档位 5 为基准线性映射并写入ChatTTS.Chat.InferCodeParams(promptf[speed_{infer_speed}], spk_embrnd_spk_emb)参与推理。OpenAI 兼容接口/v1/audio/speechXinference 提供与 OpenAI Audio Speech 一致的 REST 接口路由注册见 xinference/api/routers/audio.py端点实现为 xinference/api/restful_api.py 中的create_speechcurl http://localhost:9997/v1/audio/speech \ -H Authorization: Bearer token \ -H Content-Type: application/json \ -d { model: ChatTTS, input: The quick brown fox jumps over the lazy dog., voice: echo, response_format: mp3, speed: 1.0, stream: false } --output speech.mp3请求体关键字段字段说明默认值model已启动的模型 UID如ChatTTS必填input待合成的文本必填voice音色名≤400 字符或 base64 说话人嵌入随机音色response_formatmp3、wav、pcm等mp3speed语速倍率源码中按int(5 * speed)映射1.0stream是否流式返回SSE 字节流falsekwargs额外透传参数JSON 字符串如seed空流式请求时服务端返回EventSourceResponse客户端可用 OpenAI SDK 消费import openai client openai.Client(api_keynot empty, base_urlhttp://localhost:9997/v1) with client.audio.speech.with_streaming_response.create( modelChatTTS, inputhello, voiceecho, response_formatpcm ) as response: response.stream_to_file(output.pcm)这正是 test_chattts.py 中验证过的兼容路径说明 ChatTTS 可直接接入任何遵循 OpenAI 语音协议的客户端。源码级实现剖析模型类与加载流程ChatTTSModel定义于 xinference/model/audio/chattts.py其load()方法在加载前做了三项性能相关配置torch._dynamo.config.cache_size_limit 64 torch._dynamo.config.suppress_errors True torch.set_float32_matmul_precision(high)随后以sourcecustom, custom_pathmodel_path方式调用ChatTTS.Chat().load()从本地缓存目录加载权重加载失败会抛出异常。模型实例化由 xinference/model/audio/core.py 中的工厂逻辑按model_family ChatTTS分发完成。种子机制与可复现性合成结果的确定性由两层种子控制音色种子voice字符串经_voice_seed哈希得到speaker_seed随后set_all_random_seed(speaker_seed)并启用torch.backends.cudnn.deterministic True再sample_random_speaker()得到说话人嵌入请求种子kwargs中的seed字段由resolve_media_seed校验允许取值-1自动替换为随机值或0 ~ 2^31-1见 xinference/model/utils.py 中set_all_random_seed与resolve_media_seed的实现。set_all_random_seed会同时设置 Pythonrandom、NumPy 与 PyTorch含 CUDA的随机源保证相同输入可稳定复现。测试 test_chattts.py 中test_voice_seed_hashes_utf8_bytes专门验证了_voice_seed对 UTF-8 文本包括中文音色名的哈希行为。音频输出统一 24kHz 采样率无论流式还是非流式输出统一按sample_rate24000处理非流式audio_to_bytes(response_format, sample_rate, tensor)通过torchaudio.save编码为指定格式pcm格式会剥离 WAV 头提取裸 PCM 数据并兼容 torchaudio 2.9 及以上的 API 变化见 xinference/model/audio/utils.py流式audio_stream_generator将 ChatTTS 的逐 chunk 输出实时编码为音频流逐块 yield底层自动在 torchaudioStreamWriter与 TorchCodec 编码器之间切换保证不同 PyTorch 版本下的可用性。模型能力验证与边界说明仓库内置集成测试 test_chattts.py 覆盖了四条主路径默认文本转语音返回非空字节使用来自公开说话人评测数据集 CSV 的说话人嵌入voicespeaker进行零样本合成流式合成生成器产出多个音频 chunkOpenAI 兼容接口的pcm流式输出。需要说明的是本仓库仅负责 ChatTTS 的托管、加载与 API 封装实际语音效果取决于上游2Noise/ChatTTS权重多语言与音色效果以该模型在实际设备上的运行结果为准。首次启动需要联网下载模型权重与虚拟环境依赖离线环境需提前准备模型缓存。小结通过 Xinference 内置的 ChatTTS 模型开发者可以用一条xinference launch命令获得生产可用的零样本语音合成服务统一的/v1/audio/speech接口兼容 OpenAI 协议voice参数即可实现音色锁定与说话人嵌入克隆seed机制保证合成可复现24kHz 采样率与流式编码则满足实时应用场景。相关实现细节可继续查阅 chattts.py、model_spec.json、restful_api.py 与 test_chattts.py。【免费下载链接】inferenceSwap GPT for any LLM by changing a single line of code. Xinference lets you run open-source, speech, and multimodal models on cloud, on-prem, or your laptop — all through one unified, production-ready inference API.项目地址: https://gitcode.com/GitHub_Trending/in/inference创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考