在 SageMaker JumpStart 上部署 Qwen3-TTS-12Hz-1.7B 开源语音模型,实现实时 TTS 与跨语言声音克隆,含完整架构与验证结果。
通过语音克隆,你可以用一段简短的参考录音生成目标说话人音色的新语音,无需重新训练模型。现在,你可以将 Amazon SageMaker JumpStart 上公开可用的 Qwen3-TTS-12Hz-1.7B-Base 文语转换模型部署到一个完全托管的实时推理端点。
语音克隆会复现特定说话人的声音特征。先获取该说话人的一段短录音及其转写文本,然后提供需要合成的新文本。模型会以参考说话人的音色说出该文本,全程无需重新训练。媒体团队、教育工作者和应用开发者可以利用这一能力打造个性化语音体验,并实现多语言内容的本地化。他们还可以支持无障碍沟通,并跨越语言保留说话人的身份特征。
通过自托管的公开语音克隆模型,你可以控制成本,并将音频数据保留在 AWS 环境内。你也可以针对自己的领域对模型进行定制。有了 Amazon SageMaker AI,你可以在完全托管的实时端点上运行模型,处理基础设施配置、健康监控和自动扩缩,无需管理底层 GPU 服务器。
本文展示了如何使用 Amazon SageMaker Python SDK 从 Amazon SageMaker JumpStart 部署 Qwen3-TTS-12Hz-1.7B-Base,以及如何调用生成的端点从参考片段克隆语音。还涵盖了使此部署在实际中可行所需的配置设置,以及可用于监控和合理调整端点大小的 Amazon CloudWatch 指标。
Qwen3-TTS 是由阿里云通义团队开发的公开可用的文语转换模型系列。它支持 10 种语言:中文、英语、日语、韩语、德语、法语、俄语、葡萄牙语、西班牙语和意大利语。这些模型使用 Qwen3-TTS-Tokenizer-12Hz 语音分词器,并支持流式生成以满足低延迟的交互场景需求。
本文使用的是 Base 变体 Qwen3-TTS-12Hz-1.7B-Base。它仅需几秒的用户音频即可实现语音克隆。它也可以作为微调的基础模型。在语音克隆时,模型接收一段参考音频片段及其转写文本。它会捕捉说话人的声音特征(如音色、音高和韵律),并将这些特征应用到新文本上。这与 CustomVoice 变体不同——后者从预定义的固定说话人集合生成语音,而非用户提供的参考音频。
该模型还支持跨语言克隆:你可以从一种语言的参考音频中捕捉声音,然后在另一种语言中生成语音,同时保留说话人的声音特征。
Qwen3-TTS-12Hz-1.7B-Base 可在 Amazon SageMaker JumpStart 中与 Qwen3-TTS-12Hz-1.7B-CustomVoice 和 Qwen3-ASR-1.7B 一起使用。通过这些 JumpStart 选项,你可以使用本文展示的简化部署方式。
通过语音克隆,应用可以从参考录音中复现选定说话人的声音特征,而不必局限于预定义的固定语音集合。这支持了媒体、客户互动、教育和对话式 AI 等一系列应用场景。
此部署方式的主要优势包括:
大规模个性化:你可以用短样本生成目标音色的语音,无需收集大量训练数据集。
多语言覆盖:你可以捕捉一种语言中的声音,在另一种语言中生成语音,同时保留身份特征。
成本效益:部署成本与计算使用量对齐,而非按字符数计费的 API 定价。
数据控制:数据保留在你的 AWS 账户和你管理的 Amazon SageMaker 端点内。
语音克隆的常见应用包括:
内容本地化:你可以在保留原说话人声音的同时,将内容翻译成多种语言。
客户体验:联络中心和虚拟助手响应可以使用一致的品牌声音。
电子学习和有声书:你可以用特定讲师或作者的声音呈现长篇内容。
创意原型:你可以在录音棚制作之前测试对话和配音。
实时对话式 AI:流式语音识别和低延迟合成可以支持交互式语音代理。
此解决方案将 Qwen3-TTS-12Hz-1.7B-Base 从 Amazon SageMaker JumpStart 部署到实时端点。JumpStart 提供模型构件和预构建的服务容器,因此你无需编写自定义推理处理器。你只需构造一个 JumpStartModel 对象,调用其 deploy 方法,然后使用 Amazon SageMaker 运行时客户端调用生成的端点。
JumpStart 容器服务该模型,从文本输入生成 24 kHz 音频输出。这个阶段设计会影响你如何配置 GPU 内存大小,下一节将详细说明。
下图展示了该部署的实时推理架构。

