语音合成CosyVoice iOS SDK

本文档提供了语音合成CosyVoice iOS SDK的详细使用指南,帮助您将文本转换为高质量、富有表现力的语音。

用户指南:关于模型介绍和选型建议请参见语音合成-CosyVoice

模型与价格

在资源与预算允许的情况下,优先选择 cosyvoice-v3-plus 获取最佳合成效果,对成本敏感时可选 cosyvoice-v3 平衡质量与价格,其余版本仅建议在兼容或低要求场景使用。

模型名称

单价

免费额度

cosyvoice-v3-plus

2元/万字符

202511150点前开通阿里云百炼:2000字符

202511150点后开通阿里云百炼:1万字符

有效期:阿里云百炼开通后90天内

cosyvoice-v3-flash

1元/万字符

cosyvoice-v2

2元/万字符

cosyvoice-v1

文本字符计算规则:

  • 汉字(包括简/繁体汉字、日文汉字和韩文汉字)按2个字符计算,其他所有字符(如标点符号、字母、数字、日韩文假名/谚文等)均按 1个字符计算

  • 计算文本长度时,不包含SSML 标签内容

  • 示例:

    • "你好" → 2(你)+2(好)=4字符

    • "中A123" → 2(中)+1(A)+2(文)+1(1)+1(2)+1(3)=8字符

    • "中文。" → 2(中)+2(文)+1(。)=5字符

    • "中 文。" → 2(中)+1(空格)+2(文)+1(。)=6字符

    • "<speak>你好</speak>" → 2(你)+2(好)=4字符

限制与约束

文本长度限制

文本编码格式

需采用UTF-8编码。

快速开始

  1. 获取API Key:获取API Key

    说明

    当您需要为第三方应用或用户提供临时访问权限,或者希望严格控制敏感数据访问、删除等高风险操作时,建议使用临时API Key。临时API Key拥有固定的60秒有效期,过期后需重新获取。

  2. 下载SDK并运行示例代码:

    • 下载最新SDK整合包

    • 解压 ZIP 包,将其中的 nuisdk.framework 添加到工程。

    • 在 Build Phases → Link Binary With Libraries 中添加 nuisdk.framework。

    • 在 General → Frameworks, Libraries, and Embedded Content 中将 nuisdk.framework 设置为 Embed & Sign。

    • 用 Xcode 打开示例工程。示例代码位于DashCosyVoiceStreamInputTTSViewController,替换 API Key 后体验功能。

调用方式

调用方式

说明

一次性输入待合成文本

调用步骤:

  1. 初始化 SDK 和播放器组件。

  2. 按业务需求设置参数。

  3. 调用 playStreamInputTtsasyncPlayStreamInputTts发送文本并开始语音合成。

  4. 接收到 TTS_EVENT_SYNTHESIS_COMPLETE 回调,语音合成结束。

适用场景:

  • 短文本合成

  • 需要使用 SSML 标记语言

流式输入待合成文本

调用步骤:

  1. 初始化 SDK 和播放器组件。

  2. 按业务需求设置参数。

  3. 调用 startStreamInputTts 开始流式文本语音合成。

  4. 调用 sendStreamInputTts 持续发送文本。

  5. onStreamInputTtsDataCallback中,获取二进制音频数据。

  6. 调用 stopStreamInputTts 或 asyncStopStreamInputTts 结束发送,等待合成完成。

  7. 接收到 TTS_EVENT_SYNTHESIS_COMPLETE 回调,语音合成结束。

适用场景:

  • 实时对话、长文本“边说边合”

  • 此方式不支持 SSML 标记语言

cosyvoice-v1不支持该功能。

请求参数

连接与控制参数

