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);
}


