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