通过在startStreamInputTtsplayStreamInputTtsasyncPlayStreamInputTts接口的ticket参数中传入一个JSON字符串来配置。

  • 参数示例:以下为 JSON 字符串示例,参数未完整列出。请按实际需求在编码时补充:

    {
        "url": "wss://dashscope.aliyuncs.com/api-ws/v1/inference",
        "apikey": "st-****",
        "device_id": "my_device_id"
    }
  • 参数说明

    参数

    类型

    是否必须

    说明

    url

    string

    服务地址,固定为 wss://dashscope.aliyuncs.com/api-ws/v1/inference

    apikey

    string

    API Key。建议使用时效性短、安全性更高的临时API Key,以降低长期有效Key泄露的风险。

    device_id

    string

    用于标识终端用户的唯一字符串,可设为应用内用户ID或客户端生成的设备唯一标识符。此ID主要用于日志追踪和问题排查。

    complete_waiting_ms

    int

    调用stopStreamInputTts接口后,等待合成完成事件(TTS_EVENT_SYNTHESIS_COMPLETE)的超时时间(毫秒)。

    默认值:10000。

    debug_path

    string

    日志文件的存储路径。

    此参数仅在调用startStreamInputTtsplayStreamInputTtsasyncPlayStreamInputTts接口时将saveLog设为YES时生效。此时必须设置日志文件路径,否则将报错。

    本地最多保留两个日志文件。

    max_log_file_size

    int

    设定日志文件的最大字节数。

    此参数仅在调用startStreamInputTtsplayStreamInputTtsasyncPlayStreamInputTts接口时将saveLog设为YES时生效。

    默认值:104857600(100 * 1024 * 1024 字节, 即 100MiB)。

    log_track_level

    int

    控制通过日志回调(onStreamInputTtsLogTrackCallback)对外发送的日志内容的过滤级别。

    默认值:2。

    取值范围:

    • 0:LOG_LEVEL_VERBOSE

    • 1:LOG_LEVEL_DEBUG

    • 2:LOG_LEVEL_INFO

    • 3:LOG_LEVEL_WARNING

    • 4:LOG_LEVEL_ERROR

    • 5:LOG_LEVEL_NONE(表示关闭此功能)

    注意:log_track_levellogLevel(通过startStreamInputTtsplayStreamInputTtsasyncPlayStreamInputTts接口设置)共同决定最终回调的日志。一条日志的级别数值必须同时大于或等于log_track_levellogLevel的值,才会被回调。例如,log_track_level设为2 (INFO),logLevel设为3 (WARNING),则只有WARNING及以上级别(数值>=3)的日志才会被回调。

语音合成效果参数

通过在startStreamInputTtsplayStreamInputTtsasyncPlayStreamInputTts接口的parameters参数中传入一个JSON字符串来配置。

  • 参数示例:以下为 JSON 字符串示例,参数未完整列出。请按实际需求在编码时补充:

    {
        "model": "cosyvoice-v2",
        "voice": "longxiaochun_v2",
        "format": "mp3",
        "sample_rate": 24000,
        "volume": 50,
        "rate": 1,
        "pitch": 1,
        "language_hints": ["zh"],
        "enable_ssml": false
    }
  • 参数说明

    参数

    类型

    是否必须

    说明

    model

    string

    语音合成模型

    voice

    string

    音色。

    • 默认音色:参见音色列表

    • 专属音色:通过声音复刻功能定制,须与调用本API所使用的阿里云账号为同一账号。

    说明

    使用声音复刻生成的专属音色时,本请求的model参数值,必须与创建该音色时所用的模型版本(即target_model参数)完全一致。

    format

    string

    音频编码格式。

    默认值:mp3。

    取值范围:pcm/wav/mp3/opus(当 model 为 cosyvoice-v1 时,不支持 opus 格式)

    volume

    int

    音量。

    默认值:50。

    取值范围:[0, 100]。50代表标准音量。音量大小与该值呈线性关系,0为静音,100为最大音量。

    sample_rate

    int

    采样率(单位Hz)。

    默认值:22050。

    取值范围:8000/16000/22050/24000/44100/48000。

    rate

    float

    语速。

    默认值:1.0。

    取值范围:[0.5, 2.0]。1.0为标准语速,小于1.0则减慢,大于1.0则加快。

    pitch

    float

    音高。该值作为音高调节的乘数,但其与听感上的音高变化并非严格的线性或对数关系,建议通过测试选择合适的值。

    默认值:1.0。

    取值范围:[0.5, 2.0]。1.0为音色自然音高。大于1.0则音高变高,小于1.0则音高变低。

    bit_rate

    int

    音频码率(单位kbps)。音频格式为opus时,支持通过bit_rate参数调整码率。

    默认值:32。

    取值范围:[6, 510]。

    enable_ssml

    boolean

    是否开启SSML功能。

    默认值:false。

    • true:开启。

    • false:关闭。

    word_timestamp_enabled

    boolean

    是否开启字级别时间戳。

    默认值:false。

    • true:开启。

    • false:关闭。

    cosyvoice-v2支持该功能。

    时间戳结果在onStreamInputTtsEventCallbackall_response中。

    seed

    int

    生成时使用的随机数种子,使合成的效果产生变化。在模型版本、文本、音色及其他参数均相同的前提下,使用相同的seed可复现相同的合成结果。

    默认值0。

    取值范围:[0, 65535]。

    cosyvoice-v1不支持该功能。

    language_hints

    array[string]

    提供语言提示,仅cosyvoice-v3-flash、cosyvoice-v3-plus支持该功能。

    在语音合成中有如下作用:

    1. 指定 TN(Text Normalization,文本规范化)处理所用的语言,影响数字、缩写、符号等的朗读方式(仅中文、英文生效)。

      取值范围:

      • zh:中文

      • en:英文

    2. 指定语音合成的目标语言(仅限复刻音色),帮助提升合成效果准确性,对英文、法语、德语、日语、韩语、俄语生效(无需填写中文)。须和声音复刻时使用的languageHints/language_hints一致。

      取值范围:

      • en:英文

      • fr:法语

      • de:德语

      • ja:日语

      • ko:韩语

      • ru:俄语

    若设置的语言提示与文本内容明显不符(如为中文文本设置en),将忽略此提示,并依据文本内容自动检测语言。

    注意:此参数为数组,但当前版本仅处理第一个元素,因此建议只传入一个值。

    instruction

    string

    设置提示词。仅cosyvoice-v3-flash、cosyvoice-v3-plus支持该功能。

    在语音合成中有如下作用:

    1. 指定小语种(仅限复刻音色)

      • 格式:“你会用<小语种>说出来。”(注意,结尾一定不要遗漏句号,使用时将“<小语种>”替换为具体的小语种,例如替换为德语)。

      • 示例:“你会用德语说出来。

      • 支持的小语种:法语、德语、日语、韩语、俄语。

    2. 指定方言(仅限复刻音色)

      • 格式:“请用<方言>表达。”(注意,结尾一定不要遗漏句号,使用时将“<方言>”替换为具体的方言,例如替换为广东话)。

      • 示例:“请用广东话表达。

      • 支持的方言:广东话、东北话、甘肃话、贵州话、河南话、湖北话、江西话、闽南话、宁夏话、山西话、陕西话、山东话、上海话、四川话、天津话、云南话。

    3. 指定情感、场景、角色或身份等:仅部分默认音色支持该功能,且因音色而异,详情请参见音色列表

