跳到正文
原文
通义千问 Qwen:Blog·· 2025-06-27AI 评分41

通义千问发布 Qwen-TTS 语音合成更新,新增北京话、上海话、四川话三种方言

Time to Speak Some Dialects, Qwen-TTS!

文章要点
  • 1通义千问发布 Qwen-TTS 语音合成模型更新,提供 qwen-tts-latest 版本,经 Qwen API 开放调用
  • 2新增北京话、上海话、四川话 3 种中文方言合成,Dylan、Jada、Sunny 三个音色分别对应
  • 3官方称模型经超百万小时语音数据训练,可按输入文本自动调整韵律、节奏和情感语调
  • 4现支持 7 个中英双语音色;官方公布 SeedTTS-eval 指标,Cherry 中文 WER 为 1.209、SIM 为 0.799
决策要点

方言与情感表现力成为语音合成的差异点,方言语音内容的生产门槛降到一次 API 调用的程度。

  • 影响:面向地方市场的客服外呼、有声内容与短视频配音多出方言选项;按 API 调用的模式便于把配音成本与外包录音直接比较;目前效果均为官方口径,采购决策前应以自有文本试听为准。
  • 参考:可考虑用三种方言样音和自有业务文本试听自然度;值得把现有配音、外呼预算按 API 调用重新核算,再选客服或内容场景做小规模试点。
  • 依据:方言支持、7 个音色清单与 SeedTTS-eval 指标均出自官方博客,属官方口径,暂无独立验证。
正文

API DISCORD

Introduction

Here we introduce the latest update of Qwen-TTS (qwen-tts-latest or qwen-tts-2025-05-22) through Qwen API . Trained on a large-scale dataset encompassing over millions of hours of speech, Qwen-TTS achieves human-level naturalness and expressiveness. Notably, Qwen-TTS automatically adjusts prosody, pacing, and emotional inflections in response to the input text. Notably, Qwen-TTS supports the generation of 3 Chinese dialects, including Pekingese, Shanghainese, and Sichuanese.

As of now, Qwen-TTS supports 7 Chinese-English bilingual voices, including Cherry, Ethan, Chelsie, Serena, Dylan (Pekingese), Jada (Shanghainese) and Sunny (Sichuanese). More languages and stylistic options will be released in the near future.

Samples of Chinese Dialects

Here are some samples showcase Qwen-TTS’s ability to capture dialects and natural speech patterns.

SpeakerDialectsTextSample
DylanBeijing我们家那边后面有一个后山,就护城河那边,完了呢我们就在山上啊就其实也没什么,就是在土坡上跑来跑去,然后谁捡个那个嗯比较威风的棍,完了我们就呃得瞎打呃,要不就是什么掏个洞啊什么的。
得有自己的想法,别净跟着别人瞎起哄,多动动脑子,有点儿结构化的思维啥的。
JadaShanghai侬只小赤佬,啊呀,数学句子错它八道题,还想吃肯德基啊!夜到麻将队三缺一啊,嘿嘿,叫阿三头来顶嘛!哦,提前上料这样产品,还要卖300块硬币啊。
侬来帮伊向暖吧,天光已经暗转亮哉。
SunnySichuan胖娃胖嘟嘟,骑马上成都,成都又好耍。胖娃骑白马,白马跳得高。胖娃耍关刀,关刀耍得圆。胖娃吃汤圆。
他一辈子的使命就是不停地爬哟,爬到大海头上去,不管有好多远!

Additional Results

Qwen-TTS has demonstrated human-level performance, and metrics on the SeedTTS-Eval benchmark is shown below:

SpeakerWER (↓)SIM (↑)
zhenhardzhenhard
Chelsie1.2562.0046.1710.6580.4730.662
Serena1.4952.2067.3940.8040.5080.803
Ethan1.4891.9696.7540.7770.5580.779
Cherry1.2091.9676.0690.7990.6640.801

Here are some Chinese-English bilingual samples for these four speakers:

SpeakerTextSample
Cherry对吧!我就特别喜欢这种超市,尤其是过年的时候,去逛超市就觉得超级超级开心,然后买点儿东西就要买好多好多东西,这个也想买那个也想买,然后买一堆东西带回去。
Take a look at http://www.granite.ab.ca/access/email.
Ethan啊?真的假的?他们俩拍吻戏。可是我觉得他们两个没有CP感欸。
Jane's eyes wide with terror, she screamed, "The brakes aren't working! What do we do now? We're completely trapped, and we're heading straight for that wall, I can't stop it!" Then, a strange calm washed over her as she murmured, "Well, at least the view was nice. It's almost poetic, this beautiful scene for our grand finale, isn't it?"
Chelsie哼!还让不让人好好减肥啦,不行,你要请我一顿好的赔偿我哦。
"Oh my gosh! Are we really going to the Maldives? That’s unbelievable!" Jennie squealed.
Serena小狗,么么么么么,你快看它,它好可爱。哇,它倒立了是不是,太厉害了!好呀,我们要不要用狗粮把它拐回家,嗯?
You can call me directly at 4257037344 or my cell 4254447474 or send me a meeting request with all the appropriate information.

How to use

Using Qwen-TTS with Qwen API is simple. We demonstrate a code snippet for you to play with it below:

import os
import requests
import dashscope


def get_api_key():
    api_key = os.getenv("DASHSCOPE_API_KEY")
    if not api_key:
        raise EnvironmentError("DASHSCOPE_API_KEY environment variable not set.")
    return api_key


def synthesize_speech(text, voice="Dylan", model="qwen-tts-latest"):
    api_key = get_api_key()
    try:
        response = dashscope.audio.qwen_tts.SpeechSynthesizer.call(
            model=model,
            api_key=api_key,
            text=text,
            voice=voice,
        )
        
        # Check if response is None
        if response is None:
            raise RuntimeError("API call returned None response")
        
        # Check if response.output is None
        if response.output is None:
            raise RuntimeError("API call failed: response.output is None")
        
        # Check if response.output.audio exists
        if not hasattr(response.output, 'audio') or response.output.audio is None:
            raise RuntimeError("API call failed: response.output.audio is None or missing")
        
        audio_url = response.output.audio["url"]
        return audio_url
    except Exception as e:
        raise RuntimeError(f"Speech synthesis failed: {e}")


def download_audio(audio_url, save_path):
    try:
        resp = requests.get(audio_url, timeout=10)
        resp.raise_for_status()
        with open(save_path, 'wb') as f:
            f.write(resp.content)
        print(f"Audio file saved to: {save_path}")
    except Exception as e:
        raise RuntimeError(f"Download failed: {e}")


def main():
    text = (
        """哟,您猜怎么着?今儿个我看NBA,库里投篮跟闹着玩似的,张手就来,篮筐都得喊他“亲爹”了"""
    )
    save_path = "downloaded_audio.wav"
    try:
        audio_url = synthesize_speech(text)
        download_audio(audio_url, save_path)
    except Exception as e:
        print(e)


if __name__ == "__main__":
    main()

Summary

Qwen-TTS is a text-to-speech model that supports Chinese-English bilingual synthesis and several Chinese dialects. It aims to produce natural and expressive speech, and is available via API. While it shows promising results, we look forward to further improvements and broader language support in the future.

来源:通义千问 Qwen:Blog · qwenlm.github.io