Files
sad_test01/aicodes/语音合成CosyVoice.md
anthony-s526 ffc4192ff0 Add CardioAI project with three modules
- Module 1: Dashboard for cardiovascular disease data visualization
- Module 2: Machine learning predictor with Flask API
- Module 3: Voice assistant with DeepSeek and CosyVoice integration
- Add .gitignore for proper file exclusion
- Update requirements and documentation

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 21:26:10 +08:00

26 KiB
Raw Blame History

语音合成CosyVoice Python SDK

https://help.aliyun.com/zh/model-studio/cosyvoice-python-sdk#915a935d871ak

dashscope.api_key = "sk-6fecb52bb96d4492bb7e58213eeeb00f"

流式调用

在同一个语音合成任务中分多次提交文本,并通过回调的方式实时获取合成结果。

说明

  • 流式输入时可多次调用streaming_call按顺序提交文本片段。服务端接收文本片段后自动进行分句:

    • 完整语句立即合成
    • 不完整语句缓存至完整后合成

    调用 streaming_complete 时,服务端会强制合成所有已接收但未处理的文本片段(包括未完成的句子)。

  • 发送文本片段的间隔不得超过23秒否则触发“request timeout after 23 seconds”异常。

    若无待发送文本,需及时调用 streaming_complete结束任务。

    服务端强制设定23秒超时机制客户端无法修改该配置。

