找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2270

积分

0

好友

320

主题
发表于 2025-12-25 07:34:18 | 查看: 34| 回复: 0

最近,语音合成(TTS)领域的技术竞争异常激烈,而阿里通义最新推出的Qwen3-TTS两大核心能力,无疑将标准提升到了新的高度。

图片

此次更新的核心在于两个功能:

  • VoiceDesign(VD-Flash):通过文本描述来“设计”声音,彻底改变传统选音色的模式。
  • VoiceClone(VC-Flash):仅需3秒音频,即可实现跨语言乃至跨物种的高保真音色克隆。

这意味着,Qwen3-TTS不仅让用户能自由创造声音,更在音色克隆的广度上取得了突破,将语音合成从“选择题”变成了“编程题”。

核心性能指标速览

在深入了解功能前,我们先看几个关键数据,感受其技术实力:

  • 0.1秒级生成速度
  • 🌍 支持10种语言的混合克隆
  • 🗣️ 内置50种声音与9种方言
  • 📉 错误率较ElevenLabs/GPT-4o降低15%
  • 🎭 角色扮演(Role-play)表现优于GPT-4o-mini和Gemini-2.5-pro

VoiceDesign:用文本“编程”声音

传统的TTS通常是在预设的音色库中进行选择,并调整语速、音高等参数。Qwen3-TTS的VoiceDesign功能彻底颠覆了这一流程,它允许你通过纯文本指令来定义声音的方方面面:

  • 语气:如冷静、兴奋、疯狂、克制。
  • 节奏:如急促、断句、停顿。
  • 情绪:如愤怒、悲伤、戏谑、神秘。
  • 表演风格:如旁白、角色扮演、AI助手。

你不再受限于预设音色,只需“描述”你想要的音色特征即可。根据官方测试,VoiceDesign在角色扮演方面的表现已显著超越GPT-4o-mini和Gemini-2.5-pro。

图片

这终于让“一个声音演所有角色”的时代成为过去式。

VoiceClone:3秒音频,完美复刻

如果说VoiceDesign是“从0创造声音”,那么VoiceClone就是“精准复制现实世界的声音”。一个负责创造,另一个则负责复刻灵魂。

其核心亮点在于:仅需3秒的音频样本,即可克隆一个声音,并让该声音流利说出10种语言。 同时,它还具备比ElevenLabs/GPT-4o低15%的错误率,以及0.1秒级的实时生成速度。

图片

因此,它在错误率、多语言稳定性以及音色一致性方面都更具优势。更引人注目的是,它支持对卡通音、夸张角色音乃至动物叫声等非常规音色进行克隆,这也是其“跨物种”能力的体现。

跨物种音色克隆:拓展应用边界

Qwen3-TTS本次更新最令人惊叹的一点,是正式支持了非传统人声的风格迁移。尽管官方描述谨慎,但从演示来看,无论是卡通角色还是拟人化的动物声音,都能被稳定地复刻和生成。这对于游戏、动画及IP角色的语音内容生产而言,无疑将大幅降低制作成本。

快速体验与集成

想要快速体验,可以直接访问阿里魔搭平台提供的Demo:

若需集成到自己的人工智能应用中,可以通过API进行调用。相关模型名称为:

  • VoiceDesign:qwen3-tts-vd-realtime-2025-12-16
  • VoiceClone:qwen3-tts-vc-realtime-2025-11-27

开发者需前往阿里云百炼开通服务,新用户通常享有免费额度。以下是使用Python调用VoiceClone API的示例代码:

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-2025-11-27"  # 声音复刻、语音合成要使用相同的模型
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')

总结与展望

Qwen3-TTS的这次更新并非单纯的“炫技”,而是具备直接投入生产环境应用的成熟度。它清晰地揭示了一个趋势:语音合成技术正从简单的“音色播放”向复杂的“声音建模与设计”进化。

对于正在开发AI语音助手、多模态交互应用、游戏或虚拟角色等项目的开发者而言,Qwen3-TTS此次带来的VoiceDesign与VoiceClone能力,值得深入研究并集成到未来的应用场景中。

相关资源链接:




上一篇:DeepAudit:开源代码审计多智能体系统,支持一键部署与自动化验证
下一篇:CLI AI编码工具深度解析:从Unix设计哲学到高效编程实战
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-11 14:18 , Processed in 0.261728 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表