arduino实现tts
来源:互联网 发布:制作婚礼视频软件 编辑:程序博客网 时间:2024/05/22 05:26
//淘宝上查了一下,目前的几款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 }
1 0
- arduino实现tts
- 实现百度tts播音
- SAPI实现TTS
- TTS实现文字语音朗读
- TTS语音合成的实现
- TTS
- tts
- TTS
- TTS
- TTS
- 基于Arduino实现Arduino控制的电灯
- Arduino蓝牙通信实现
- Arduino按键软硬件实现
- VC用TTS实现文字语音朗读
- VC用TTS实现文字语音朗读
- Android TTS实现简单阅读器(一)
- delphi7用speech sdk5.1实现tts
- 使用TTS实现Oracle跨版本迁移
- Yii中的PHPExcel解决办法
- hihocoder:无间道之并查集
- 近期学习计划
- zoj 1205 Martian Addition
- 用cocos2d-x 3.2 实现的FlappyBird
- arduino实现tts
- 苹果开发之路——简述
- 简单整数算术运算
- 类和对象第一讲
- 四大发送到发送到
- 消息队列的介绍和原理
- How to improve Java's I/O performance( 提升 java i/o 性能)
- 鬼地方鬼地方刚
- 宿主在Windows Service中的WCF(创建,安装,调用) (host到exe,非IIS)