跳转到主要内容
语音合成

SSML 与 LaTeX

通过 SSML 控制语速、停顿、发音等语音特征,或将 LaTeX 公式转换为自然语音

通过 SSML(Speech Synthesis Markup Language)标记语言,可以精细控制语速、停顿、发音等语音特征;通过 LaTeX 公式朗读功能,可以将数学公式转换为自然语音。这两项功能均适用于 CosyVoice 模型。

概述

SSML(Speech Synthesis Markup Language)是一种基于 XML 的语音合成标记语言。在文本中嵌入 SSML 标签后,可以精细控制语速、语调、停顿和音量等语音特征,也可以添加背景音乐和音效,实现更丰富的语音表达效果。 CosyVoice 还支持解析文本中嵌入的 LaTeX 公式,并按照符合中文阅读习惯的方式将其朗读出来,适用于在线教育、有声读物等包含数学公式的场景。例如,输入文本"这是一道一元二次方程的求根公式:$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$"时,模型会将公式朗读为"x等于负b加减根号下b的平方减四ac,分之二a"。 典型应用场景包括:
  • 有声读物:灵活控制停顿和语速,搭配背景音乐增强沉浸感
  • 智能客服:通过 <say-as> 标签确保电话号码、日期等信息的准确朗读
  • 多语种播报:使用 <phoneme> 标签精确指定外文发音
  • 在线教育:通过 LaTeX 公式朗读功能将数学公式转为自然语音
两项功能均适用于 CosyVoice 模型系列。如需了解各模型的选型建议,请参见语音合成模型

SSML 标记语言

使用限制

  • 模型:cosyvoice-v3.5-flash、cosyvoice-v3.5-plus、cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2。
  • 音色:克隆音色,以及CosyVoice音色列表中标注为支持 SSML 的系统音色。
  • 接口
    • Java SDK(2.20.3 及以上版本):支持非流式调用和单向流式调用。
    • Python SDK(1.23.4 及以上版本):支持非流式调用和单向流式调用。
    • WebSocket API:需将参数 enable_ssml 设置为 true,且只允许发送一次 continue-task 事件。
    • HTTP API:需将参数 enable_ssml 设置为 true
cosyvoice-v3.5-pluscosyvoice-v3.5-flash 模型专用于声音复刻场景(不提供系统音色)。使用前,请先参见声音复刻创建目标音色。

快速开始

以下示例展示如何使用 SSML 控制语速进行语音合成。运行前,请完成以下准备工作:
  1. 获取 API Key
  2. 安装 DashScope SDK(Python 1.23.4 及以上版本,Java 2.20.3 及以上版本)。详情请参见安装 SDK
  • Java SDK
  • Python SDK
  • WebSocket API
  • cURL
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.utils.Constants;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
/**
 * SSML功能说明:
 *     1. 只有非流式调用和单向流式调用支持SSML功能
 *     2. 只有cosyvoice-v3-flash、cosyvoice-v3-plus和cosyvoice-v2模型的复刻音色以及音色列表中标记为支持SSML的系统音色支持SSML功能(例如cosyvoice-v3-flash模型的longanyang音色)
 */