关键接口

StreamInputTts

startStreamInputTts

启动流式语音合成任务,与服务端建立连接。

  • 方法签名

    - (int) startStreamInputTts:(const char *)ticket parameters:(const char *)parameters sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
  • 参数说明

    参数

    类型

    说明

    ticket

    char*

    JSON字符串,包含鉴权、连接和调试参数。参见连接与控制参数

    parameters

    char*

    JSON字符串,包含语音合成的具体效果参数。参见语音合成效果参数

    sessionId

    char*

    客户端指定的会话ID。若不传入,服务端将自动。

    logLevel

    NuiSdkLogLevel

    控制SDK自身日志的打印级别。

    saveLog

    BOOL

    是否保存本地日志。若为YES,须在连接与控制参数中通过debug_path指定路径,并可通过max_log_file_size设置文件大小。

  • 返回值说明

    返回错误码,参见错误码查询

sendStreamInputTts

发送待合成的文本,与 startStreamInputTts 搭配使用。

在调用 startStreamInputTts 后,使用此接口持续发送文本。

所有文本发送完毕后,需调用stopStreamInputTtsasyncStopStreamInputTts来结束发送。

  • 方法签名

    - (int) sendStreamInputTts:(const char *)text;
  • 参数说明

    参数

    类型

    说明

    text

    char*

    待合成文本。不支持SSML。如果传入的文本包含SSML标签,这些标签将被当作普通文本读出,不会被解析。

  • 返回值说明

    返回错误码,参见错误码查询

stopStreamInputTts

同步接口,通知服务端文本已全部发送,并阻塞等待所有音频数据合成并收到 TTS_EVENT_SYNTHESIS_COMPLETE。

阻塞等待的超时时间由参数 complete_waiting_ms 控制。

  • 方法签名

    - (int) stopStreamInputTts;
  • 返回值说明

    返回错误码,参见错误码查询

asyncStopStreamInputTts

异步接口,通知服务端文本已全部发送。调用后立即返回,合成在后台继续进行。

通过 TTS_EVENT_SYNTHESIS_COMPLETE 判断合成是否完成。

  • 方法签名

    - (int) asyncStopStreamInputTts;
  • 返回值说明

    返回错误码,参见错误码查询

cancelStreamInputTts

立即中断与服务端的连接并终止当前合成任务。调用后不会再收到任何音频数据回调。

  • 方法签名

    - (int) cancelStreamInputTts;
  • 返回值说明

    返回错误码,参见错误码查询

playStreamInputTts

异步执行的一次性合成接口。调用后立即返回,合成任务在后台进行,结果通过回调返回。无需再调用stop接口。

该接口默认启用SSML。如果在语音合成效果参数中显式设置enable_ssml,则以用户设置为准。

  • 方法签名

    - (int) playStreamInputTts:(const char *)ticket parameters:(const char *)parameters text:(const char *)text sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
  • 参数说明

    ticket、parameters等参数与startStreamInputTts接口中的定义相同。

    参数

    类型

    说明

    text

    char*

    待合成文本。支持SSML

  • 返回值说明

    返回错误码,参见错误码查询

