语音合成模块

实物图

实物图

概述

语音合成模块是一款高集成度的语音合成模块,该模块方案基于新 一代神经网络算法,选取优质的女声发音人,满足通用应用场景的合成播报。方案以中文为主,但支 持数字、字母、单词、简单的中英文混读,在合成效果(可懂度、清晰度、自然度、表现力、节奏/ 停顿、语速、语调、音质、音色、理解费力程度)方面有显著的提升。 模块可以通过异步串口(UART)接收待合成的文本,直接合成为语音输出;主要是面向中高端应 用,为其提供一套完整的物美价廉的语音解决方案。支持纯中文、常规英文文本(如字母、单词、短句)以及中英文混合合成,可实现多音字、生僻字、数字、数值、日期、时间、字母正确流畅的合成,播放清晰无杂音,支持实时更新的特殊播报(如:字母、数字穿插播报、大写字母缩写;支持五种文本编码方式,当前方案支持 GB2312、GBK、BIG5、UTF16LE 和 UTF8 五种编码方式。每次合成的文本量最多可达 4K 字节(中文不超过 2000 个字);支持多种控制命令,控制命令包括:合成文本、停止合成、暂停合成、恢复合成、状态查询、进入省电模式、唤醒等控制命令。控制器通过通信接口发送控制命令可以对芯片进行相应的控制;可查询芯片的工作状态,通过读芯片自动返回的工作状态字、发送查询命令获得芯片工作状态的回传数据。

模块参数

引脚名称 描述
G GND
V 5V电源
RX(SDA) UART接收引脚/I2C SDA引脚
TX(SCL) UART发送引脚/I2C SCL引脚
  • 供电电压:5V
  • 连接方式:PH2.0 4PIN防反接线
  • 模块尺寸:40*32mm
  • 安装方式:M4螺钉兼容乐高插孔固定

机械尺寸图

机械尺寸图

功能特性

支持纯中文、常规英文文本(如字母、单词、短句)以及中英文混合合成

可实现多音字、生僻字、数字、数值、日期、时间、字母正确流畅的合成,播放清晰无杂音,支持实时更新的特殊播报(如:字母、数字穿插播报、大写字母缩写)。

支持五种文本编码方式

当前方案支持 GB2312、GBK、BIG5、UTF16LE 和 UTF8 五种编码方式。每次合成的文本量最多支持 4K 字节(经过相应的解码格式解码后),(中文不超过 2000 个字,具体跟编解码格式相关)。具体的每种解码格式字符占用空间参考表 1-1。

解码格式 英文字符 中文 英文标点 中文标点
GB2312 1 字节 2 字节 1 字节 2 字节
GBK 1 字节 2 字节 1 字节 2 字节
BIG5 1 字节 2 字节 1 字节 2 字节
UTF16LE 2 字节 2 字节 2 字节 2 字节
UTF8 1 字节 3 字节 1 字节 3 字节

表 1-1 不同解码方式字符占用空间

支持多种控制命令

控制命令包括:合成文本、停止合成、暂停合成、恢复合成、状态查询、进入省电模式、唤醒等控制命令。控制器通过通信接口发送控制命令可以对芯片进行相应的控制。

可查询芯片的工作状态

通过读芯片自动返回的工作状态字、发送查询命令可以获得芯片工作状态的回传数据。

通信方式

芯片和上位机之间都是通过下传命令和状态反馈依次交替的方式进行通信。下传命令是由上位机发起的。状态反馈是由芯片发起的;状态即通信状态,包含帧标记,帧数据长度错误,命令字错误,命令正确执行等。上位机向芯片下传命令后,必然会收到的状态反馈;上位机只有在收到 芯片 的状态反馈后,才能进行下一次的下传命令操作。

芯片在收到上位机的下传命令后,对命令的解析是非阻塞操作,可以较快的反馈状态给上位机。

对于UART 通信接口,上位机发送下传命令后,芯片 会给上位机反馈状态。上位机在收到反馈状态后,再进行下一次的命令下传。

注意:芯片 在上电后并系统初始化完成后,会向上位机反馈系统 Ready 的状态。因此对于 UART 通信接口,上位机必须先通过读操作来获取 Ready 状态后,才能进行第一次的命令下传。

通信协议

平台通信协议是指上位机和 芯片 之间的通信协议,即上位机如何控制模块,模块如何将信息反馈给上位机。通信协议分为下传协议和上传协议两部分。

命令帧封装格式

上位机通过下传命令帧来控制 芯片。下传命令帧的格式定义就是下传协议。上位机发

送给 芯片 的所有控制命令都需要用“帧”的方式进行封装后传输。帧结构由帧头标志、数据区长度和数据区三部分组成。

帧头 数据区长度 数据区
0xFD 0xXX,0xXX Data

命令帧定义

下传命令帧分为 2 部分:帧头,帧数据。其中帧头分为 2 部分:标记,帧长度。帧数据包含:命令字,命令参数(可选),命令数据。具体说明如下:

下传命令帧
帧头 帧数据
标记 帧数据长度 命令字 命令参数 命令数据
“0xFD” (1 字节) “0xHH,0xLL” (2 字节) “命令” (1 字节) “0xXX(可选)” (1 字节) 数据 (N 字节)

具体说明如下:

名称 长度 说明
标记 1 字节 由一个字节表示,固定为十六进制的“0xFD”
帧数据长度 2 字节 由两个字节表示,高字节在前,低字节在后
命令字 1 字节 由一个字节表示,表示具体的下传命令
命令参数 1 字节 由一个字节表示,此参数可选
命令数据 N 字节 表示具体的文本数据

系统命令

状态查询命令

名称 发送的数据 说明
命令字 0x21 查询当前系统工作运行状态。
模块在收到该命令后,将反馈运行状态。
运行状态分为 Idle 和 Busy 两种。
参数列表
命令帧格式结构 标记 帧数据长度 | 命令字
0xFD 0x00 |0x01 | 0x01

休眠命令

名称 发送的数据 说明
命令字 0x88 系统进入到休眠状态。
下位机收到此命令后,会停止 TTS,然后系统进入低功耗模式,装态为 idle,并返回 ok
参数列表 -
命令帧格式结构 标记 帧数据长度 | 命令字
0xFD 0x00 0x01 |0x01 | 0x88

语音合成功能支持的控制命令

下传命令包是指上位机发送给 芯片 所有下传命令帧,如下:

命令 命令字 命令 命令字 说
开始命令 0x01 启动 TTS 开始合成此命令帧的 TEXT,PAGE 为文本的编码方式
停止命令 0x02 停止 TTS 的合成
暂停命令 0x03 暂停 TTS 的合成
继续命令 0x04 从暂停的位置开始继续合成
查询命令 0x21 查询芯片的状态,返回状态只有 busy 和 idle 两种
cache 命令 0x31 把此命令帧的 TEXT 存储到 C4201-T00C 的第 INDEX 个缓存块开 始的缓存里面。INDEX 的范围为 0~15,每个缓存的大小是 256Byte,因此 TEXT 的最大长度 4096 个字节
cplay 命令 0x32 开始合成芯片缓存里面的文本,注意是从第 0 个缓存开始合 成,直到文本结束。REPEAT 为播放次数(1~15),PAGE 为文 本编码方式
睡眠命令 0x88 此命令会使芯片停止 TTS 合成,进入低功耗模式,此时状态为 idle,并返回 ok。低功耗模式下可以用查询命令来获取状态。任 何上位机命令都会使芯片退出低功耗模式(除了查询命令和睡 眠命令),但是不会执行命令。退出低功耗模式后,才能正常 的解析和执行命令
唤醒命令 0xFF 使芯片退出低功耗模式。接收到此命令后,芯片会退出低功耗 模式,并使 TTS 准备就绪,并返回 ok

文本标注方法

为了确保 TTS 合成效果,以下提供一套标注方式,用户可以通过标注的方式,达到想要的合成效果,修复机器合成在自然度、流畅度方面的不足。

文本控制标记的格式一般是半角中括号(即“[]”)内一个小写字母、一个阿拉伯数字。需要注意的是:文本标记符全部是半角,字母必须是小写的英文字母,不符合要求的不作为文本标记。

设置文本标记时,标记的位置很重要,除标记[n]、[r]、[o]、[y]外,其余在标记处会强制分句处理,因此在使用时,尽量将其放在句首位置。

加标记不会影响整个合成播报内容的变动。如:[w0]是取消词语间停顿的标记,合成过程中标记不会被合成。

文本控制标记列表

序号 类型 格式 参数 说明
1 设置标点符号读法 [b*] *=0/1 0–不读 1–朗读 设置标点符号是 否朗读的标记,默认为 0(不读)。
2 设置合成场景 [c*] *=0/1/2/3/4/5
0-默认场景
1-阅读(散文类)
2-小说
3-新闻
4-广告
5-交互
3 恢复默认的合成参数 [d] —— 不能恢复语种和发音人,其他参数都可以恢复
4 设置音效模式 [e*] *=0/1/2/3/4/5/6
0–关闭
1–忽远忽近
2–回声
3–机器人
4–合唱
5–水下
6–混响
默认为关闭
5 选择语种环境 [g*] *=0/1/2 0–自动判断
1–本语种环境
2–英语语种环境
默认语种为自动判断。
6 设置单词发音方式 [h*] *=0/1/2
0–自动判断单词发音方式
1–字母发音方式
2–单词发音方式
默认单词为自动判断
7 设置数字处理策略 [n*] *=0/1/2 0–自动判断 1–数字作号码处理 2–数字作数值处理 默认为自动判断
8 设置汉语号码中 “1”的读法 [y*] *=0/1
0–合成号码时 “1”读成“yāo”
9 静音一段时间 [p*] *=静音的时间长 度,无符号整数,如[p500]单位:毫秒(ms)
10 设置姓名读音策略 [r*] *=0/1
0–自动判断姓氏读音
1–强制使用姓氏读音规则
默认为自动判断 姓名读音,[r1]标记仅对紧跟其后的姓氏有效,如 “[r1]单”自动判断为“shàn”
11 设置音量 [v*] (*=0~10) * – 音量值默认音量为 5,10 对应到最高音量。
12 设置语速 [s*] *=0~10 默认语速值为 5,最大语速为 10
13 设置语调 [te*] *=0~100 默认语调值为 50,最大语调为 100
14 强制停顿边界 [w*] *=0/1/3
0–强制标记位置位 L0 边界,无停顿
1–强制标记位置位 L1(韵律词)边界,短停顿 3–强制标记位置位 L3(韵律短语)边界,长停顿
——
15 设置韵律标注处 理策略 [z*] *=0/1 0–不处理韵律标 注 1–处理韵律标注 默认不处理韵律 标注。韵律标注使 用“*”标出 L1 划 分位置,使用“#” 标出 L3 划分位 置。
16 为单个汉字/单词 强制指定拼音/音 标 [=*] *=拼音/音标 为前一个汉字/单 词设定的拼音/音 标 汉字:声调用后接 一位数字 1~5 分 别表示阴平、阳 平、上声、去声和 轻声 5 个声调。 6~9 分别对应阴 平、阳平、上声、 去声的轻 度,该标记只 能放在非汉语拼 音的汉语音节之 后指定拼音,连续 出现时以最后一 个为准。 示例: “着 [=zhuo2]手”,“着” 字将读作“zhuó”

更多详细介绍

查看软件开发手册

Arduino示例程序

下载示例程序

#include <Wire.h>

uint8_t buff[0xFF];

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
Wire.begin();
}