部署遵循标准的 Amazon SageMaker AI 实时推理模式:
在开始之前,请确认你拥有以下资源和权限:
使用模型 ID 构造 JumpStartModel 并部署。GPU 内存覆盖是此部署最重要的设置。以下章节将解释如何配置它。在运行以下代码之前,请将 <sagemaker-execution-role-arn> 替换为 Amazon SageMaker AI 用于部署模型的 IAM 执行角色的 ARN。
from sagemaker.jumpstart.model import JumpStartModel
model = JumpStartModel(
model_id="huggingface-ttsvoiceclone-qwen3-tts-12hz-1-7b-base",
model_version="1.0.1", # pin for reproducibility
instance_type="ml.g6.4xlarge", # 24 GB L4
role="<sagemaker-execution-role-arn>",
env={"SM_VLLM_GPU_MEMORY_UTILIZATION": "0.45"}, # required (see the following section)
)
predictor = model.deploy(
endpoint_name="qwen3-tts-voice-clone",
accept_eula=True,
)
端点需要几分钟时间到达 InService 状态,期间容器将模型加载到 GPU 上。你可以在 Amazon SageMaker AI 控制台中监控端点状态,或调用 describe_endpoint API。
如前所述,模型在同一 GPU 上分为两个阶段(talker 和 code2wav)运行。vLLM 会根据 gpu_memory_utilization(一个阶段可以Claim的 GPU 内存比例)预先保留 GPU 内存。两个阶段共享一块 GPU。为避免启动时出现显存不足错误,请将它们的总保留量控制在 GPU 容量范围内。
设置该值使两个阶段能舒适地共存。由于一个共享设置等效应用于两个阶段,0.45 效果良好(0.45 + 0.45 = 0.90,留出约 10% 的缓冲空间):
env={"SM_VLLM_GPU_MEMORY_UTILIZATION": "0.45"}
容器启动时,每个阶段会将其内存使用情况记录到 Amazon CloudWatch Logs 中端点的日志组中。以下数值确认模型在 24 GB GPU 上拟合良好:
模型权重很小(talker 为 3.66 GiB,code2wav 为 0.45 GiB)。每个阶段被允许使用的剩余内存大部分成为 KV 缓存,这是保存飞行中请求 token 的工作内存。在 24 GB GPU 上利用率为 0.45(约 22 GiB 可用)时,每个阶段最多可使用约 10 GiB。两个阶段合在一起在 GPU 内且还有余量。这就是 24 GB GPU 非常适合 1.7B 模型的原因,无需更大的 GPU。
端点进入 InService 状态后,测试语音克隆。有两个细节专属于此 JumpStart 容器,对获取响应至关重要:
路由选择:Amazon SageMaker 端点暴露单个 /invocations 路径,默认为 completions handler。要访问文语转换处理器,你必须传递自定义属性 route=/v1/audio/speech。否则请求会被拒绝。
负载格式:使用 OpenAI speech schema,将 task_type 设置为 "Base" 以进行语音克隆,并包含参考片段 URI 及其转写文本。
音频格式:将参考片段作为 base64 编码的 data:audio/wav;base64,... URI 提供。在编码前将参考音频转换为 24 kHz 单声道 WAV 是推荐的输入形式。端点按你通过 response_format 请求的格式返回音频。本文使用 "wav",模型生成 24 kHz 单声道音频。
以下代码转换参考片段并将其 base64 编码:
import base64, io, json, subprocess
import boto3, soundfile as sf, imageio_ffmpeg
ffmpeg = imageio_ffmpeg.get_ffmpeg_exe()
subprocess.run([ffmpeg, "-y", "-i", "reference.m4a",
"-ar", "24000", "-ac", "1", "reference.wav"], check=True)
data, sr = sf.read("reference.wav", dtype="float32")
buf = io.BytesIO(); sf.write(buf, data, sr, format='WAV'); buf.seek(0)
ref_uri = "data:audio/wav;base64," + base64.b64encode(buf.read()).decode()
REF_TEXT = "Transcript of the words spoken in the reference clip."
使用 input 中的目标文本和 ref_audio 中的参考片段调用端点。注意 CustomAttributes 路由参数,这是访问文语转换处理器所必需的:
runtime = boto3.client("sagemaker-runtime")
payload = {
"model": "/opt/ml/model",
"input": "This is a demonstration of real-time voice cloning using Qwen TTS on Amazon SageMaker AI.",
"task_type": "Base",
"ref_audio": ref_uri,
"ref_text": REF_TEXT,
"language": "English",
"response_format": "wav",
}
resp = runtime.invoke_endpoint(
EndpointName="qwen3-tts-voice-clone",
ContentType="application/json",
CustomAttributes="route=/v1/audio/speech", # required to reach the TTS handler
Body=json.dumps(payload),
)
open("clone.wav", "wb").write(resp["Body"].read())
上述请求是最基本的情况:将一句文本返回为克隆声音的语音。以下模式在此基础上构建,使用相同的 ref_audio、ref_text 和路由自定义属性。
此示例的音频样本(打开本文提供的文件):
参考输入:reference_original_input.wav
生成输出:cloned_output.wav
单个请求非常适合一句话或短段落。对于较长内容(如文章或多行脚本),请将其拆分,每句话或每个段落发送一个请求,以保持声音从头到尾的一致性。
要在保持相同声音的同时生成另一种语言的语音,请使用相同的参考片段并将 "language" 设置为另一种支持的语言。以下示例使用英语参考生成中文语音,在跨语言的同时保留说话人的声音特征。
payload = {
"model": "/opt/ml/model",
"input": "你好,这是一个语音克隆的测试。",
"task_type": "Base",
"ref_audio": ref_uri, # same English reference
"ref_text": REF_TEXT,
"language": "Chinese",
"response_format": "wav",
}
resp = runtime.invoke_endpoint(
EndpointName="qwen3-tts-voice-clone",
ContentType="application/json",
CustomAttributes="route=/v1/audio/speech",
Body=json.dumps(payload),
)
open("clone_chinese.wav", "wb").write(resp["Body"].read())
生成输出:cross_lingual_cloning.wav
按三步选择实例。首先,确认 JumpStart 支持该实例。然后,检查你的服务配额并确认其 GPU 内存能容纳模型。对于 1.7B 模型,24 GB GPU(g6 系列,NVIDIA L4)匹配良好且具有成本效益。
要估算并发请求容量,请查看 Amazon CloudWatch Logs 中端点日志组的 KV 缓存 token 预算。日志组路径为 /aws/sagemaker/Endpoints/<endpoint-name>。容器启动时,你将看到如下一行:
GPU KV cache size: 56,928 tokens
此值是 KV 缓存总容量,以 token 为单位测量。它表示预留缓存可在并发请求中保存的总 token 数。用此预算除以平均请求大小即可估算并发容量。由于 TTS 请求通常较短,单个实例可以处理多个并发请求。
对于更高流量,请添加端点实例或选择具有更大 GPU 容量的实例类型。Amazon SageMaker AI 自动扩缩可以根据需求调整实例数量。
Amazon SageMaker AI 会自动将端点指标发布到 Amazon CloudWatch。它们分为两组:实例级硬件指标和调用级请求指标。用它们来合理调整实例大小、调优并发和设置告警。
实例(硬件)指标
命名空间 /aws/sagemaker/Endpoints,维度为 EndpointName 和 VariantName:
调用(请求)指标
命名空间 AWS/SageMaker,维度相同:
使用 Sum 统计量查看 Invocations 以了解一段时间内的总请求数。
为避免产生持续费用,请在完成后删除端点、端点配置和模型:
predictor.delete_endpoint() # deletes endpoint and endpoint config
predictor.delete_model()
本文展示了如何将公开可用的 Qwen3-TTS-12Hz-1.7B-Base 模型使用 Amazon SageMaker JumpStart 部署到 Amazon SageMaker AI 实时端点。还展示了如何调用该端点从短参考片段和转写文本克隆语音。通过托管的实时端点,你可以控制自己的数据,并将成本与所使用的计算对齐,同时无需管理底层基础设施。
要开始使用,请参阅 Amazon SageMaker JumpStart 指南在 Amazon SageMaker Studio 中打开 JumpStart。搜索 "Qwen3-TTS-12Hz-1.7B-Base" 并使用本文中的配置部署模型。有关模型详情,请参阅 Qwen3-TTS 模型卡。