asyncPlayStreamInputTts

此接口异步发送全部待合成文本。调用后立即返回,不等待合成数据。无需再调用stop接口。

该接口默认启用SSML。如果在语音合成效果参数中显式设置enable_ssml,则以用户设置为准。

  • 方法签名

    - (int) asyncPlayStreamInputTts:(const char *)ticket parameters:(const char *)parameters text:(const char *)text sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
  • 参数说明

    ticket、parameters等参数与startStreamInputTts接口中的定义相同。

    参数

    类型

    说明

    text

    char*

    待合成文本。支持SSML

  • 返回值说明

    返回错误码,参见错误码查询

StreamInputTtsDelegate:监听回调

onStreamInputTtsEventCallback:监听事件

  • 方法签名

    - (void)onStreamInputTtsEventCallback:(StreamInputTtsCallbackEvent)event taskId:(char*)taskid sessionId:(char*)sessionId ret_code:(int)ret_code error_msg:(char*)error_msg timestamp:(char*)timestamp all_response:(char*)all_response;
  • 参数说明

    参数

    类型

    说明

    event

    StreamInputTtsCallbackEvent

    回调事件。

    taskid

    char*

    语音合成任务ID。

    sessionId

    char*

    会话ID。客户端传入则原样返回;未传入时由服务端生成。

    ret_code

    int

    错误码,仅在事件 TTS_EVENT_TASK_FAILED 中有效。参见错误码查询

    error_msg

    char*

    错误信息,仅在事件 TTS_EVENT_TASK_FAILED 中有效。

    timestamp

    char*

    合成结果的时间戳信息。

    all_response

    char*

    完整的 JSON 字符串响应。可解析以获取所需数据。

onStreamInputTtsDataCallback:监听音频数据

合成过程中,SDK 会连续触发此回调,需在回调中获取音频数据。

  • 方法签名

    - (void)onStreamInputTtsDataCallback:(char*)buffer len:(int)len;
  • 参数说明

    参数

    类型

    说明

    buffer

    char*

    返回当前片段的音频数据,可用于:

    • 合成完整的音频文件并播放。

    • 通过支持流式播放的播放器实时播放。

    注意:

    • 对 mp3/opus 压缩格式,分段传输必须使用流式播放器,不能逐帧播放,否则可能解码失败。

    • 组装完整文件时需采用追加模式写入同一文件。

    • 对于 wav 和 mp3 格式,仅在第一次 onStreamInputTtsDataCallback 回调的数据中包含文件头,后续回调均为纯音频数据。处理时需将所有回调的 buffer 按顺序拼接。opus 格式的每一帧都是独立的 Ogg page,可直接拼接。

onStreamInputTtsLogTrackCallback:监听追踪日志

此回调用于接收 SDK 内部的详细日志,方便进行问题定位和调试。

- (void)onStreamInputTtsLogTrackCallback:(NuiSdkLogLevel)level
                              logMessage:(const char *)log;

StreamInputTtsCallbackEvent:事件类型

事件

说明

TTS_EVENT_SYNTHESIS_STARTED

表示服务端已成功接收请求并开始处理。通常在此事件后,onStreamInputTtsDataCallback 将很快开始返回第一批音频数据。

TTS_EVENT_SENTENCE_SYNTHESIS

语音合成运行过程中的信息,包括计费信息等。

TTS_EVENT_SYNTHESIS_COMPLETE

表示服务端已发送完全部音频数据,此后 onStreamInputTtsDataCallback 将不会再被调用。收到此事件是数据流结束的明确信号。

TTS_EVENT_TASK_FAILED

表示任务失败。此时可从onStreamInputTtsEventCallbackall_response获得task_id、error_code、error_message用于判断具体错误。

{
    "header": {
        "task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
        "event": "task-failed",
        "error_code": "InvalidParameter",
        "error_message": "[tts:]Engine return error code: 418",
        "attributes": {}
    },
    "payload": {}
}

高级功能

SSML 标记语言

目的:通过在文本中嵌入 XML 标签,实现对发音、语速、停顿等细节的精确控制。

使用限制

使用方法:调用 playStreamInputTts 或 asyncPlayStreamInputTts 接口时,SDK 会自动启用 SSML,此时直接在 text 参数中传入包含 SSML 标签的文本即可。

详细的标签用法参考 SSML标记语言介绍

数学表达式

目的:使模型能够正确朗读常见的数学公式和表达式。

使用限制:仅适用于 cosyvoice-v2 模型。

使用方法:直接在 text 参数中传入包含 LaTeX 格式的数学表达式的文本即可。详情参见 LaTeX 公式转语音