public class Main {
    private static String model = "cosyvoice-v3-flash";
    private static String voice = "longanyang";
    public static void main(String[] args) {
        Constants.baseWebsocketApiUrl = "wss://dashscope.aliyuncs.com/api-ws/v1/inference";
        streamAudioDataToSpeaker();
        System.exit(0);
    }
    public static void streamAudioDataToSpeaker() {
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // 若没有配置环境变量,请用API Key将下行替换为:.apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model(model)
                        .voice(voice)
                        .build();
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
        ByteBuffer audio = null;
        try {
            // 非流式调用,阻塞直至音频返回
            // 特殊字符需要进行转义
            audio = synthesizer.call("<speak rate=\"2\">我的语速比正常人快。</speak>");
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // 任务结束关闭websocket连接
            synthesizer.getDuplexApi().close(1000, "bye");
        }
        if (audio != null) {
            // 将音频数据保存到本地文件"output.mp3"中
            File file = new File("output.mp3");
            try (FileOutputStream fos = new FileOutputStream(file)) {
                fos.write(audio.array());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        // 首次发送文本时需建立 WebSocket 连接,因此首包延迟会包含连接建立的耗时
        System.out.println(
                "[Metric] requestId为:"
                        + synthesizer.getLastRequestId()
                        + "首包延迟(毫秒)为:"
                        + synthesizer.getFirstPackageDelay());
    }
}

标签参考

CosyVoice SSML 基于 W3C SSML 1.0,仅支持部分标签。语法规则
  • 所有 SSML 内容必须包裹在 <speak></speak> 标签中。
  • 可以连续使用多个 <speak> 标签,但不能嵌套。
  • 需要转义 XML 特殊字符:"&quot;'&apos;&&amp;<&lt;>&gt;

<speak>:根标签

说明 所有 SSML 内容必须包裹在 <speak></speak> 标签中。 语法
<speak>需要使用 SSML 功能的文本</speak>
属性
属性类型必填说明
voiceString音色名称。覆盖 API 参数 voice。参见音色列表
rateString语速。覆盖 API 参数 speech_rate。推荐范围:0.5 ~ 2,默认值 1。大于 1 加速,小于 1 减速。
pitchString音调。覆盖 API 参数 pitch_rate。推荐范围:0.5 ~ 2,默认值 1。大于 1 升高,小于 1 降低。
volumeString音量。覆盖 API 参数 volume。取值范围:0 ~ 100,默认值 50。
effectString音效。可选值:robotlolita(活泼女声)、lowpassechoeq(均衡器,高级)、lpfilter(低通滤波器,高级)、hpfilter(高通滤波器,高级)。eqlpfilterhpfilter 需配合 effectValue 使用。每个标签只能设置一种音效。音效会增加延迟。
effectValueString自定义 effect 参数。eq:8 个以空格分隔的整数(-20 ~ 20),分别对应 ["40 Hz", "100 Hz", "200 Hz", "400 Hz", "800 Hz", "1600 Hz", "4000 Hz", "12000 Hz"] 频段的增益,示例:"1 1 1 1 1 1 1 1"lpfilter:整数频率,范围 (0, sample_rate/2],示例:"800"hpfilter:整数频率,范围 (0, sample_rate/2],示例:"1200"
bgmString背景音乐 URL。文件需存放在 OSS 上,权限至少为公共读。URL 中的 XML 特殊字符需转义。要求:16 kHz 采样率、单声道、WAV 格式、16-bit。如果合成音频长于背景音乐,音乐将循环播放。
backgroundMusicVolumeString背景音乐音量。
示例 音色:
<speak voice="longcheng_v2">
  我是男声。
</speak>
语速:
<speak rate="2">
  我的语速比正常人快。
</speak>
音调:
<speak pitch="0.5">
  但是我的音调比别人低。
</speak>
音量:
<speak volume="80">
  我的音量也很高。
</speak>
音效:
<speak effect="robot">
  你喜欢机器人瓦力吗?
</speak>
音效 + effectValue:
<speak effect="eq" effectValue="1 -20 1 1 1 1 20 1">
  你喜欢机器人瓦力吗?
</speak>

<speak effect="lpfilter" effectValue="1200">
  你喜欢机器人瓦力吗?
</speak>

<speak effect="hpfilter" effectValue="1200">
  你喜欢机器人瓦力吗?
</speak>
如果音频不是 WAV 格式,可使用 ffmpeg 转换:
ffmpeg -i input_audio -acodec pcm_s16le -ac 1 -ar 16000 output.wav
背景音乐(bgm):
<speak bgm="http://nls.alicdn.com/bgm/2.wav" backgroundMusicVolume="30" rate="-500" volume="40">
  <break time="2s"/>
  阴崖老木苍苍烟
  <break time="700ms"/>
  雨声犹在竹林间
  <break time="700ms"/>
  绵蕝固知裨国计
  <break time="700ms"/>
  绵州风物总堪怜
  <break time="2s"/>
</speak>
上传音频的版权由您自行承担法律责任。
组合属性(空格分隔):
<speak rate="200" pitch="-100" volume="80">
  所以放在一起,我的声音是这样的。
</speak>

<break>:停顿

说明 插入一段停顿。时长单位为秒(s)或毫秒(ms)。 语法
# 无属性
<break/>
# 带 time 属性
<break time="string"/>
break 标签行为
  • 不带属性时,<break/> 默认停顿 1 秒。
  • 注意:连续的 <break> 标签时长会累加,但总时长上限为 10 秒。
例如,以下三个标签总时长为 15 秒,但仅前 10 秒有效:
<speak>
  请闭上眼睛休息一下。<break time="5s"/><break time="5s"/><break time="5s"/>好了,请睁开眼睛。
</speak>
属性
属性类型必填说明
timeString停顿时长,如 "2s""50ms"。秒为单位:1 ~ 10。毫秒为单位:50 ~ 10000。
示例
<speak>
  请闭上眼睛休息一下。<break time="500ms"/>好了,请睁开眼睛。
</speak>

<sub>:替换文本

说明 将显示文本替换为其他发音。 语法
<sub alias="string"></sub>
属性
属性类型必填说明
aliasString替代朗读的文本。
示例
<speak>
   <sub alias="network protocol">W3C</sub>
 </speak>

<phoneme>:设置发音

说明 使用拼音(中文)或 CMU 音标(英文)指定发音。 语法
<phoneme alphabet="string" ph="string">text</phoneme>
属性
属性类型必填说明
alphabetString发音类型:"py"(拼音)或 "cmu"(音标)。参见 The CMU Pronouncing Dictionary
phString拼音或音标符号。每个汉字的拼音之间用空格分隔,音节数必须与字数一致。每个音节带声调号(1 ~ 5,其中 5 为轻声)。
示例
<speak>
<phoneme alphabet="py" ph="dian3 dang4 hang2">典当行</phoneme>把这个玩意<phoneme alphabet="py" ph="dang4 diao4">当掉</phoneme>
</speak>

<speak>
  How to spell <phoneme alphabet="cmu" ph="S AY N">sin</phoneme>?
</speak>

<soundEvent>:插入音效

说明 在合成语音中插入外部音频文件(提示音、环境音等)。 语法
<soundEvent src="URL"/>
属性
属性类型必填说明
srcString音频 URL。文件需存放在 OSS 上,权限至少为公共读。URL 中的 XML 特殊字符需转义。要求:16 kHz 采样率、单声道、WAV 格式、16-bit,最大 2 MB。
如果音频不是 WAV 格式,可使用 ffmpeg 转换:
ffmpeg -i input_audio -acodec pcm_s16le -ac 1 -ar 16000 output.wav
上传音频的版权由您自行承担法律责任。
示例
<speak>
  一匹马受了惊吓<soundEvent src="http://nls.alicdn.com/sound-event/horse-neigh.wav"/>人们四散躲避
</speak>

<say-as>:设置朗读格式

说明 指定文本的朗读方式(如数字、日期、电话号码等)。 语法
<say-as interpret-as="string">text</say-as>
属性
属性类型必填说明
interpret-asString文本类型。可选值:cardinal(数字)、digits(逐位数字)、telephone(电话号码)、name(姓名)、address(地址)、id(账号名/昵称)、characters(逐字符)、punctuation(标点)、date(日期)、time(时间)、currency(货币)、measure(度量单位)。
cardinal
cardinal 支持的格式:
格式示例英文读法说明
纯数字145one hundred forty five整数范围:最多 13 位,[-999999999999, 999999999999]。小数:整数部分最多 13 位,小数部分最多 10 位。
零开头的数字0145one hundred forty five
负号 + 数字-145minus hundred forty five
千分位逗号分隔的数字60,000sixty thousand
负号 + 千分位逗号分隔的数字-208,000minus two hundred eight thousand
数字 + 小数点 + 零12.00twelve
数字 + 小数点 + 数字12.34twelve point three four
千分位逗号分隔 + 小数点 + 数字1,000.1one thousand point one
负号 + 数字 + 小数点 + 数字-12.34minus twelve point three four
负号 + 千分位逗号分隔 + 小数点 + 数字-1,000.1minus one thousand point one
千分位数字 + 连字符 + 千分位数字1-1,000one to one thousand
其他默认读法012.34twelve point three four
1/2one half
-3/4minus three quarters
5.1/6five point one over six
-3 1/2minus three and a half
1,000.3^3one thousand point three to the power of three
3e9.1three times ten to the power of nine point one
23.10%twenty three point one percent
示例
<speak>
  <say-as interpret-as="cardinal">12345</say-as>
</speak>
<speak>
  <say-as interpret-as="cardinal">10234</say-as>
</speak>
digits
digits 支持的格式:
格式示例英文读法说明
纯数字12034one two zero three four无严格长度限制,建议不超过 20 个字符。
数字 + 空格或连字符 + 数字 + ...1-23-456 7890one, two three, four five six, seven eight nine zero
示例
<speak>
  <say-as interpret-as="digits">12345</say-as>
</speak>
<speak>
  <say-as interpret-as="digits">10234</say-as>
</speak>
telephone
telephone 支持的格式:
格式示例英文读法说明
纯数字12034one two oh three four无严格长度限制,建议不超过 20 个字符。
数字 + 空格或连字符 + 数字 + ...1-23-456 7890one, two three, four five six, seven eight nine oh
加号 + 数字 + 空格或连字符 + 数字+43-211-0567plus four three, two one one, oh five six seven
左括号 + 数字 + 右括号 + 空格 + 数字 + 空格或连字符 + 数字(21) 654-3210(two one) six five four, three two one oh
示例
<speak>
  <say-as interpret-as="telephone">12345</say-as>
</speak>
<speak>
  <say-as interpret-as="telephone">10234</say-as>
</speak>
name
示例
<speak>
  Her former name is <say-as interpret-as="name">Zeng Xiaofan</say-as>
</speak>
address
英文文本不支持该格式。
示例
<speak>
  <say-as interpret-as="address">Fulu International, Building 1, Unit 3, Room 304</say-as>
</speak>
id
英文文本的效果与 characters 相同。
示例
<speak>
  <say-as interpret-as="id">myid_1998</say-as>
</speak>
characters
characters 支持的格式:
格式示例英文读法说明
字符串*b+3$.c-0'=αasterisk B plus three dollar dot C dash zero apostrophe equals alpha支持中文汉字、英文字母、数字 0-9 及常用符号。
示例
<speak>
  <say-as interpret-as="characters">Greek letters αβ</say-as>
</speak>
<speak>
  <say-as interpret-as="characters">*b+3.c$=α</say-as>
</speak>
punctuation
英文文本的效果与 characters 相同。
示例
<speak>
  <say-as interpret-as="punctuation"> -./:;</say-as>
</speak>
date
date 支持的格式:
格式示例英文读法说明
四位数/两位数 或 四位数-两位数2000/01two thousand, oh one年份跨度。
1900-01nineteen hundred, oh one
2001-02twenty oh one, oh two
2019-20twenty nineteen, twenty
1998-99nineteen ninety eight, ninety nine
1999-00nineteen ninety nine, oh oh
以 1 或 2 开头的四位数2000two thousand四位数年份。
1900nineteen hundred
1905nineteen oh five
2021twenty twenty one
星期-星期 或 星期~星期 或 星期&星期mon-wedmonday to wednesday范围分隔符中的 XML 特殊字符需转义。
tue~frituesday to friday
sat&sunsaturday and sunday
DD-DD MMM, YYYY 或 DD~DD MMM, YYYY 或 DD&DD MMM, YYYY19-20 Jan, 2000the nineteen to the twentieth of january two thousandDD = 两位数日期。MMM = 月份缩写或全称。YYYY = 四位数年份。
01 ~ 10 Jul, 2020the first to the tenth of july twenty twenty
05&06 Apr, 2009the fifth and the sixth of april two thousand nine
MMM DD-DD 或 MMM DD~DD 或 MMM DD&DDFeb 01 - 03february the first to the thirdMMM = 月份。DD = 日期。
Aug 10-20august the tenth to the twentieth
Dec 11&12december the eleventh and the twelfth
MMM-MMM 或 MMM~MMM 或 MMM&MMMJan-Junjanuary to juneMMM = 月份。
Jul - Decjuly to december
sep&octseptember and october
YYYY-YYYY 或 YYYY~YYYY1990 - 2000nineteen ninety to two thousandYYYY = 以 1 或 2 开头的四位数年份。
2001-2021two thousand one to twenty twenty one
WWW DD MMM YYYYSun 20 Nov 2011sunday the twentieth of november twenty elevenWWW = 星期(缩写或全称)。DD = 日期。MMM = 月份。YYYY = 年份。
WWW DD MMMSun 20 Novsunday the twentieth of november
WWW MMM DD YYYYSun Nov 20 2011sunday november the twentieth twenty eleven
WWW MMM DDSun Nov 20sunday november the twentieth
WWW YYYY-MM-DDSat 2010-10-01saturday october the first twenty ten
WWW YYYY/MM/DDSat 2010/10/01saturday october the first twenty ten
WWW MM/DD/YYYYSun 11/20/2011sunday november the twentieth twenty eleven
MM/DD/YYYY11/20/2011november the twentieth twenty eleven
YYYY1998nineteen ninety eight
其他默认读法10 Mar, 2001the tenth of march two thousand one
10 Marthe tenth of march
Mar 2001march two thousand one
Fri. 10/Mar/2001friday the tenth of march two thousand one
Mar 10th, 2001march the tenth two thousand one
Mar 10march the tenth
2001/03/10march the tenth two thousand one
2001-03-10march the tenth two thousand one
2000stwo thousands
2010'stwenty tens
1900'snineteen hundreds
1990snineteen nineties
示例
<speak>
  <say-as interpret-as="date">1000-10-10</say-as>
</speak>
<speak>
  <say-as interpret-as="date">10-01-2020</say-as>
</speak>
time
time 支持的格式:
格式示例英文读法说明
HH:MM AM 或 PM09:00 AMnine A MHH = 小时(1-2 位)。MM = 分钟(2 位)。AM/PM = 上午或下午。
09:03 PMnine oh three P M
09:13 p.m.nine thirteen p m
HH:MM21:00twenty one hundred
HHMM100one oclock
时间点-时间点8:00 am - 05:30 pmeight a m to five p m时间范围格式。
7:05~10:15 AMseven oh five to ten fifteen A M
09:00-13:00nine oclock to thirteen hundred
示例
<speak>
  <say-as interpret-as="time">5:00am</say-as>
</speak>
<speak>
  <say-as interpret-as="time">0500</say-as>
</speak>
currency
currency 支持的格式:
格式示例英文读法说明
数字 + 货币标识符1.00 RMBone yuan支持整数、小数和千分位逗号分隔。
2.02 CNYtwo point zero two yuan
1,000.23 CN¥one thousand point two three yuan
1.01 SGDone singapore dollar and one cent
2.01 CADtwo canadian dollars and one cent
3.1 HKDthree hong kong dollars and ten cents
1,000.00 EURone thousand euros
货币标识符 + 数字US$ 1.00one US dollar支持整数、小数和千分位逗号分隔。
$0.01one cent
JPY 1.01one japanese yen and one sen
£1.1one pound and ten pence
€2.01two euros and one cent
USD 1,000one thousand united states dollars
数字 + 量词 + 货币标识符 或 货币标识符 + 数字 + 量词1.23 Tn RMBone point two three trillion yuan量词:thousand、million、billion、trillion、Mil、mil、K、k、Bn、bn、Tn、tn。
$1.2 Kone point two thousand dollars
示例
<speak>
  <say-as interpret-as="currency">13,000,000.00RMB</say-as>
</speak>
<speak>
  <say-as interpret-as="currency">$1,000.01</say-as>
</speak>
measure
measure 支持的格式:
格式示例英文读法说明
数字 + 度量单位1.0 kgone kilogram支持整数、小数和千分位逗号分隔。支持常用单位缩写。
1,234.01 kmone thousand two hundred thirty-four point zero one kilometers
纯度量单位mm2square millimeter
示例
<speak>
  <say-as interpret-as="measure">100m12cm6mm</say-as>
</speak>
<speak>
  <say-as interpret-as="measure">1,000.01kg</say-as>
</speak>
符号发音
<say-as> 常用符号发音:
符号英文读法
!exclamation mark
"double quote
#pound
$dollar
%percent
&and
'left quote
(left parenthesis
)right parenthesis
*asterisk
+plus
,comma
-dash
.dot
/slash
:colon
;semicolon
<less than
=equals
>greater than
?question mark
@at
[left bracket
\backslash
]right bracket
^caret
_underscore
`backtick
\{left brace
|vertical bar
\}right brace
~tilde
全角及特殊符号:
符号英文读法
exclamation mark
\u201cleft double quote
\u201dright double quote
\u2018left quote
\u2019right quote
left parenthesis
right parenthesis
comma
full stop
em dash
colon
semicolon
question mark
enumeration comma
ellipsis
……ellipsis
left guillemet
right guillemet
yuan
greater than or equal to
less than or equal to
not equal
approximately equal
±plus or minus
×times
πpi
希腊字母(大写):
符号英文读法
Αalpha
Βbeta
Γgamma
Δdelta
Εepsilon
Ζzeta
Θtheta
Ιiota
Κkappa
lambda
Μmu
Νnu
Ξksi
Οomicron
pi
Ρrho
sigma
Τtau
Υupsilon
Φphi
Χchi
Ψpsi
Ωomega
希腊字母(小写):
符号英文读法
αalpha
βbeta
γgamma
δdelta
εepsilon
ζzeta
ηeta
θtheta
ιiota
κkappa
λlambda
μmu
νnu
ξksi
οomicron
πpi
ρrho
σsigma
τtau
υupsilon
φphi
χchi
ψpsi
ωomega
常用度量单位
<say-as> 常用度量单位:
类别单位
长度nm(纳米)、μm(微米)、mm(毫米)、cm(厘米)、m(米)、km(千米)、ft(英尺)、in(英寸)
面积cm²(平方厘米)、m²(平方米)、km²(平方千米)、SqFt(平方英尺)
体积cm³(立方厘米)、m³(立方米)、km3(立方千米)、mL(毫升)、L(升)、gal(加仑)
重量μg(微克)、mg(毫克)、g(克)、kg(千克)
时间min(分钟)、sec(秒)、ms(毫秒)
电磁μA(微安)、mA(毫安)、Hz(赫兹)、kHz(千赫兹)、MHz(兆赫兹)、GHz(吉赫兹)、V(伏特)、kV(千伏)、kWh(千瓦时)
声音dB(分贝)
气压Pa(帕斯卡)、kPa(千帕)、MPa(兆帕)
其他还支持 tsp(茶匙)、rpm(转/分)、KB(千字节)、mmHg(毫米汞柱)等单位。

LaTeX 公式转语音

CosyVoice 可以将文本中的数学公式转换为自然语音,适用于有声书、在线教育等数理类音频内容场景。
该功能仅支持中文,其他语言可能无法正确朗读公式。

使用限制

  • 仅支持中文:不支持其他语言
  • 内容限制
    • 仅支持支持的标签和符号中列出的标签和符号
    • 不支持 Markdown 数学代码块(```math ... ```
    • 分隔符内只能包含公式,混入其他内容可能导致合成结果不准确
  • 兼容模型:cosyvoice-v3.5-flash、cosyvoice-v3.5-plus、cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2

使用方法

用指定的分隔符包裹文本中的公式,然后调用语音合成 API。
1

用分隔符标记公式

用以下任意分隔符包裹公式(效果相同):
  • $...$
  • $$...$$
  • \(...\)
  • \[...\]
示例:
这是一元二次方程的求根公式:$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$,请仔细计算。
2

调用 API 合成语音

调用语音合成 API,传入标记好公式的文本。在 JSON 或字符串中,反斜杠(\)是转义字符,需要写成 \\Python 调用示例:
# coding=utf-8

import os
import dashscope
from dashscope.audio.tts_v2 import *

# 如果未配置环境变量,请将下面一行替换为:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')

dashscope.base_websocket_api_url='wss://dashscope.aliyuncs.com/api-ws/v1/inference'

model = "cosyvoice-v3-flash"
voice = "longanyang"

synthesizer = SpeechSynthesizer(model=model, voice=voice)
audio = synthesizer.call("这是一元二次方程的求根公式:$x = \\frac{-b \\pm \\sqrt{b^2-4ac}}{2a}$,请仔细计算。")

print('[Metric] requestId: {}, first-package delay: {} ms'.format(
  synthesizer.get_last_request_id(),
  synthesizer.get_first_package_delay()))

with open('output.mp3', 'wb') as f:
  f.write(audio)

支持的标签和符号

以下是当前支持的标签和符号列表。

基础运算

标签或符号功能公式内容示例公式输入示例朗读效果
+加法2 + 3 = 5$2 + 3 = 5$二加三等于五
-减法3 - 2 = 1$3 - 2 = 1$三减二等于一
\pm正负号\pm 1 \pm 2$\pm 1\pm 2$正负一、正负二
\times乘法2 \times 3 = 6$2 \times 3 = 6$二乘三等于六
×乘法2 × 3 = 6$$2 × 3 = 6$$二乘三等于六
*乘法2 * 3 = 6\(2 * 3 = 6\)二乘三等于六
\div除法6\div2=3\[6\div2=3\]六除以二等于三
÷除法6÷2=3$6÷2=3$六除以二等于三
/除法6/2=3$6/2=3$六除以二等于三
=等于3+5=8$3+5=8$三加五等于八
<小于1< 2$1< 2$一小于二
小于等于3≤5$3≤5$三小于等于五
<=小于等于3<=5$3<=5$三小于等于五
\leq小于等于3\leq5$3\leq 5$三小于等于五
\le小于等于3\le5$3\le 5$三小于等于五
\leqq小于等于3\leqq5$3\leqq 5$三小于等于五
\leqslant小于等于3\leqslant5$3\leqslant 5$三小于等于五
>大于2>1$2>1$二大于一
大于等于5≥3$5≥3$五大于等于三
>=大于等于5>=3$5>=3$五大于等于三
\geq大于等于5\geq3$5\geq 3$五大于等于三
\ge大于等于5\ge3$5\ge 3$五大于等于三
\geqq大于等于5\geqq3$5\geqq 3$五大于等于三
\geqslant大于等于5\geqslant3$5\geqslant 3$五大于等于三
\frac分数2\frac3$\frac {2}{3}$三分之二
^2^1$2^{1}$二的一次方
\sqrt开方\sqrt{9} = 3$\sqrt {9} = 3$根号九等于三
\sqrt开方\sqrt[3]{8} = 2$\sqrt[3]{8} = 2$八的三次方根等于二
%百分号5\%$5\%$百分之五
|绝对值∣3∣=3$|3| =3$三的绝对值等于三
\vert绝对值3\vert=3$\vert 3\vert =3$三的绝对值等于三
\lg对数lg {10}$\lg {10}$lg 十
\log对数\log{5}$\log{5}$log 五
\ln自然对数\lnX$ln {10}$ln 十
!阶乘5!$5!$五的阶乘
()括号(2+1)$(2+1)$括号二加一
\{ \}花括号\{2+1\}$\{2+1\}$花括号二加一

特殊数学符号

标签或符号转换结果公式内容示例公式输入示例朗读效果
\alphaalpha\alpha$\alpha$阿尔法
\Alphaalpha\Alpha$\Alpha$阿尔法
\betabeta\beta$\beta$贝塔
\Betabeta\Beta$\Beta$贝塔
\gammagamma\gamma$\gamma$伽马
\Gammagamma\Gamma$\Gamma$伽马
\deltadelta\delta$\delta$德尔塔
\Deltadelta\Delta$\Delta$德尔塔
\infty无穷大\infty$\infty$无穷大
无穷大$∞$无穷大

几何

标签或符号功能公式内容示例公式输入示例朗读效果
\pi圆周率\pi=3.14159$\pi =3.14159$派等于 3.14159
\sin三角函数\sin 30^\circ=\frac{1}{2}$\sin 30^\circ =\frac {1}{2}$正弦三十度等于二分之一
\cos三角函数\cos 30^\circ=\frac{\sqrt{2}}{2}$\cos 30^\circ =\frac {\sqrt {2}}{2}$余弦三十度等于二分之根号二
\tan三角函数\tan 30^\circ=\frac{\sin 30^\circ}{\cos 30^\circ}$\tan 30^\circ =\frac {\sin 30^\circ}{\cos 30^\circ}$正切三十度等于正弦三十度除以余弦三十度
\csc三角函数\csc A$\csc A$余割 A
\sec三角函数\sec A$\sec A$正割 A
\cot三角函数\cot A$\cot A$余切 A
\angle\angle AB$\angle AB$角 AB
∠AB$∠AB$角 AB
^\circ∠AB = 30^\circ$∠AB = 30^\circ$角 AB 等于三十度
\odot\odot$\odot$
\overset\frown\overset\frown {BC}$\overset\frown {BC}$弧 BC
\rm{Rt}直角\because \rm{Rt}\triangle ABC$\because \rm{Rt}\triangle ABC$因为三角形 ABC 是直角三角形
\mathrm{Rt}直角\therefore AB \perp BC$\therefore AB \perp BC$所以 AB 垂直于 BC
\triangle三角形\triangle ABC$\triangle ABC$三角形 ABC
三角形△ABC$△ABC$三角形 ABC
\parallelogram平行四边形\parallelogram ABCD$\parallelogram ABCD$平行四边形 ABCD
\perp垂直AB \perp BC$AB \perp BC$AB 垂直于 BC
\bot垂直AB \bot BC$AB \bot BC$AB 垂直于 BC
垂直AB ⊥ BC$AB ⊥ BC$AB 垂直于 BC
\parallel平行A\parallel B$A\parallel B$A 平行于 B
\equalparallel平行且等于A\equalparallel B$A\equalparallel B$A 平行且等于 B
\cong全等△ABC\cong△DEF$△ABC\cong△DEF$三角形 ABC 全等于三角形 DEF

条件关系

标签或符号功能公式内容示例公式输入示例朗读效果
\implies推出\implies 1+1=2$\implies 1+1=2$可推出一加一等于二
\iff等价于p\iffq$p\iffq$p 等价于 q
\because因为\because a = b \therefore b=a$\because a = b \therefore b=a$因为 a 等于 b,所以 b 等于 a
\therefore所以\because a = b \therefore b=a$\because a = b \therefore b=a$因为 a 等于 b,所以 b 等于 a

单位

单位必须用 \unit\quantity\mathit\mathrm\rm 标签包裹(例如 \unit{cm})。
标签或符号朗读效果公式内容示例公式输入示例朗读示例
mm毫米5\quantity{mm}$5\quantity{mm}$五毫米
cm厘米5\quantity{cm}$5\quantity{cm}$五厘米
dm分米5\quantity{dm}$5\quantity{dm}$五分米
m5\quantity{m}$5\quantity{m}$五米
km千米5\quantity{km}$5\quantity{km}$五千米
g5\quantity{g}$5\quantity{g}$五克
kg千克5\quantity{kg}$5\quantity{kg}$五千克
t5\quantity{t}$5\quantity{t}$五吨
mm^2平方毫米5\quantity{mm^2}$5\quantity{mm^2}$五平方毫米
cm^2平方厘米5\quantity{cm^2}$5\quantity{cm^2}$五平方厘米
dm^2平方分米5\quantity{dm^2}$5\quantity{dm^2}$五平方分米
m^2平方米5\quantity{m^2}$5\quantity{m^2}$五平方米
km^2平方千米5\quantity{km^2}$5\quantity{km^2}$五平方千米
mm^3立方毫米5\quantity{mm^3}$5\quantity{mm^3}$五立方毫米
cm^3立方厘米5\quantity{cm^3}$5\quantity{cm^3}$五立方厘米
dm^3立方分米5\quantity{dm^3}$5\quantity{dm^3}$五立方分米
m^3立方米5\quantity{m^3}$5\quantity{m^3}$五立方米
km^3立方千米5\quantity{km^3}$5\quantity{km^3}$五立方千米
ml毫升5\quantity{ml}$5\quantity{ml}$五毫升
s5\quantity{s}$5\quantity{s}$五秒
min分钟5\quantity{min}$5\quantity{min}$五分钟
h小时5\quantity{h}$5\quantity{h}$五小时
km/h千米每小时5\quantity{km/h}$5\quantity{km/h}$五千米每小时
g/l克每升5\quantity{g/l}$5\quantity{g/l}$五克每升

常见问题

输入的公式没有被朗读?

  1. 分隔符:确认公式已用 $...$$$...$$\(...\)\[...\] 包裹
  2. 公式复杂度:确认公式仅使用了支持的标签和符号中的内容
  3. 转义字符:确认在 API 请求中,反斜杠(\)已转义为 \\

代码中如何处理反斜杠(\)?

反斜杠(\)在字符串和 JSON 中是转义字符,需要写成 \\。例如:在 Python、Java、JavaScript 等语言中,\frac 应写为 \\frac