基于Arduino的SYN6288语音TTS模块汉字中文英文数字混合发音代码示例

本文档介绍如何使用Arduino NANO或UNO电路板,配合SYN6288模块,通过发送特定编码数组实现中文发音。重点在于解决“今天气温12摄氏度”这类连读句子的发音问题,通过修改代码和利用UTF8到UNICODE转换,成功实现了连贯的发音功能。提供了完整的ino文件下载链接,方便读者直接使用。

Arduino的NANO 电路板(UNO也可以使用),调用SYN6288,按固定格式给其发送编码数组,使其发音。

在网上找了好久,要么只支持英文,要么只支持汉字,一直没办法解决类似“今天气温12摄氏度”这种连读功能。

绕过去的方法是  “今天气温”+“12”+“摄氏度”。但这并不完美。

后来,在一遍PDF的帮助下,解决了这个问题,我修改了一些代码,增加了一些注释后,记录下来。


/*************声明软串口,避免占用硬串口导致的每次刷写插拔操作***********/
#include <SoftwareSerial.h>  
SoftwareSerial TTS_Serial(2,3);//用D2针做为RX,连接SYN6288的的TX口;用D3针做为TX,连接SYN6288的RX口;


void setup() 
{ /***********************初始化硬串口和软串口**************/
  Serial.begin(9600);
  TTS_Serial.begin(9600); //初始化软串口通信;

  spk("jzdriver宇音天下SYN6288模块123%");//输入 utf8 编码字符串
} 

void loop() 
{ 
/*
本示例参考了一个名为《SYN6288中文发声使用说明、》的PDF文档,在此感谢这位未知的作者
我在这基础上,进行了一些修改和注释
仅希望后人不要像我费心了好久才找到解决办法
jzdriver再次感谢所有热爱开源的人们
*/
  
}

void spk(unsigned char utf8str[])
{
/****************参数声明**********************************/ 
unsigned char TTS_body[100]; //输出 unicode 编码字符串jz
int utf8_to_unicode(unsigned char *pUTF8, unsigned char *pUNIC); //dr
unsigned int TTS_length; //定义正文长度iv
unsigned char TTS_head[5]; //定义数据帧头er
unsigned char TTS_xor = 0 ; //定义校验字节
unsigned int i = 0; //jzdriver

/***************构造命令头部***********************************/

 TTS_length = utf8_to_unicode(utf8str, TTS_body); //utf8 编码转换成 unicode 编码,并返回unicode 字符数j
 TTS_head[0] = 0xFD ; //构造帧头 FD z
 TTS_head[1] = TTS_length >> 8 ; //构造数据区长度的高字节 d
 TTS_head[2] = (TTS_length + 3) & 0xFF; //构造数据区长度的低字节
 TTS_head[3] = 0x01; //构造命令字:合成播放命令
 TTS_head[4] = 0x03 ; //构造命令参数:编码格式为 Unicode 

/***************构造并发送主体********************************/
 TTS_xor = 0; 
 for(i = 0; i < 5; i++) //j依次发送构造好的 5 个帧头字节
 { 
 TTS_xor = TTS_xor ^ (TTS_head[i]); //z对发送的字节进行异或校验
 //Serial.write(headOfFrame[i]); 
  TTS_Serial.write(TTS_head[i]);
 } 
 for(i = 0; i < TTS_length; i++) //d依次发送待合成的文本数据
 { 
 TTS_xor = TTS_xor ^ (TTS_body[i]); //r对发送的字节进行异或校验
 //Serial.write(unicstr[i]); 
  TTS_Serial.write(TTS_body[i]);
 //Serial.println(unicstr[i], HEX); 
 } 
 //Serial.write(ecc); //i最后发送校验字节
 TTS_Serial.write(TTS_xor);
 delay(6000); 
}

 这其中调用了utf8_to_unicode 函数,是UTF8转UNICODE的方法,在网上找一找即可。

如果嫌费事,可以到优快云下载。

https://download.youkuaiyun.com/download/jzdriver/18160461

下载链接中是完整的 ino 文件,接线后直接刷写即可。

调用方法只需一句

 spk("jzdriver宇音天下SYN6288模块123%");

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值