添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Arduino 语音交互 TTS语音合成(一)

Arduino 语音交互 TTS语音合成(一)

大家好,我是兔子。嵌入式工程师。

专业角度带你玩转Arduino.

这次教大家用Arduino来做语音交互。准备分几个部分写。

今天就先第一部分,控制TTS语音合成模块,来播放中文语音。

1.什么是TTS

TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。

简单说,就是通过编写代码,让机器能把文字转换成对应的声音播放出来。

有好多种方式可以实现,我们这次就简单点,通过TTS语音合成模块来实现。

2.TTS语音合成模块

我们使用的是TTS语音合成模块,是SYN6288。通过串口收发指令,将合成好的声音通过喇叭或者耳机播放出来。

先给模块来个正面:

SYN6288 TTS语音合成模块正面

模块背面:

SYN6288 TTS语音合成模块背面

3.接线

模块供电是2.1V~5.5V之间的宽电压,我们就给模块供3.3V即可。

由于是串口传输指令数据,正好Arduino UNO上有1个串口。

SYN6288 TXD -> Arduino 0(管脚不可调整为其他管脚,烧写程序时需要将线断开烧写)

SYN6288 RXD -> Arduino 1(管脚不可调整为其他管脚,烧写程序时需要将线断开烧写)

SYN6288 VCC -> Arduino 3.3V

SYN6288 GND -> Arduino GND

由于Arduino UNO烧写程序也是通过串口烧写,故烧写程序时,需要将模块的4根线取下烧写。否则会导致烧写程序失败。

1)耳机接线方式如下,接好上面四根线,然后将耳机接入耳机口。

TTS语音合成模块 耳机播放声音

2)喇叭接线方式,需要将喇叭的两根线,接到模块的BIN0和BP0上。由于喇叭不分正负极,两个管脚可以任意接。由于兔子买的喇叭质量不好,播放声音破音了。所以就用的耳机来展示效果。

TTS语音合成模块 喇叭播放声音

4.程序

程序是,通过串口,将指令及语音数据发送给TTS语言合成模块。再通过耳机将合成好的声音播放出来。

效果:让Arduino UNO通过语音合成模块,播放中文语音"欢迎光临,兔子先生"

/*
 程序 TTS语言合成模块SYN6288程序
 作者:兔子
 效果:让Arduino UNO通过语音合成模块,播放中文语音"欢迎光临,兔子先生"
 时间:19.05.19
 联系方式:18910297350 wechat:xw2816960
 CONNECTIONS:
 SYN6288 TXD -> Arduino 0(管脚不可调整为其他管脚,烧写程序时需要将线断开烧写)
 SYN6288 RXD -> Arduino 1(管脚不可调整为其他管脚,烧写程序时需要将线断开烧写)
 SYN6288 VCC -> Arduino 3.3V
 SYN6288 GND -> Arduino GND
 -----------------------------------------
char Chinese_GB2312[50] = {0xBB,0xB6,0xD3,0xAD,0xB9,0xE2,0xC1,0xD9,0xA3,0xAC,0xCD,
0xC3,0xD7,0xD3,0xCF,0xC8,0xC9,0xFA,0x00};//欢迎光临,兔子先生(中文编码)
void SYN_FrameInfo(uint8_t Music,uint8_t *HZdata);
void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);
 SYN_FrameInfo(0,Chinese_GB2312);
void loop() {
 // put your main code here, to run repeatedly:
/***********************************************************
* 名 称: YS-SYN6288 文本合成函数
* 功 能: 发送合成文本到SYN6288芯片进行合成播放
* 入口参数: Music(背景音乐选择):0无背景音乐。1-15:相关背景音乐
 *HZdata:文本指针变量 
* 出口参数:
* 说 明: 本函数只用于文本合成,具备背景音乐选择。默认波特率9600bps。 
* 调用方法:
**********************************************************/
void SYN_FrameInfo(uint8_t Music,uint8_t *HZdata)
/****************需要发送的文本**********************************/ 
 unsigned char Frame_Info[50];
 unsigned char HZ_Length; 
 unsigned char ecc = 0; //定义校验字节
 unsigned int i=0; 
 HZ_Length =strlen(HZdata); //需要发送文本的长度
/*****************帧固定配置信息**************************************/ 
 Frame_Info[0] = 0xFD ; //构造帧头FD
 Frame_Info[1] = 0x00 ; //构造数据区长度的高字节
 Frame_Info[2] = HZ_Length + 3; //构造数据区长度的低字节
 Frame_Info[3] = 0x01 ; //构造命令字:合成播放命令 
 Frame_Info[4] = 0x00 | Music<<4 ; //构造命令参数:背景音乐设定
/*******************校验码计算***************************************/ 
 for(i = 0; i<5; i++) //依次发送构造好的5个帧头字节
 ecc=ecc^(Frame_Info[i]); //对发送的字节进行异或校验 
 for(i= 0; i<HZ_Length; i++) //依次发送待合成的文本数据
 ecc=ecc^(HZdata[i]); //对发送的字节进行异或校验 
/*******************发送帧信息***************************************/ 
 memcpy(&Frame_Info[5], HZdata, HZ_Length);
 Frame_Info[5+HZ_Length]=ecc;
 for(i=0;i <5+HZ_Length+1;i++)