在有声读物、在线教育等场景中,将包含复杂数学公式的文本转换为流畅、准确的语音是一大挑战。CosyVoice 语音合成服务支持解析文本中嵌入的公式,并将其以符合人类阅读习惯的方式朗读出来,显著提升了数学、物理等学科内容的听觉体验。
使用方法
将文本中的公式通过特定分隔符包裹,然后调用语音合成 API 即可。
使用分隔符标记公式
为了让引擎识别并解析公式,您需要使用以下任意一种分隔符将公式内容包裹起来:
使用不同分隔符不影响合成效果,选择其中任意一个即可。
$...$$$...$$\(...\)\[...\]
示例:
这是一道一元二次方程的求根公式:$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$,请仔细计算。调用 API 发起合成请求
在调用语音合成 API 时,将包含标记的文本作为输入。请注意,在 JSON 格式的请求体或编程语言的字符串中,反斜杠
\是一个转义字符,因此需要写成\\。调用示例(以Python为例):
# coding=utf-8 import dashscope from dashscope.audio.tts_v2 import * # 若没有将API Key配置到环境变量中,需将your-api-key替换为自己的API Key # dashscope.api_key = "your-api-key" # 模型 model = "cosyvoice-v2" # 音色 voice = "longxiaochun_v2" # 实例化SpeechSynthesizer,并在构造方法中传入模型(model)、音色(voice)等请求参数 synthesizer = SpeechSynthesizer(model=model, voice=voice) # 发送待合成文本,获取二进制音频 audio = synthesizer.call("这是一道一元二次方程的求根公式:$x = \\frac{-b \\pm \\sqrt{b^2-4ac}}{2a}$,请仔细计算。") # 首次发送文本时需建立 WebSocket 连接,因此首包延迟会包含连接建立的耗时 print('[Metric] requestId为:{},首包延迟为:{}毫秒'.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[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}$ | log十 |
\log | 对数 | \log{5} | $\log{5}$ | log五 |
\ln | 自然对数 | \lnX | $ln {10}$ | LN十 |
! | 阶乘 | 5! | $5!$ | 五的阶乘 |
() | 括号 | (2+1) | $(2+1)$ | 括号内二加一 |
\{ \} | $\{2+1\}$ | 大括号二加一反大括号 |
特殊数学符号
标签或符号 | 转换 | 公式内容示例 | 待合成文本示例 | 读法 |
\alpha | alpha | \alpha | $\alpha$ | α
|
\Alpha | \Alpha | $\Alpha$ | ||
\beta | beta | \beta | $\beta$ | β
|
\Beta | \Beta | $\Beta$ | ||
\gamma | gamma | \gamma | $\gamma$ | γ
|
\Gamma | \Gamma | $\Gamma$ | ||
\delta | delta | \delta | $\delta$ | Δ
|
\Delta | \Delta | $\Delta$ | ||
\infty | 无穷大(中) | \infty | $\infty$ | 无穷大
|
∞ | infty (英) | ∞ | $∞$ |
几何
标签或符号 | 作用 | 公式内容示例 | 公式输入示例 | 读法 |
\pi | 派 | \pi=3.14159 | $\pi =3.14159$ | 派等于三点一四一五九 |
\sin (sine | 三角函数 | \sin (sine30^\circ=1\frac2 | $\sin 30^\circ =\frac {1}{2}$ | sine三十度等于二分之一 |
\cos (cosine | $\cos 30^\circ =\frac {\sqrt {2}}{2}$ | cosine三十度等于二分之根号下二 | ||
\tan (tangent | $\tan 30^\circ =\frac {\sin 30^\circ}{\cos 30^\circ}$ | tangent三十度等于cosine三十度分之sine三十度 | ||
\csc (cosecant | $\csc A$ | cosecant A | ||
\sec (secant | $\sec A$ | secant A | ||
\cot (cotangent | $\cot A$ | cotangent A | ||
\angle | 角 | \angle AB | $\angle AB$ | 角A B |
∠ | ∠AB | $∠AB$ | ||
^\circ | 度 | ∠AB = 30^\circ | $∠AB = 30^\circ$ | 角A B 等于三十度 |
\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 | 三角形 | \triangleABC | $\triangle ABC$ | 三角形ABC |
△ | △ABC | $△ABC$ | ||
\parallelogram | 平行四边形 | \parallelogramABCD | $\parallelogram ABCD$ | 平行四边形ABCD |
\perp | 垂直 | AB \perp BC | $AB \perp BC$ | A B 垂直于 B C |
\bot | AB \bot BC | $AB \bot 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 | 所以 |
单位
单位需要使用 \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}$ | 五分米 |
m | 米 | 5\quantity{m} | $5\quantity{m}$ | 五米 |
km | 千米 | 5\quantity{km} | $5\quantity{km}$ | 五千米 |
g | 克 | 5\quantity{g} | $5\quantity{g}$ | 五克 |
kg | 千克 | 5\quantity{kg} | $5\quantity{kg}$ | 五千克 |
t | 吨 | 5\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}$ | 五毫升 |
s | 秒 | 5\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}$ | 五克每升 |
使用限制
语种限制:仅支持中文。
内容限制:
公式内容必须符合支持的标签与符号中的要求。
不支持 Markdown 格式的数学公式(如
```math ... ```)。分隔符内只应包含公式,否则可能导致语音合成结果不准确。
模型限制:仅支持
cosyvoice-v2模型。
常见问题
Q:为什么我输入的公式没有被朗读出来?
请按以下步骤排查:
检查分隔符:确认公式已使用
$...$,$$...$$,\(...\)或\[...\]正确包裹。检查转义字符:在通过 API 发送请求时,确认公式中的
\已被正确转义为\\。
Q:在代码中如何正确处理包含 \ 的字符串?
在大多数编程语言(如 Python, Java, JavaScript)的字符串字面量和 JSON 数据中,反斜杠 \ 是特殊转义字符。因此,您需要将其自身转义,即用 \\ 来表示一个 \。例如,\frac 在代码中应写作 \\frac。