arduino实现tts

2023-05-16

//淘宝上查了一下,目前的几款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(使用前将#替换为@)

arduino实现tts 的相关文章

  • 使用 Arduino 将serial.read()转换为可用的字符串

    我正在使用两个 Arduino 来相互发送纯文本字符串新软系列 https docs arduino cc learn built in libraries software serial and an RF http en wikiped
  • Arduino 中的字符串比较

    我正在开发基于网络的家庭自动化系统 因此我的Arduino向服务器发送请求并在串行监视器中获得以下响应以及 loneOn 这是由于Serial println r 陈述 HTTP 1 1 200 OK Date Mon 13 Oct 201
  • 在 Android 上将 USB 波特率从 9600 更改为 115200

    我有一个 Arduino 它以 115200 波特率串行发送数据 有一个应用程序以 9600 波特率从 Arduino 接收数据 代码是 Arduino USB serial converter setup Set control line
  • Arduino:字符串到整数得到奇怪的值

    我想转换一个String to an int 我所能找到的就是你必须将 String 转换为 char 数组 然后将该数组转换为int 但我的代码产生奇怪的值 我无法弄清楚问题是什么 void ledDimm String command
  • Arduino Python3 脚本

    我正在尝试使用 Python3 脚本来控制 Arduino Mega 这是一个简单的脚本 用于从键盘获取一行并通过 Arduino 回显它 我从一个可用的 Python 2 脚本开始http petrimaki wordpress com
  • printf 的包装

    我在Arduino下编码 我想开发串行打印格式化功能 所以我尝试使用sprintf未知大小的缓冲区 基本上 我们可以避免谈论 Arduino 及其串行输出 并考虑将文本写入缓冲区 然后使用printf 我试过这个 include
  • Arduino I2S 正弦波

    我正在开发一个项目 我想通过组合不同的正弦波来生成 简单 声音 我使用的是 arduino mkrZero 因为它内置了 I2S 接口 并且似乎有足够的处理能力来满足我的需求 I have wired my system exactly l
  • ARDUINO 常数有什么用?以前是22,现在是100

    我正在使用热电偶并下载了 MAX6675 库 我想知道以下几行中 ARDUINO 常量的值是做什么用的 if ARDUINO gt 100 lcd write byte 0 else lcd print 0 BYTE endif lcd p
  • 如何将 char 数组定义为常量?

    这里是 C C 菜鸟 我已经在头文件中定义了它 typedef unsigned char BitChar 9 8 data bytes chars and one width byte char extern BitChar BitFon
  • PySerial 从 Arduino 读取线路的延迟

    我正在使用带有基本 DigitalReadSerial 设置的 arduino uno 如下所述 http arduino cc en Tutorial DigitalReadSerial http arduino cc en Tutori
  • Java RXTX 库不加载本机库

    基本上我想使用 Arduino 编写一个简单的通信工具java 的 RXTX 库 http rxtx qbang org wiki index php Main Page并且在加载动态库时严重失败 我的系统规格 操作系统 OS X 优胜美地
  • Arduino:连接字符串时崩溃和错误

    我尝试将 AES 256 加密的输出连接到一个字符串 将此字符串与从 Android 手机发送的加密字符串进行比较 基本上 连接似乎有效 但在几次运行后会出现错误 不可读的字符 字符串变得更短而不是更长 或崩溃 它是可重现的 重启后在同一点
  • AVRDUDE Android Arduino ioctl 错误

    我之前的问题 Android 无法使用 AVRDUDE 与 Arduino 通信 https stackoverflow com questions 15596376 android cannot talk to arduino using
  • Arduino 上的 Serial 和 Stream 有什么区别,Serial.write 是如何实现的?

    我很难理解串行和流这两个术语之间的区别 串行不是流的一种吗 我对作业有一些我不明白的问题 计算机通过使用 流或串行 读取 彼此发送的数据来确定每个字节的含义 Also Serial write 我也很困惑 它返回一个字节的数据 对吗 一个字
  • 将浮点数转换为字节数组的 C 函数

    我正在尝试创建一个函数来接受浮点变量并将其转换为字节数组 我找到了一段有效的代码片段 但如果可能的话 希望在函数中重用它 我也在使用 Arduino 环境 但我知道它接受大多数 C 语言 目前工作 float variable 1 11 b
  • 如何为 Arduino 或类似的微控制器编写 JavaScript 编译器? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我意识到这个问题会引起一些人的注意 并且我意识到 JavaScript 传统上是一种解释性语言 请让我解释一下 我是一名专门从事 We
  • 在 Arduino 上将整数/小数转换为十六进制?

    如何将整数或小数变量转换为十六进制字符串 我可以做相反的事情 将十六进制转换为整数 但我无法找出其他方法 这是为了Serial print 数组中的十六进制值 查看 Arduino 字符串教程here http arduino cc en
  • 使用 Ardulink 命令 Arduino Uno

    我试图在我的 JAVA 应用程序中使用 Ardulink 库来命令我的 Arduino Uno 但没有成功 我不知道我错过了什么 这是我的代码 Link link Link getDefaultInstance boolean connec
  • Arduino C++ 析构函数?

    我知道在Arduino中你不能使用delete 那么什么时候调用 C 类中定义的析构函数呢 同样 如果我想创建一个指向数组的指针 我必须使用malloc and free 当对象被销毁时 析构函数被调用 对于自动 堆栈上 变量 它在离开其作
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需

