Files
aiData/WeiXin/TTS.md
HuangHai 0597d03a6a 'commit'
2026-01-31 16:31:22 +08:00

966 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Qwen-TTS声音复刻API参考
更新时间:2026-01-17 00:25:11
复制为 MD 格式
产品详情
我的收藏
声音复刻依托大模型进行特征提取,无需训练即可复刻声音。仅需提供 10~20 秒的音频,即可生成高度相似且听感自然的定制音色。声音复刻与语音合成是前后关联的两个步骤。本文档聚焦于介绍声音复刻的参数和接口细节,语音合成请参见实时语音合成-通义千问。
用户指南:关于模型介绍和选型建议请参见实时语音合成-通义千问。
音频要求
高质量的输入音频是获得优质复刻效果的基础。
项目
要求
支持格式
WAV (16bit)、MP3、M4A
音频时长
推荐10~20秒,最长不得超过60秒
文件大小
< 10 MB
采样率
≥ 24 kHz
声道
单声道
内容
音频必须包含至少3秒连续清晰朗读(无背景音),其余部分仅允许短暂停顿(≤2秒);整段音频应避免背景音乐、噪音或其他人声,确保核心朗读内容质量;请使用正常说话音频作为输入,不要上传歌曲或唱歌音频,以确保复刻效果准确和可用
语言
中文(zh)、英文(en)、德语(de)、意大利语(it)、葡萄牙语(pt)、西班牙语(es)、日语(ja)、韩语(ko)、法语(fr)、俄语(ru)
快速开始:从复刻到合成
image
1. 工作流程
声音复刻与语音合成是紧密关联的两个独立步骤,遵循“先创建,后使用”的流程:
创建音色
调用创建音色接口,上传一段音频。系统会分析该音频,创建一个专属的复刻音色。此步骤必须指定target_model,声明创建的音色将由哪个语音合成模型驱动。
若已有创建好的音色(调用查询音色列表接口查看),可跳过这一步直接进行下一步。
使用音色进行语音合成
调用语音合成接口,传入上一步获得的音色。此步骤指定的语音合成模型必须和上一步的target_model一致。
2. 模型配置与准备工作
选择合适的模型并完成准备工作。
模型配置
声音复刻时需要指定以下两个模型:
声音复刻模型:qwen-voice-enrollment
驱动音色的语音合成模型:
qwen3-tts-vc-realtime-2026-01-15
qwen3-tts-vc-realtime-2025-11-27
准备工作
获取API Key:获取API Key,为安全起见,推荐将API Key配置到环境变量。
安装SDK:确保已安装最新版DashScope SDK。
准备待复刻音频:音频需符合音频要求。
3. 端到端示例
以下示例演示了如何在语音合成中使用声音复刻生成的专属音色,实现与原音高度相似的输出效果。
关键原则:声音复刻时,target_model(驱动音色的语音合成模型)必须与后续调用语音合成接口时指定的语音合成模型一致,否则会合成失败。
示例使用本地音频文件 voice.mp3 进行声音复刻,运行代码时,请注意替换。
PythonJava
# coding=utf-8
# Installation instructions for pyaudio:
# APPLE Mac OS X
# brew install portaudio
# pip install pyaudio
# Debian/Ubuntu
# sudo apt-get install python-pyaudio python3-pyaudio
# or
# pip install pyaudio
# CentOS
# sudo yum install -y portaudio portaudio-devel && pip install pyaudio
# Microsoft Windows
# python -m pip install pyaudio
import pyaudio
import os
import requests
import base64
import pathlib
import threading
import time
import dashscope # DashScope Python SDK 版本需要不低于1.23.9
from dashscope.audio.qwen_tts_realtime import QwenTtsRealtime, QwenTtsRealtimeCallback, AudioFormat
# ======= 常量配置 =======
DEFAULT_TARGET_MODEL = "qwen3-tts-vc-realtime-2026-01-15" # 声音复刻、语音合成要使用相同的模型
DEFAULT_PREFERRED_NAME = "guanyu"
DEFAULT_AUDIO_MIME_TYPE = "audio/mpeg"
VOICE_FILE_PATH = "voice.mp3" # 用于声音复刻的本地音频文件的相对路径
TEXT_TO_SYNTHESIZE = [
'对吧~我就特别喜欢这种超市,',
'尤其是过年的时候',
'去逛超市',
'就会觉得',
'超级超级开心!',
'想买好多好多的东西呢!'
]
def create_voice(file_path: str,
target_model: str = DEFAULT_TARGET_MODEL,
preferred_name: str = DEFAULT_PREFERRED_NAME,
audio_mime_type: str = DEFAULT_AUDIO_MIME_TYPE) -> str:
"""
创建音色,并返回 voice 参数
"""
# 新加坡和北京地域的API Key不同。获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key = "sk-xxx"
api_key = os.getenv("DASHSCOPE_API_KEY")
file_path_obj = pathlib.Path(file_path)
if not file_path_obj.exists():
raise FileNotFoundError(f"音频文件不存在: {file_path}")
base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
data_uri = f"data:{audio_mime_type};base64,{base64_str}"
# 以下为北京地域url,若使用新加坡地域的模型,需将url替换为:https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
url = "https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization"
payload = {
"model": "qwen-voice-enrollment", # 不要修改该值
"input": {
"action": "create",
"target_model": target_model,
"preferred_name": preferred_name,
"audio": {"data": data_uri}
}
}
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
resp = requests.post(url, json=payload, headers=headers)
if resp.status_code != 200:
raise RuntimeError(f"创建 voice 失败: {resp.status_code}, {resp.text}")
try:
return resp.json()["output"]["voice"]
except (KeyError, ValueError) as e:
raise RuntimeError(f"解析 voice 响应失败: {e}")
def init_dashscope_api_key():
"""
初始化 dashscope SDK 的 API key
"""
# 新加坡和北京地域的API Key不同。获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
# 若没有配置环境变量,请用百炼API Key将下行替换为:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
# ======= 回调类 =======
class MyCallback(QwenTtsRealtimeCallback):
"""
自定义 TTS 流式回调
"""
def __init__(self):
self.complete_event = threading.Event()
self._player = pyaudio.PyAudio()
self._stream = self._player.open(
format=pyaudio.paInt16, channels=1, rate=24000, output=True
)
def on_open(self) -> None:
print('[TTS] 连接已建立')
def on_close(self, close_status_code, close_msg) -> None:
self._stream.stop_stream()
self._stream.close()
self._player.terminate()
print(f'[TTS] 连接关闭 code={close_status_code}, msg={close_msg}')
def on_event(self, response: dict) -> None:
try:
event_type = response.get('type', '')
if event_type == 'session.created':
print(f'[TTS] 会话开始: {response["session"]["id"]}')
elif event_type == 'response.audio.delta':
audio_data = base64.b64decode(response['delta'])
self._stream.write(audio_data)
elif event_type == 'response.done':
print(f'[TTS] 响应完成, Response ID: {qwen_tts_realtime.get_last_response_id()}')
elif event_type == 'session.finished':
print('[TTS] 会话结束')
self.complete_event.set()
except Exception as e:
print(f'[Error] 处理回调事件异常: {e}')
def wait_for_finished(self):
self.complete_event.wait()
# ======= 主执行逻辑 =======
if __name__ == '__main__':
init_dashscope_api_key()
print('[系统] 初始化 Qwen TTS Realtime ...')
callback = MyCallback()
qwen_tts_realtime = QwenTtsRealtime(
model=DEFAULT_TARGET_MODEL,
callback=callback,
# 以下为北京地域url,若使用新加坡地域的模型,需将url替换为:wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime
url='wss://dashscope.aliyuncs.com/api-ws/v1/realtime'
)
qwen_tts_realtime.connect()
qwen_tts_realtime.update_session(
voice=create_voice(VOICE_FILE_PATH), # 将voice参数替换为复刻生成的专属音色
response_format=AudioFormat.PCM_24000HZ_MONO_16BIT,
mode='server_commit'
)
for text_chunk in TEXT_TO_SYNTHESIZE:
print(f'[发送文本]: {text_chunk}')
qwen_tts_realtime.append_text(text_chunk)
time.sleep(0.1)
qwen_tts_realtime.finish()
callback.wait_for_finished()
print(f'[Metric] session_id={qwen_tts_realtime.get_session_id()}, '
f'first_audio_delay={qwen_tts_realtime.get_first_audio_delay()}s')
API参考
使用不同 API 时,请确保使用同一账号进行操作。
创建音色
上传用于复刻的音频,创建自定义音色。
URL
中国内地:
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
国际:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
请求头
参数
类型
是否必须
说明
Authorization
string
支持
鉴权令牌,格式为Bearer <your_api_key>,使用时,将“<your_api_key>”替换为实际的API Key。
Content-Type
string
支持
请求体中传输的数据的媒体类型。固定为application/json。
消息体
包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略。
重要
注意区分如下参数:
model:声音复刻模型,固定为qwen-voice-enrollment
target_model:驱动音色的语音合成模型,须和后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败
{
"model": "qwen-voice-enrollment",
"input": {
"action": "create",
"target_model": "qwen3-tts-vc-realtime-2026-01-15",
"preferred_name": "guanyu",
"audio": {
"data": "https://xxx.wav"
},
"text": "可选项,填入audio.data对应的文本",
"language": "可选项,填入audio.data对应的语种,如zh"
}
}
请求参数
参数
类型
默认值
是否必须
说明
model
string
-
支持
声音复刻模型,固定为qwen-voice-enrollment。
action
string
-
支持
操作类型,固定为create。
target_model
string
-
支持
驱动音色的语音合成模型,支持的模型有:
qwen3-tts-vc-realtime-2026-01-15
qwen3-tts-vc-realtime-2025-11-27
必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。
preferred_name
string
-
支持
为音色指定一个便于识别的名称(仅允许数字、大小写字母和下划线,不超过16个字符)。建议选用与角色、场景相关的标识。
该关键字会在复刻的音色名中出现,例如关键字为“guanyu”,最终音色名为“qwen-tts-vc-guanyu-voice-20250812105009984-838b”
audio.data
string
-
支持
用于复刻的音频(录制时需遵循录音操作指南,音频需满足音频要求)。
可通过以下两种方式提交音频数据:
Data URL
格式:data:<mediatype>;base64,<data>
<mediatype>:MIME类型
WAV:audio/wav
MP3:audio/mpeg
M4A:audio/mp4
<data>:音频转成的Base64编码的字符串
Base64编码会增大体积,请控制原文件大小,确保编码后仍小于10MB
示例:data:audio/wav;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//PAxABQ/BXRbMPe4IQAhl9
点击查看示例代码
音频URL(推荐将音频上传至OSS)
文件大小不超过10MB
URL必须公网可访问且无需鉴权
text
string
-
不支持
与audio.data音频内容相匹配的文本。
传入该参数后,服务端会对比音频与该文本的差异,若差异过大,将返回Audio.PreprocessError。
language
string
-
不支持
audio.data音频对应的语种。
支持zh(中文)、en(英文)、de(德语)、it(意大利语)、pt(葡萄牙语)、es(西班牙语)、ja(日语)、ko(韩语)、fr(法语)、ru(俄语)。
若使用该参数,设置的语种要和实际用于复刻的音频的语种一致。
响应参数
点击查看响应示例
需关注的参数如下:
参数
类型
说明
voice
string
音色名称,可直接用于语音合成接口的voice参数。
target_model
string
驱动音色的语音合成模型,支持的模型有:
qwen3-tts-vc-realtime-2026-01-15
qwen3-tts-vc-realtime-2025-11-27
必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。
request_id
string
Request ID。
count
integer
本次请求实际计入费用的“创建音色”次数,本次请求的费用为
count×0.01
元。
创建音色时,count恒为1。
示例代码
重要
注意区分如下参数:
model:声音复刻模型,固定为qwen-voice-enrollment
target_model:驱动音色的语音合成模型,须和后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败
cURLPythonJava
若未将API Key配置到环境变量,需将示例中的$DASHSCOPE_API_KEY替换为实际的API Key。
# ======= 重要提示 =======
# 以下为北京地域url,若使用新加坡地域的模型,需将url替换为:https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
# 新加坡地域和北京地域的API Key不同。获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
# === 执行时请删除该注释 ===
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-voice-enrollment",
"input": {
"action": "create",
"target_model": "qwen3-tts-vc-realtime-2026-01-15",
"preferred_name": "guanyu",
"audio": {
"data": "https://xxx.wav"
}
}
}'
查询音色列表
分页查询已创建的音色列表。
URL
中国内地:
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
国际:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
请求头
参数
类型
是否必须
说明
Authorization
string
支持
鉴权令牌,格式为Bearer <your_api_key>,使用时,将“<your_api_key>”替换为实际的API Key。
Content-Type
string
支持
请求体中传输的数据的媒体类型。固定为application/json。
消息体
包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略。
重要
model:声音复刻模型,固定为qwen-voice-enrollment,请勿修改。
{
"model": "qwen-voice-enrollment",
"input": {
"action": "list",
"page_size": 2,
"page_index": 0
}
}
请求参数
参数
类型
默认值
是否必须
说明
model
string
-
支持
声音复刻模型,固定为qwen-voice-enrollment。
action
string
-
支持
操作类型,固定为list。
page_index
integer
0
不支持
页码索引。取值范围:[0, 1000000]。
page_size
integer
10
不支持
每页包含数据条数。取值范围:[0, 1000000]。
响应参数
点击查看响应示例
需关注的参数如下:
参数
类型
说明
voice
string
音色名称,可直接用于语音合成接口的voice参数。
gmt_create
string
创建音色的时间。
target_model
string
驱动音色的语音合成模型,支持的模型有:
qwen3-tts-vc-realtime-2026-01-15
qwen3-tts-vc-realtime-2025-11-27
必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。
request_id
string
Request ID。
count
integer
本次请求实际计入费用的“创建音色”次数,本次请求的费用为
count×0.01
元。
查询音色不计费,因此count恒为0。
示例代码
重要
model:声音复刻模型,固定为qwen-voice-enrollment,请勿修改。
cURLPythonJava
若未将API Key配置到环境变量,需将示例中的$DASHSCOPE_API_KEY替换为实际的API Key。
# ======= 重要提示 =======
# 以下为北京地域url,若使用新加坡地域的模型,需将url替换为:https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
# 新加坡地域和北京地域的API Key不同。获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
# === 执行时请删除该注释 ===
curl --location --request POST 'https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization' \
--header 'Authorization: Bearer $DASHSCOPE_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "qwen-voice-enrollment",
"input": {
"action": "list",
"page_size": 10,
"page_index": 0
}
}'
删除音色
删除指定音色,释放对应额度。
URL
中国内地:
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization
国际:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
请求头
参数
类型
是否必须
说明
Authorization
string
支持
鉴权令牌,格式为Bearer <your_api_key>,使用时,将“<your_api_key>”替换为实际的API Key。
Content-Type
string
支持
请求体中传输的数据的媒体类型。固定为application/json。
消息体
包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
重要
model:声音复刻模型,固定为qwen-voice-enrollment,请勿修改。
{
"model": "qwen-voice-enrollment",
"input": {
"action": "delete",
"voice": "yourVoice"
}
}
请求参数
参数
类型
默认值
是否必须
说明
model
string
-
支持
声音复刻模型,固定为qwen-voice-enrollment。
action
string
-
支持
操作类型,固定为delete。
voice
string
-
支持
待删除的音色。
响应参数
点击查看响应示例
需关注的参数如下:
参数
类型
说明
request_id
string
Request ID。
count
integer
本次请求实际计入费用的“创建音色”次数,本次请求的费用为
count×0.01
元。
删除音色不计费,因此count恒为0。
示例代码
重要
model:声音复刻模型,固定为qwen-voice-enrollment,请勿修改。
cURLPythonJava
若未将API Key配置到环境变量,需将示例中的$DASHSCOPE_API_KEY替换为实际的API Key。
# ======= 重要提示 =======
# 以下为北京地域url,若使用新加坡地域的模型,需将url替换为:https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization
# 新加坡地域和北京地域的API Key不同。获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
# === 执行时请删除该注释 ===
curl --location --request POST 'https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization' \
--header 'Authorization: Bearer $DASHSCOPE_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "qwen-voice-enrollment",
"input": {
"action": "delete",
"voice": "yourVoice"
}
}'
语音合成
如何使用声音复刻生成的专属音色合成个性化的声音,请参见快速开始:从复刻到合成。
用于声音复刻的语音合成模型(如 qwen3-tts-vc-realtime-2026-01-15)为专用模型,仅支持使用复刻生成的音色,不支持Chelsie、Serena、Ethan、Cherry等公共预设音色。
音色配额与自动清理规则
总数限制:1000个音色/账号
当前接口不提供音色数量查询功能,可通过调用查询音色列表接口自行统计音色数目
自动清理:若单个音色在过去一年内未被用于任何语音合成请求,系统将自动将其删除
计费说明
声音复刻和语音合成分开计费:
声音复刻:创建音色按0.01 元/个计费,创建失败不计费
说明
免费额度说明(仅中国站北京地域和国际站新加坡地域有免费额度):
阿里云百炼开通后90天内,可享1000次免费音色创建机会。
创建失败不占用免费次数。
删除音色不会恢复免费次数。
免费额度用完或超出 90 天有效期后,创建音色将按0.01 元/个的价格计费。
使用复刻生成的专属音色进行语音合成:按量(文本字符数)计费,详情请参见实时语音合成-通义千问
版权与合法性
您需对所提供声音的所有权及合法使用权负责,请注意阅读服务协议。
录音操作指南
录音设备
推荐使用具备降噪功能的麦克风,或在安静环境下使用手机近距离录音,以保证音源纯净。
录音环境
场地
建议在 10 平方米以内的小型封闭空间录音。
优先选择配有吸音材料(如吸音棉、地毯、窗帘)的房间。
避免空旷大厅、会议室、教室等高混响场所。
噪音控制
室外噪音:关闭门窗,避免交通、施工等干扰。
室内噪音:关闭空调、风扇、日光灯镇流器等设备;可通过手机录制环境音并放大播放,识别潜在噪音源。
混响控制
混响会导致声音模糊、清晰度下降。
减少光滑表面反射:拉上窗帘、打开衣柜门、铺放衣物或床单覆盖桌面/柜面。
利用不规则物体(如书架、软包家具)实现声波漫反射。
录音文案
文案内容灵活,建议与目标应用场景一致(例如,若用于客服场景,文案应为客服对话风格),但必须确保不包含任何敏感或非法词汇(如政治、色情、暴力相关内容),否则会导致复刻失败。
避免短句(如“你好”、“是的”),应使用完整句子。
保持语义连贯,朗读时避免频繁停顿(建议至少连续 3 秒无中断)。
可带入目标情绪(如亲切、严肃),但需避免过度夸张的戏剧化朗读,保持语调自然。
操作建议
以普通卧室为例:
关闭门窗,隔绝外部噪音。
关闭空调、电扇等电器。
拉上窗帘,减少玻璃反射。
在桌面铺放衣物或毛毯,降低桌面反射。
提前熟悉文案,设定角色语气,自然演绎。
与录音设备保持约 10 厘米距离,避免喷麦或信号过弱。