TTS模块对接方式
所有的语音合成模块都需要把字符串转换为GBK编码,再通过tx引脚把符合格式的文本传过去,我是用esp8266来实现的,其他板子大差不差。在arduion 中可以导入UTF8ToGB2312.h库来实现转码,以下是转码方法
#include "UTF8ToGB2312.h" String utf8_str = message; String gb2312_str = GB.get(utf8_str);
一、LU6288 TTS语音合成模块
这个比较简单,只要转码后前面加<G>就可以使用
String message = GB.get("<G>共裕电商到账265元"); Serial.write(message.c_str(), message.length());
如果是用hex编码来发送消息,方法如下
const unsigned char message[] = {0xC4, 0xE3, 0xBA, 0xC3}; Serial.write(message, sizeof(message));
//完整示例代码 #include <ESP8266WiFi.h> #include <TimeLib.h> #include "UTF8ToGB2312.h" #include <HardwareSerial.h> const int ledPin = D0; // D4引脚 unsigned long previousMillis = 0; const long interval = 10000; // 10秒 void setup() { Serial.begin(9600); // 初始化串口 pinMode(ledPin, OUTPUT); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; String message = GB.get("<G>共裕电商到账265元"); Serial.write(message.c_str(), message.length()); // D4灯闪烁 digitalWrite(ledPin, HIGH); delay(500); // 灯亮100毫秒 digitalWrite(ledPin, LOW); } }
二、SYN6288语音合成模块
lu6288机械音太生硬,换成syn6288好太多了,但是syn6288的文本前缀比较复炸,而且要用11520波特率来操作才行,以下是完整的demo,这里我加入了一个led来观察是执行代码进度
#include "UTF8ToGB2312.h" const int ledPin = D0; // D4引脚 void setup() { Serial.begin(115200); pinMode(ledPin, OUTPUT); } void loop() { String data = "欢迎光临"; sendTTSMessage(data); digitalWrite(ledPin, HIGH); delay(500); // 灯亮100毫秒 digitalWrite(ledPin, LOW); delay(10000); } void sendTTSMessage(const String &message) { String utf8_str = message; String gb2312_str = GB.get(utf8_str); unsigned int len = gb2312_str.length(); unsigned char buffer[len + 6]; // 包括头字节和长度字节 // 填充缓冲区 buffer[0] = 0xFD; buffer[1] = (len + 2) >> 8; buffer[2] = (len + 2) & 0xFF; buffer[3] = 0x01; // cmd byte buffer[4] = 0x01; // para byte // 复制GB2312编码数据 for (unsigned int i = 0; i < len; i++) { buffer[i + 5] = gb2312_str[i]; } // 发送数据 Serial.write(buffer, len + 5); }