image

  1. 实例化SpeechSynthesizer类

    实例化SpeechSynthesizer类绑定请求参数回调接口ResultCallback

  2. 流式传输

    多次调用SpeechSynthesizer类streaming_call方法分片提交待合成文本,将待合成文本分段发送至服务端。

    在发送文本的过程中,服务端会通过回调接口ResultCallbackon_data方法,将合成结果实时返回给客户端。

    每次调用streaming_call方法发送的文本片段(即text长度不得超过2000字符累计发送的文本总长度不得超过20万字符。

  3. 结束处理

    调用SpeechSynthesizer类streaming_complete方法结束语音合成。

    该方法会阻塞当前线程,直到回调接口ResultCallbackon_complete或者on_error回调触发后才会释放线程阻塞。

    请务必确保调用该方法,否则可能会导致结尾部分的文本无法成功转换为语音。

# coding=utf-8
#
# pyaudio安装说明
# 如果是macOS操作系统执行如下命令
#   brew install portaudio
#   pip install pyaudio
# 如果是Debian/Ubuntu操作系统执行如下命令
#   sudo apt-get install python-pyaudio python3-pyaudio
#   或者
#   pip install pyaudio
# 如果是CentOS操作系统执行如下命令
#   sudo yum install -y portaudio portaudio-devel && pip install pyaudio
# 如果是Microsoft Windows执行如下命令
#   python -m pip install pyaudio

import time
import pyaudio
import dashscope
from dashscope.api_entities.dashscope_response import SpeechSynthesisResponse
from dashscope.audio.tts_v2 import *

from datetime import datetime

def get_timestamp():
    now = datetime.now()
    formatted_timestamp = now.strftime("[%Y-%m-%d %H:%M:%S.%f]")
    return formatted_timestamp

# 若没有将API Key配置到环境变量中需将your-api-key替换为自己的API Key
# dashscope.api_key = "your-api-key"

# 模型
model = "cosyvoice-v2"
# 音色
voice = "longxiaochun_v2"


# 定义回调接口
class Callback(ResultCallback):
    _player = None
    _stream = None

    def on_open(self):
        print("连接建立:" + get_timestamp())
        self._player = pyaudio.PyAudio()
        self._stream = self._player.open(
            format=pyaudio.paInt16, channels=1, rate=22050, output=True
        )

    def on_complete(self):
        print("语音合成完成,所有合成结果已被接收:" + get_timestamp())

    def on_error(self, message: str):
        print(f"语音合成出现异常:{message}")

    def on_close(self):
        print("连接关闭:" + get_timestamp())
        # 停止播放器
        self._stream.stop_stream()
        self._stream.close()
        self._player.terminate()

    def on_event(self, message):
        pass

    def on_data(self, data: bytes) -> None:
        print(get_timestamp() + " 二进制音频长度为:" + str(len(data)))
        self._stream.write(data)


callback = Callback()

test_text = [
    "流式文本语音合成SDK",
    "可以将输入的文本",
    "合成为语音二进制数据,",
    "相比于非流式语音合成,",
    "流式合成的优势在于实时性",
    "更强。用户在输入文本的同时",
    "可以听到接近同步的语音输出,",
    "极大地提升了交互体验,",
    "减少了用户等待时间。",
    "适用于调用大规模",
    "语言模型LLM以",
    "流式输入文本的方式",
    "进行语音合成的场景。",
]

# 实例化SpeechSynthesizer并在构造方法中传入模型model、音色voice等请求参数
synthesizer = SpeechSynthesizer(
    model=model,
    voice=voice,
    format=AudioFormat.PCM_22050HZ_MONO_16BIT,  
    callback=callback,
)


# 流式发送待合成文本。在回调接口的on_data方法中实时获取二进制音频
for text in test_text:
    synthesizer.streaming_call(text)
    time.sleep(0.1)
# 结束流式语音合成
synthesizer.streaming_complete()

# 首次发送文本时需建立 WebSocket 连接,因此首包延迟会包含连接建立的耗时
print('[Metric] requestId为{},首包延迟为:{}毫秒'.format(
    synthesizer.get_last_request_id(),
    synthesizer.get_first_package_delay()))

请求参数

请求参数通过SpeechSynthesizer类的构造方法进行设置。

参数 类型 默认值 是否必须 说明
model str - 指定模型。不同版本的模型编码方式一致,但使用时须确保模型(model)与音色(voice)匹配:每个版本的模型只能使用本版本的默认音色或专属音色。
voice str - 指定语音合成所使用的音色。支持默认音色和专属音色:默认音色:参见音色列表章节。专属音色:通过声音复刻功能定制。使用复刻音色时,请确保声音复刻与语音合成使用同一账号。详细操作步骤请参见CosyVoice声音复刻API⚠️ 使用声音复刻系列模型合成语音时,仅能使用该模型复刻生成的专属音色,不能使用默认音色。****⚠️ 使用专属音色合成语音时,语音合成模型(**model**)必须与声音复刻模型(**target_model**)相同。
format enum 因音色而异 指定音频编码格式及采样率。若未指定format则合成音频采样率为22.05kHz格式为mp3。说明默认采样率代表当前音色的最佳采样率缺省条件下默认按照该采样率输出同时支持降采样或升采样。可指定的音频编码格式及采样率如下所有模型均支持的音频编码格式及采样率AudioFormat.WAV_8000HZ_MONO_16BIT代表音频格式为wav采样率为8kHzAudioFormat.WAV_16000HZ_MONO_16BIT代表音频格式为wav采样率为16kHzAudioFormat.WAV_22050HZ_MONO_16BIT代表音频格式为wav采样率为22.05kHzAudioFormat.WAV_24000HZ_MONO_16BIT代表音频格式为wav采样率为24kHzAudioFormat.WAV_44100HZ_MONO_16BIT代表音频格式为wav采样率为44.1kHzAudioFormat.WAV_48000HZ_MONO_16BIT代表音频格式为wav采样率为48kHzAudioFormat.MP3_8000HZ_MONO_128KBPS代表音频格式为mp3采样率为8kHzAudioFormat.MP3_16000HZ_MONO_128KBPS代表音频格式为mp3采样率为16kHzAudioFormat.MP3_22050HZ_MONO_256KBPS代表音频格式为mp3采样率为22.05kHzAudioFormat.MP3_24000HZ_MONO_256KBPS代表音频格式为mp3采样率为24kHzAudioFormat.MP3_44100HZ_MONO_256KBPS代表音频格式为mp3采样率为44.1kHzAudioFormat.MP3_48000HZ_MONO_256KBPS代表音频格式为mp3采样率为48kHzAudioFormat.PCM_8000HZ_MONO_16BIT代表音频格式为pcm采样率为8kHzAudioFormat.PCM_16000HZ_MONO_16BIT代表音频格式为pcm采样率为16kHzAudioFormat.PCM_22050HZ_MONO_16BIT代表音频格式为pcm采样率为22.05kHzAudioFormat.PCM_24000HZ_MONO_16BIT代表音频格式为pcm采样率为24kHzAudioFormat.PCM_44100HZ_MONO_16BIT代表音频格式为pcm采样率为44.1kHzAudioFormat.PCM_48000HZ_MONO_16BIT代表音频格式为pcm采样率为48kHz除cosyvoice-v1其他模型支持的音频编码格式及采样率音频格式为opus时支持通过bit_rate参数调整码率。仅对1.24.0及之后版本的DashScope适用。AudioFormat.OGG_OPUS_8KHZ_MONO_32KBPS代表音频格式为opus采样率为8kHz码率为32kbpsAudioFormat.OGG_OPUS_16KHZ_MONO_16KBPS代表音频格式为opus采样率为16kHz码率为16kbpsAudioFormat.OGG_OPUS_16KHZ_MONO_32KBPS代表音频格式为opus采样率为16kHz码率为32kbpsAudioFormat.OGG_OPUS_16KHZ_MONO_64KBPS代表音频格式为opus采样率为16kHz码率为64kbpsAudioFormat.OGG_OPUS_24KHZ_MONO_16KBPS代表音频格式为opus采样率为24kHz码率为16kbpsAudioFormat.OGG_OPUS_24KHZ_MONO_32KBPS代表音频格式为opus采样率为24kHz码率为32kbpsAudioFormat.OGG_OPUS_24KHZ_MONO_64KBPS代表音频格式为opus采样率为24kHz码率为64kbpsAudioFormat.OGG_OPUS_48KHZ_MONO_16KBPS代表音频格式为opus采样率为48kHz码率为16kbpsAudioFormat.OGG_OPUS_48KHZ_MONO_32KBPS代表音频格式为opus采样率为48kHz码率为32kbpsAudioFormat.OGG_OPUS_48KHZ_MONO_64KBPS代表音频格式为opus采样率为48kHz码率为64kbps
volume int 50 合成音频的音量取值范围0~100。重要该字段在不同版本的DashScope SDK中有所不同1.20.10及以后版本的SDKvolume1.20.10以前版本的SDKvolumn
speech_rate float 1.0 合成音频的语速取值范围0.5~2。0.5表示默认语速的0.5倍速。1表示默认语速。默认语速是指模型默认输出的合成语速语速会因音色不同而略有不同。约每秒钟4个字。2表示默认语速的2倍速。
pitch_rate float 1.0 合成音频的语调取值范围0.5~2。
bit_rate int 32 指定音频的码率取值范围6~510kbps。码率越大音质越好音频文件体积越大。仅在音频格式format为opus时可用。cosyvoice-v1模型不支持该参数。说明bit_rate需要通过additional_params参数进行设置: synthesizer = SpeechSynthesizer(model="cosyvoice-v2", voice="longxiaochun_v2", format=AudioFormat.OGG_OPUS_16KHZ_MONO_16KBPS, additional_params={"bit_rate": 32})
word_timestamp_enabled bool False 是否开启字级别时间戳默认关闭。仅cosyvoice-v2支持该功能。时间戳结果仅能通过回调接口获取说明word_timestamp_enabled需要通过additional_params参数进行设置: synthesizer = SpeechSynthesizer(model="cosyvoice-v2", voice="longxiaochun_v2", callback=callback, # 时间戳结果仅能通过回调接口获取 additional_params={'word_timestamp_enabled': True})点击查看完整示例代码
seed int 0 生成时使用的随机数种子使合成的效果产生变化。默认值0。取值范围0~65535。cosyvoice-v1不支持该功能。
language_hints list[str] - 合成文本语言提示,可选值为 zh(中文)或 en英文列表中仅第一个语言生效。仅cosyvoice-v3、cosyvoice-v3-plus支持该功能。此设置会影响阿拉伯数字等内容的读法。例如当合成“123”时若设置为zh,则读作“一百二十三”;而en则会读作“one hundred and twenty-three”。如果不设置系统会根据文本内容自动判断并应用相应的合成规则。
instruction String - 设置提示词。仅cosyvoice-v3、cosyvoice-v3-plus支持该功能。目前仅支持设置情感。格式你说话的情感是<情感值>。”(注意,结尾一定不要遗漏句号,使用时将“<情感值>”替换为具体的情感值,例如替换为neutral)。示例:“你说话的情感是neutral。”支持的情感值:neutralfearfulangrysadsurprisedhappydisgusted
callback ResultCallback - 回调接口ResultCallback.

关键接口

SpeechSynthesizer

SpeechSynthesizer通过“from dashscope.audio.tts_v2 import *”方式引入,提供语音合成的关键接口。

方法 参数 返回值 描述
def call(self, text: str, timeout_millis=None) text:待合成文本timeout_millis阻塞线程的超时时间单位为毫秒不设置或值为0时不生效 没有指定ResultCallback时返回二进制音频数据否则返回None 将整段文本(无论是纯文本还是包含SSML的文本)转换为语音。在创建SpeechSynthesizer实例时,存在以下两种情况:没有指定ResultCallbackcall方法会阻塞当前线程直到语音合成完成并返回二进制音频数据。使用方法请参见同步调用。指定了ResultCallbackcall方法会立刻返回None并通过回调接口ResultCallbackon_data方法返回语音合成的结果。使用方法请参见异步调用重要每次调用call方法前,需要重新初始化SpeechSynthesizer实例。
def streaming_call(self, text: str) text:待合成文本片段 流式发送待合成文本不支持包含SSML的文本。您可以多次调用该接口将待合成文本分多次发送给服务端。合成结果通过回调接口ResultCallbackon_data方法获取。使用方法请参见流式调用
def streaming_complete(self, complete_timeout_millis=600000) complete_timeout_millis:等待时间,单位为毫秒 结束流式语音合成。该方法阻塞当前线程N毫秒具体时长由complete_timeout_millis决定),直到任务结束。如果completeTimeoutMillis设置为0则无限期等待。默认情况下如果等待时间超过10分钟则停止等待。使用方法请参见流式调用重要流式调用时,请务必确保调用该方法,否则可能会出现合成语音缺失的问题。
def get_last_request_id(self) 上一个任务的request_id 获取上一个任务的request_id。
def get_first_package_delay(self) 首包延迟 获取首包延迟一般在500ms左右。首包延迟是开始发送文本和接收第一个音频包之间的时间单位为毫秒。在任务完成后使用。首次发送文本时需建立 WebSocket 连接,因此首包延迟会包含连接建立的耗时。
def get_response(self) 最后一次报文 获取最后一次报文为JSON格式的数据可以用于获取task-failed报错。

回调接口(ResultCallback

异步调用流式调用时,服务端会通过回调的方式,将关键流程信息和数据返回给客户端。您需要实现回调方法,处理服务端返回的信息或者数据。

通过“from dashscope.audio.tts_v2 import *”方式引入。

点击查看示例

方法 参数 返回值 描述
def on_open(self) -> None 当和服务端建立连接完成后,该方法立刻被回调。
def on_event( self, message: str) -> None message:服务端返回的信息 当服务有回复时会被回调。message为JSON字符串解析可获取Task IDtask_id参数)、本次请求中计费的有效字符数(characters参数)等信息。
def on_complete(self) -> None 当所有合成数据全部返回(语音合成完成)后被回调。
def on_error(self, message) -> None message:异常信息 发生异常时该方法被回调。
def on_data(self, data: bytes) -> None data:服务器返回的二进制音频数据 当服务器有合成音频返回时被回调。您可以将二进制音频数据合成为一个完整的音频文件后使用播放器播放,也可以通过支持流式播放的播放器实时播放。重要流式语音合成中对于mp3/opus等压缩格式音频分段传输需使用流式播放器不可逐帧播放避免解码失败。支持流式播放的播放器ffmpeg、pyaudio (Python)、AudioFormat (Java)、MediaSource (Javascript)等。将音频数据合成完整的音频文件时应以追加模式写入同一文件。流式语音合成的wav/mp3 格式音频仅首帧包含头信息,后续帧为纯音频数据。
def on_close(self) -> None 当服务已经关闭连接后被回调。

响应结果

服务器返回二进制音频数据:

错误码

如遇报错问题,请参见错误信息进行排查。

若问题仍未解决,请加入开发者群反馈遇到的问题并提供Request ID以便进一步排查问题。

音色列表

当前默认支持的音色如下表所示。若您需要更加个性化的音色,可通过声音复刻功能免费定制专属音色,详情请参见使用复刻的音色进行语音合成

进行语音合成时,model参数必须与所选音色对应,否则调用将失败。

待合成文本text应使用与所选音色语种一致的语言否则可能出现发音错误或不自然

cosyvoice-v3

cosyvoice-v2

cosyvoice-v1

音色 音频试听(右键保存音频) voice参数 适用场景 语言
龙婉 longwan 语音助手、导航播报、聊天数字人 中文普通话
龙橙 longcheng 语音助手、导航播报、聊天数字人 中文普通话
龙华 longhua 语音助手、导航播报、聊天数字人 中文普通话
龙小淳 longxiaochun 语音助手、导航播报、聊天数字人 中文普通话+英文
龙小夏 longxiaoxia 语音助手、聊天数字人 中文普通话
龙小诚 longxiaocheng 语音助手、导航播报、聊天数字人 中文普通话+英文
龙小白 longxiaobai 聊天数字人、有声书、语音助手 中文普通话
龙老铁 longlaotie 新闻播报、有声书、语音助手、直播带货、导航播报 中文东北口音
龙书 longshu 有声书、语音助手、导航播报、新闻播报、智能客服 中文普通话
龙硕 longshuo 语音助手、导航播报、新闻播报、客服催收 中文普通话
龙婧 longjing 语音助手、导航播报、新闻播报、客服催收 中文普通话
龙妙 longmiao 客服催收、导航播报、有声书、语音助手 中文普通话
龙悦 longyue 语音助手、诗词朗诵、有声书朗读、导航播报、新闻播报、客服催收 中文普通话
龙媛 longyuan 有声书、语音助手、聊天数字人 中文普通话
龙飞 longfei 会议播报、新闻播报、有声书 中文普通话
龙杰力豆 longjielidou 新闻播报、有声书、聊天助手 中文普通话+英文
龙彤 longtong 有声书、导航播报、聊天数字人 中文普通话
龙祥 longxiang 新闻播报、有声书、导航播报 中文普通话
Stella loongstella 语音助手、直播带货、导航播报、客服催收、有声书 中文普通话+英文
Bella loongbella 语音助手、客服催收、新闻播报、导航播报 中文普通话