//淘宝上查了一下,目前的几款tts模块貌似指令格式类似
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
void OneUTF82Unicode(const char* utf_char, char* unicode_char)
{
//unicode: 0x192->110010010 ,utf8:0xC692->11000110|10010010
//小端序
int utf_length = strlen(utf_char);
//0x3F->00111111
switch(utf_length)
{
case 1:
unicode_char[0] = utf_char[0];
unicode_char[1] = 0;
break;
case 2:
unicode_char[0] = (utf_char[1] & 0x3F) | ((utf_char[0] & 0x3) << 6);
unicode_char[1] = (utf_char[0] & 0x3C) >> 2;
break;
case 3:
unicode_char[0] = (utf_char[2] & 0x3F) | ((utf_char[1] & 0x3) << 6);
unicode_char[1] = ((utf_char[1] & 0x3C) >> 2) | ((utf_char[0] & 0xF) << 4);
break;
default:
//assert(0);
//printf("utf_char length is bigger than 4 unsupported.\n");
break;
}
}
char* utf82unicode(const char* utf,size_t *unicode_number)
{
char* utf8 = strdup(utf);
size_t utf8_length = strlen(utf8);
//这里可以自己考虑实现更精确的大小.
//+2是留两个00.
char* unicode = (char*)malloc(utf8_length*2+2);
memset(unicode,0,utf8_length*2+2);
size_t index = 0;
size_t start = 0;
unsigned char temp;
//10000000=0x80 1110=0xE 110=0x6
unsigned char flag = 0;
size_t unicode_index = 0;
bool is_finded = false;
while((temp = utf8[index]))
{
start = index;
temp = temp >> 4 ;
if(temp > 0xE)
{
//assert(0);
//printf("utf8 bigger than 4 byte is not supported.\n");
break;
}
if(temp == 0xE)
{
index+=3;
is_finded = true;
}
temp = temp >> 1;
if(!is_finded && temp == 0x6)
{
index+=2;
is_finded = true;
}
temp = temp >> 2;
if(!is_finded && temp == 0x00)
{
index+=1;
is_finded = true;
}
if(index > utf8_length)
{
break;
}
flag = utf8[index];
utf8[index] = 0;
OneUTF82Unicode(utf8+start,unicode+unicode_index);
utf8[index] = flag;
unicode_index+=2;
is_finded = false;
}
free(utf8);
*unicode_number = unicode_index/2;
return unicode;
}
/**************芯片设置命令*********************/
uint8_t XFS_StopCom[]={0xFD,0X00,0X01,0X02};//停止合成
uint8_t XFS_SuspendCom[]={0XFD,0X00,0X01,0X03};//暂停合成
uint8_t XFS_RecoverCom[]={0XFD,0X00,0X01,0X04};//恢复合成
uint8_t XFS_ChackCom[]={0XFD,0X00,0X01,0X21};//状态查询
uint8_t XFS_PowerDownCom[]={0XFD,0X00,0X01,0X88};//进入POWER DOWN 状态命令
bool isFinished = true;
/***********************************************************
* 名 称: YS-XFS5051 文本合成函数
* 功 能: 发送合成文本到XFS5051芯片进行合成播放
* 入口参数: *HZdata:文本指针变量
* 出口参数:
* 说 明: 本函数只用于文本合成,具备背景音乐选择。默认波特率9600bps。
* 调用方法:例: SYN_FrameInfo(“飞音云电子”);
**********************************************************/
void XFS_FrameInfo(uint8_t *HZdata)
{
/****************需要发送的文本**********************************/
unsigned char Frame_Info[50]; //定义的文本长度
unsigned int HZ_Length;
unsigned int i=0;
HZ_Length =strlen((const char*)HZdata); //需要发送文本的长度
/*****************帧固定配置信息**************************************/
Frame_Info[0] = 0xFD ; //构造帧头FD
Frame_Info[1] = 0x00 ; //构造数据区长度的高字节
Frame_Info[2] = HZ_Length+2; //构造数据区长度的低字节
Frame_Info[3] = 0x01; //构造命令字:合成播放命令
Frame_Info[4] = 0x03; //文本编码格式:GBK
/*******************发送帧信息***************************************/
memcpy(&Frame_Info[5], HZdata, HZ_Length);
//PrintCom(Frame_Info,5+HZ_Length); //发送帧配置
//Serial1.print((char*)Frame_Info);
for(int i = 0; i < 5+HZ_Length; i ++)
{
Serial1.write(&Frame_Info[i], 1);
Serial.print(Frame_Info[i], HEX);
Serial.print(" ");
}
Serial.println();
}
/***********************************************************
* 名 称: void main(void)
* 功 能: 主函数 程序入口
* 入口参数: *Info_data:固定的配置信息变量
* 出口参数:
* 说 明:本函数用于配置,停止合成、暂停合成等设置 ,默认波特率9600bps。
* 调用方法:通过调用已经定义的相关数组进行配置。
**********************************************************/
void YS_XFS_Set(uint8_t *Info_data)
{
//uint8_t Com_Len;
//Com_Len =strlen(Info_data);
//PrintCom(Info_data,Com_Len);
Serial1.print((char*)Info_data);
Serial.print((char*)Info_data);
}
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
Serial1.begin(9600);
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
if( isFinished == true )
{
size_t unicode_number = 0;
char* unicode = utf82unicode("你好中文编码",&unicode_number);
XFS_FrameInfo((uint8_t*)unicode);
free(unicode);
isFinished = false;
}
// read from port 0, send to port 1:
if (Serial1.available()) {
uint8_t inByte = Serial1.read();
Serial.print(inByte, HEX);
if( inByte == 0x4F )
{
isFinished = true;
}
}
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)