2015年07月14日 星期二 15:09
说到TTS语音合成技术,不得不提科大讯飞这家公司,在淘宝网上搜索“TTS语音合成”,结果中大部分都是科大讯飞的开发板。
这块开发板的集成度很高,自带功放,可以使用SPI、I2C、UART协议驱动,协议很简单,使用方便。
我是使用UART串口来做测试的,开发板默认的波特率是9600。
Arduino的程序文件的编码是UTF-8,但是TTS开发板只支持GBK、GB2312、BIG5、UNICODE四种编码,所以我们无法简单的在程序中嵌入中文字符串进行测试。
我采用的方法是加一个SD卡读卡器,将要合成语音的文本放到SD卡的文件中,Arduino读取文本文件后,发送到TTS开发板。
Arduino连接SD读卡器的接线请参考我之前的文章,Arduino连接TTS开发板使用的是软件模拟的串口,端口可以随意定义。
TTS开发板支持硬件方式检测工作状态,我将TTS的RDY引脚连接到了Arduino的3脚,这样就可以根据3脚的电平来判断TTS是否处于Busy的状态。
Arduino运行的代码比较长。我找了网易上的一篇新闻稿来测试,可以完整的阅读。
#include <SoftwareSerial.h>
SoftwareSerial xfs(6, 7); // RX, TX
#include <SPI.h>
#include <SD.h>
File myFile;
#define MAX_LEN 512
uint16_t n=MAX_LEN;
char buf[MAX_LEN];
bool xfs_is_idle(){
if(digitalRead(3) == LOW) {
return true;
}else{
return false;
}
}
void setup()
{
Serial.begin(9600);
pinMode(3,INPUT);
xfs.begin(9600);
while(true ) {
delay(1000);
if(xfs_is_idle()) break;
}
check_xfs_return();
Serial.print("Initializing SD card...");
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
myFile = SD.open("xfs.txt");
}
uint16_t read_line(){
uint16_t i=0;
char c;
memset(buf,0,sizeof(buf));
while (myFile.available()) {
if(i >= n-1){
return i;
}
c=myFile.read();
buf[i]=c;
i++;
Serial.print(c);
if(c == '\n'){
return i;
}
}
return i;
}
int check_xfs_return(){
if(xfs.available()) {
uint8_t ret=xfs.read();
if(ret == 0x4A){
Serial.println("XFS init success.");
return ret;
}
if(ret == 0x41) {
Serial.println("Received valid commmand.");
return ret;
}
if(ret == 0x45) {
Serial.println("Received invalid commmand.");
return ret;
}
if(ret == 0x4E) {
Serial.println("XFS is busy.");
return ret;
}
if(ret == 0x4F) {
Serial.println("XFS is idle.");
return ret;
}
Serial.println("I got an unknown return.");
Serial.println(ret,HEX);
return ret;
} else {
Serial.println("xfs is not available..");
return 0;
}
}
int send_string(){
uint8_t c;
c=0xFD;
xfs.write(c);
uint16_t len=strlen(buf)+2;
c = len >> 8;
xfs.write(c);
c = (len << 8) >> 8;
xfs.write(c);
c=0x01;
xfs.write(c);
c=0x01;
xfs.write(c);
xfs.write(buf,strlen(buf));
return 1;
}
void loop()
{
uint16_t text_len=read_line();
if(text_len == 0) {
myFile.close();
return;
}
if(text_len == 2) {
return;
}
send_string();
delay(1000);
while(check_xfs_return() == 0) {
delay(1000);
}
while(!xfs_is_idle()){
delay(1000);
Serial.println("xfs is busy.");
}
while(check_xfs_return() == 0) {
delay(1000);
}
}
我的主观感觉,TTS的合成效果还算不错,少数儿化音读不准。接下来,我准备配合ESP8266来做一个互联网新闻阅读器,以后不用听收音机了,呵呵。
更多资料:
Zeuux © 2025
京ICP备05028076号