void Send_Heard_Cmd()
{
  Wire.write(0xFD);
  Wire.write(0x00);
}

void Start_Cmd(uint8_t *p_buff, uint8_t buff_size)
{
  Wire.beginTransmission(0x40);
  Send_Heard_Cmd();
  Wire.write(buff_size + 2);
  Wire.write(0x01);
  Wire.write(0x04);
  for(uint8_t i = 0; i < buff_size; i++){
    Wire.write(p_buff[i]);
  }
  Wire.endTransmission();
}

void Text_Cache_Cmd(uint8_t *p_buff, uint8_t buff_size)
{
  Send_Heard_Cmd();
  Wire.write(buff_size + 2);
  Wire.write(0x31);
  Wire.write(0x04);
  for(uint8_t i = 0; i < buff_size; i++){
    Wire.write(p_buff[i]);
  }
  Wire.endTransmission();
}

void Speech_Synthesis_Cmd()
{
  Wire.beginTransmission(0x40);
  Wire.write(0xFD);
  Wire.write(0x00);
  Wire.write(0x02);
  Wire.write(0x32);
  Wire.write(0x14);
  Wire.endTransmission();
}

void return_status()
{
  Wire.requestFrom(0x40, 1);    // request 6 bytes from slave device #8

  while (Wire.available()) { // slave may send less than requested
    uint8_t c = Wire.read(); // receive a byte as character
    Serial.println(c, HEX);         // print the character
  }  
}

void loop() {
  // put your main code here, to run repeatedly:

  Start_Cmd("小爱同学", strlen("小爱同学"));
  Serial.println("Start_Cmd");
  return_status();
//  delay(1000);
  Text_Cache_Cmd("小爱同学", strlen("小爱同学"));
  Serial.println("Text_Cache_Cmd");
  return_status();
//  delay(1000);
  Speech_Synthesis_Cmd();
  Serial.println("Speech_Synthesis_Cmd");
  return_status();
  delay(3000);
}