说实话,今年语音模型的内卷程度已经到了不讲武德的地步。
但这次,Qwen3-TTS 的更新,是真的有点狠,可能会直接刷新你的认知。
阿里通义刚刚上线了 Qwen3-TTS 的两大核心能力:
不仅可以让你自己设计声音,而且还顺手把「跨语言、跨风格、跨角色,甚至跨物种」这件事一起解决了,也可以说是创造声音。
Qwen3-TTS 正在把语音合成,从「音色选择题」,变成「声音编程」。
下面有一段最新能力的演示视频,建议观看↓。
先给大家看几个核心指标,感受下强度:
而真正的杀手锏,其实是下面这两个能力。
以前的 TTS 是什么逻辑?
选一个「男声/女声/情绪」,调下语速、音高,然后结束。
本质还是预设音色池 + 参数微调。
Qwen3-TTS 最新的 VoiceDesign 直接推翻了这套逻辑。
它直接支持全文本控制音色特征:
不需要任何预设音色限制,直接“描述声音”即可。
Role-play 能力据官方测试结果,VoiceDesign 在角色扮演表现上,明显超过 GPT-4o-mini 和 Gemini-2.5-pro。
终于不再是“一个声音演所有角色”。
如果说 VoiceDesign 是「从 0 创造声音」,那 VoiceClone 就是「完美复刻现实世界的声音」。
既一个“创造声音”,另一个“复制灵魂”。
核心亮点:
只要 3 秒音频,就能克隆一个声音,并且让它说 10 种语言。
并且其错误率比 ElevenLabs/GPT-4o 低 15%,还有 0.1 秒级生成速度加成。
所以它具备更低错误率、多语言更稳、音色一致性更强的优势。
甚至支持非常规音色 — 这也是大家说它“跨物种音色克隆”的原因。
这次 Qwen3-TTS 最让人“啊?”的一点是:
已经开始支持非传统人声的风格迁移(跨物种)。
虽然官方描述得比较克制,但从 Demo 来看:卡通音、夸张角色音、动物叫声都已经能稳定复刻。
游戏/动画/IP角色的语音生产成本,会被直接打穿。
想体验现成的服务,可直接在阿里魔搭平台进行 Demo 体验。
声音设计:
https://modelscope.cn/studios/Qwen/Qwen3-TTS-Voice-Design
声音克隆(跨物种):
https://modelscope.cn/studios/Qwen/Qwen-TTS-Clone-Demo
Hugging Face上也有相关Demo,考虑到国内小伙伴们这里就不贴出来了。
另一种方式就是调用 API 服务了,其中 VoiceDesign 的模型名为:qwen3-tts-vd-realtime-2025-12-16,VoiceClone 的模型名为:qwen3-tts-vc-realtime-2025-11-27。
需前往阿里云百炼开通服务,不过应该每人账户都有一些免费额度可使用的。(相关资料文档都会放在文末)
代码调用示例(VoiceClone):
importpyaudio
importos
importrequests
importbase64
importpathlib
importthreading
importtime
importdashscope # DashScope Python SDK 版本需要不低于1.23.9
fromdashscope.audio.qwen_tts_realtimeimportQwenTtsRealtime, QwenTtsRealtimeCallback, AudioFormat
# ======= 常量配置 =======
DEFAULT_TARGET_MODEL ="qwen3-tts-vc-realtime-2025-11-27" # 声音复刻、语音合成要使用相同的模型
DEFAULT_PREFERRED_NAME ="guanyu"
DEFAULT_AUDIO_MIME_TYPE ="audio/mpeg"
VOICE_FILE_PATH ="voice.mp3" # 用于声音复刻的本地音频文件的相对路径
TEXT_TO_SYNTHESIZE = [
'对吧~我就特别喜欢这种超市,',
'尤其是过年的时候',
'去逛超市',
'就会觉得',
'超级超级开心!',
'想买好多好多的东西呢!'
]
defcreate_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)
ifnotfile_path_obj.exists():
raiseFileNotFoundError(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)
ifresp.status_code !=200:
raiseRuntimeError(f"创建 voice 失败:{resp.status_code},{resp.text}")
try:
returnresp.json()["output"]["voice"]
except(KeyError, ValueError)ase:
raiseRuntimeError(f"解析 voice 响应失败:{e}")
definit_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")
# ======= 回调类 =======
classMyCallback(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
)
defon_open(self) ->None:
print('[TTS] 连接已建立')
defon_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}')
defon_event(self, response:dict) ->None:
try:
event_type = response.get('type','')
ifevent_type =='session.created':
print(f'[TTS] 会话开始:{response["session"]["id"]}')
elifevent_type =='response.audio.delta':
audio_data = base64.b64decode(response['delta'])
self._stream.write(audio_data)
elifevent_type =='response.done':
print(f'[TTS] 响应完成, Response ID:{qwen_tts_realtime.get_last_response_id()}')
elifevent_type =='session.finished':
print('[TTS] 会话结束')
self.complete_event.set()
exceptExceptionase:
print(f'[Error] 处理回调事件异常:{e}')
defwait_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'
)
fortext_chunkinTEXT_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')Qwen3-TTS 并不是“炫技型 TTS”,而是可以直接上生产的 TTS。
从这次 Qwen3-TTS 的更新能明显感觉到一个趋势:
语音合成,正在从「音色播放」,进化成「声音建模与设计」。
如果你在做 AI语音Agent、多模态应用、游戏/虚拟角色等,那 Qwen3-TTS 这一波,真的值得重点关注。
值得大家未来应用在各种语音场景中,发挥出它的强大能力
| 欢迎光临 链载Ai (http://www.lianzai.com/) | Powered by Discuz! X3.5 |