使用 CosyVoice 语音合成 LaTeX 公式

在有声读物、在线教育等场景中,将包含复杂数学公式的文本转换为流畅、准确的语音是一大挑战。CosyVoice 语音合成服务支持解析文本中嵌入的公式,并将其以符合人类阅读习惯的方式朗读出来,显著提升了数学、物理等学科内容的听觉体验。

使用方法

将文本中的公式通过特定分隔符包裹,然后调用语音合成 API 即可。

  1. 使用分隔符标记公式

    为了让引擎识别并解析公式,您需要使用以下任意一种分隔符将公式内容包裹起来:

    使用不同分隔符不影响合成效果,选择其中任意一个即可。

    • $...$

    • $$...$$

    • \(...\)

    • \[...\]

    示例:

    这是一道一元二次方程的求根公式:$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$,请仔细计算。
  2. 调用 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:为什么我输入的公式没有被朗读出来?

请按以下步骤排查:

  1. 检查分隔符:确认公式已使用 $...$$$...$$\(...\) 或 \[...\] 正确包裹。

  2. 检查公式复杂度:确认公式不包含当前不支持的标签与符号。请参考使用限制支持的标签与符号

  3. 检查转义字符:在通过 API 发送请求时,确认公式中的 \ 已被正确转义为 \\

Q:在代码中如何正确处理包含 \ 的字符串?

在大多数编程语言(如 Python, Java, JavaScript)的字符串字面量和 JSON 数据中,反斜杠 \ 是特殊转义字符。因此,您需要将其自身转义,即用 \\ 来表示一个 \。例如,\frac 在代码中应写作 \\frac