TTS模块对接方式

作者: gavin 分类: 物联网 发布时间: 2024-10-13 16:35

所有的语音合成模块都需要把字符串转换为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);

}