随机推荐

  • idea插件安装方式(七)

    插件安装两种方式 在线安装 通过 Preferences gt Plugins gt marketplace 在线安装 离线安装 通过 https plugins jetbrains com 离线安装 比如 Lombok xff0c 找对应
  • mysql-递归查询(二)

    文章目录 情景描述数据准备递归sql 情景描述 mysql 表查询 xff0c 经常有通过子不断查询父 xff0c 直至查询不到为止 数据准备 SET NAMES utf8 span class token punctuation span
  • zabbix重启命令

    1 zabbix server服务重启 service zabbix server restart 或者 service zabbix server restart 2 zabbix agentd客户端重启 service zabbix a
  • 使用MediaPlayer实现播放、暂停、继续和停止功能的简易音乐播放器

    1 布局文件 lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt LinearLayout xmlns android 61 34 http schemas android c
  • H3C交换机web管理配置

    1 下载一个超级终端到PC机上 由于工作环境不能联网的环境下 xff0c 下载了好几个超级终端才能用 2 超级终端连接有很多教程 但是有一个重要的事情 xff1a 在COM1属性的端口设置里面 xff0c 将 xff08 位 B xff09
  • 交换机MIB浏览器ifType、ifDescr、ifMtu、ifInOctets等的含义

    1 ifType 接口的类型 取值117表示接口为GigabitEthernet 取值62表示借口为FastEnthernet 2 ifDescr 接口类型的描述 有GigabitEthernet FastEthernet等 3 ifMtu
  • mac下PyCharm导入第三方包

    最近对python有兴趣 xff0c 在网上搜了 八天深入理解python 视频教程 xff0c 由于用的mac xff0c 不用安装python xff0c 感觉瞬间开发环境就已经具备了 xff0c 然后连个ipython都没装上 xff
  • Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-

    Failed to execute goal org mybatis generator mybatis generator maven plugin 1 3 2 generate default cli on project ssm Ex
  • windows系统下QT打包后到不同系统的各种报错问题分析

    最近碰到好多人问关于WINDOWS上的QT打包后在自己电脑上可以运行 xff0c 换台电脑报各种错误的问题 于是特地写个帖子总结下一些问题 xff1a 首先是打包QT xff0c 将QT的系统库拉出来 这里可以借用windeployqt工具
  • python使用requests提交post请求并上传文件(multipart/form-data)

    目录 一 背景 二 请求接口上传文件 2 1 分析接口 2 2 python进行请求 三 总结 一 背景 也是前几天 xff0c 有一个需求上传文件需要自动化 具体是上传到系统一个文件 xff0c 并收到返回结果 考虑使用python的re
  • Optitrack光学动作捕捉

    光学式动作捕捉依靠一整套精密而复杂的光学摄像头来实现 xff0c 它通过计算机视觉原理 xff0c 由多个高速摄像机从不同角度对目标特征点进行跟踪来完成全身的动作的捕捉 美国大片中的后期特效制作大都是用的这种光学式动捕技术打开百度APP x
  • 带参数的宏的问题

    include 34 iostream 34 using namespace std define COMPUTE XX a a a 43 a 2 int main int a 61 2 int test1 61 COMPUTE XX 43
  • Qt TCP/UDP通讯封装

    Qt TCP UDP通讯封装 TCP客户端 class TcpClient public QTcpSocket Q OBJECT public explicit TcpClient QObject parent 61 nullptr Tcp
  • http post请求

    1 引入所需要的jar包 lt dependency gt lt groupId gt org apache httpcomponents lt groupId gt lt artifactId gt httpclient lt artif
  • C语言截取从某位置开始指定长度子字符串方法

    C语言中没有从某位置开始指定长度子字符串的函数 xff08 还是我没找到 xff1f xff09 xff0c 只有从头开始截取的strncat和strncpy xff0c 以strncpy为例 xff1a char dest 4 61 34
  • PX4中自定义MAVLink消息(记录)

    简单记录一下这个过程 一 自定义uORB消息 这一步比较简单 xff0c 首先在msg 中新建ca trajectory msg文件 uint64 timestamp time since system start span class t
  • HP-SOCKET学习笔记(一)

    介绍 HP Socket是一套通用的高性能TCP UDP HTTP 通信框架 xff0c 包含服务端组件 客户端组件和Agent组件 xff0c 广泛适用于各种不同应用场景的TCP UDP HTTP通信系统 xff0c 提供C C 43 4
  • curl断点续载

    curl断点续传 xff0c 下载过程中关闭控制台 xff0c 然后重新启动 xff0c 又会接着下载 include 34 stdafx h 34 include lt io h gt include 34 curl curl h 34
  • curl多线程下载实现

    其实libcurl自带一个应用 xff0c 很高大上 xff0c 但是作为范例参考怎么使用libcurl觉得不大适合 xff01 还是写一些helloworl的程序的 xff0c 一目了然 include 34 stdafx h 34 in
  • arduino实现tts

    淘宝上查了一下 xff0c 目前的几款tts模块貌似指令格式类似 Blink Turns on an LED on for one second then off for one second repeatedly This example