STM32+CubeMX移植HAL库实现SYN6288语音合成模块模块

这里写目录标题

  • SYN6288语音模块简介
  • 引脚定义
  • 注意要点
  • CubeMX配置
  • HAL库移植
  • 运行结果

SYN6288语音模块简介

SYN6288中文语音合成芯片是北京宇音天下科技有限公司于2010年初推出的一款性/价比更高,效果
更自然的一款中高端语音合成芯片。SYN6288通过异步串口(UART)通讯方式,接收待合成的文本数据,
实现文本到语音(或TTS语音)的转换。

主控制器和SYN6288语音合成芯片之间通过UART接口连接,控制器可通过通讯接口向SYN6288语音合成芯
片发送控制命令和文本,SY6288语音合成芯片把接收到的文本合成为语音信号输出,输出的信号经功率放大
器进行放大后连接到喇叭进行播放。
具有以下特点:

  • 支持GB2312、GBK、BIG5和JNICODE内码格式的文本;
  • 清晰、自然、准确的中文语音合成效果;可合成任意的中文文本,支持英文字母的合成:
  • 具有智能的文本分析处理算法,可正确识别数值、号码、时间日期及常用的度量衡符号;
  • 具备很强的多音字处理和中文姓氏处理能力;
  • 支持多种文本控制标记,提升文本处理的正确率;
  • 每次合成的文本量最多可达200字节:
  • 支持多种控制命令,包括:合成、停止、暂停合成、继续合成、改变波特率等;
  • 支持休眠功能,在休眠状态下可降低功耗;支持多种方式查询芯片工作状态;
  • 支持串行数据通讯接口,支持三种通讯波特率:9600bps,19200bps、38400bps;
  • 支持16级音量调整;播放文本的前景音量和播放背景音乐的背景音量可分开控制;
  • 可通过发送控制标记调节词语语速,支持6级词语语速调整;
  • 芯片内固化有多首和弦音乐、提示音效和针对某些行业领域的常见语音提示音;
  • 内部集成19首声音提示音,23首和弦提示音,15首背景音乐;
  • 内置10-bit推挽式(push-pul1)、可独立供电的功放,进行数模DAC输出;
  • 最终产品提供SSOP贴片封装形式;体积业内最小;
  • 芯片各项指标均满足室外严酷环境下的应用;

在这里插入图片描述

引脚定义

在这里插入图片描述
SYN6288模块上引出的引脚具体接法如下:

  • VDD:接3.3V
  • RXD:接STM32单片机的TXD
  • TXD:接STM32单片机的RXD
  • GND:接地
  • BUSY:随便接一个GPIO口,设置为输入模式即可,芯片空闲时为低电平
  • BP0:接喇叭的正极
  • BN0:接喇叭的负极

注意要点

  • 通讯方式:SYN6288提供一组全双工的异步串行通讯(UART)接口,实现与微处理器或PC的数据传输。SYN6288
    利用TxD和RxD以及GND实现串口通信。其中GND作为地信号。SYN6288芯片支持UART接口通讯方式,
    通过UART接口接收上位机发送的命令和数据,允许发送数据的最大长度为206字节。默认通讯波特率为9600。
    在这里插入图片描述
  • 通讯帧定义及通信控制:SYN6288模块要求上位机数据以帧的形式发送,一个完整的通讯帧包括“帧头+数据区长度+数据区”,这里面最常用的就是语音合成播放命令和设置通讯波特率命令。具体如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 文本控制标记列表:SYN6288支持对合成的文本进行预处理,包括音量、语数、背景乐、以及一些特殊文本的读法等,具体如下:
    在这里插入图片描述
    在这里插入图片描述

在使用文本控制标记是需要注意:

  • 所有控制标识均为半角字符(英文字符)
  • 控制标识需要按照语音合成命令的格式发送,特殊控制标记作为文本进行合成,即合成命令是“帧头+数
    据区长度+合成命令字+文本编码格式+特殊控制标记文本”的格式。
  • 设置一次后,一直有效,知道下次复位失效。

CubeMX配置

  1. USART配置:这里我是用的串口2和SYN6288通讯,串口1用作调试,具体配置如下;
    在这里插入图片描述
    注意这里需要设置串口波特率为9600(因为SYN6288模块初始波特率为9600),否则需要在代码中设置另外设置波特率,且SYN6288模块不支持115200波特率。
  2. 定时器配置:使用定时器控制每隔一段时间触发一次语音合成,具体配置如下:

在这里插入图片描述
因为我使用的是stm32F411RCT6,主频为100MHz,这里经此配置后,每1s触发一次定时器中断:
3. 其他部分的配置:包括系统时钟,晶振、串口1、和Debug等这里不做介绍,不懂得可以去看看我之前的博客,由于篇幅限制,这里就不做展示了。

HAL库移植

  1. 在main函数中添加以下代码,开启定时器中断: HAL_TIM_Base_Start_IT(&htim10); //开启定时10中断
    在这里插入图片描述
  2. 在tim.c中添加定时器中断函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint16_t Tim10_Count = 0;
		if(htim->Instance == TIM10)
		{
			HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);

			Tim10_Count++;
			if(Tim10_Count >= 10)
			{
				Tim10_Count = 0;
			//定时器每10s触发一次,通过串口2控制syn6288合成语音部分
		//选择背景音乐2。(0:无背景音乐  1-15:背景音乐可选)
    //m[0~16]:0背景音乐为静音,16背景音乐音量最大
    //v[0~16]:0朗读音量为静音,16朗读音量最大
    //t[0~5]:0朗读语速最慢,5朗读语速最快
//    //其他不常用功能请参考数据手册
				SYN_FrameInfo(4,(unsigned char* )"[v0][m7][t5]你好,我是魔法小厨娘");	
				

			}
		}
}
  1. 添加syn6288.c和syn6288.h文件,文件内容如下:

syn6288.h

#ifndef __SYN6288_H
#define __SYN6288_H

#include "main.h"
#include "usart.h"


void SYN_FrameInfo(unsigned char Music, unsigned char *HZdata);
void YS_SYN_Set(unsigned char *Info_data);

#endif


syn6288.c

#include "syn6288.h"



//Music:选择背景音乐。0:无背景音乐,1~15:选择背景音乐

void SYN_FrameInfo(uint8_t Music, uint8_t *HZdata)
{
  /****************需要发送的文本**********************************/
  unsigned  char  Frame_Info[50];
  unsigned  char  HZ_Length;
  unsigned  char  ecc  = 0;  			//定义校验字节
  unsigned  int i = 0;
  HZ_Length = strlen((char*)HZdata); 			//需要发送文本的长度
 
  /*****************帧固定配置信息**************************************/
  Frame_Info[0] = 0xFD ; 			//构造帧头FD
  Frame_Info[1] = 0x00 ; 			//构造数据区长度的高字节
  Frame_Info[2] = HZ_Length + 3; 		//构造数据区长度的低字节
  Frame_Info[3] = 0x01 ; 			//构造命令字:合成播放命令
  Frame_Info[4] = 0x01 | Music << 4 ; //构造命令参数:背景音乐设定
 
  /*******************校验码计算***************************************/
  for(i = 0; i < 5; i++)   				//依次发送构造好的5个帧头字节
  {
    ecc = ecc ^ (Frame_Info[i]);		//对发送的字节进行异或校验
  }
 
  for(i = 0; i < HZ_Length; i++)   		//依次发送待合成的文本数据
  {
    ecc = ecc ^ (HZdata[i]); 				//对发送的字节进行异或校验
  }
  /*******************发送帧信息***************************************/
  memcpy(&Frame_Info[5], HZdata, HZ_Length);
  Frame_Info[5 + HZ_Length] = ecc;
  HAL_UART_Transmit(&huart2,Frame_Info,5 + HZ_Length + 1,10000);
}


/***********************************************************
* 名    称: YS_SYN_Set(unsigned char *Info_data)
* 功    能: 主函数	程序入口
* 入口参数: *Info_data:固定的配置信息变量
* 出口参数:
* 说    明:本函数用于配置,停止合成、暂停合成等设置 ,默认波特率9600bps。
* 调用方法:通过调用已经定义的相关数组进行配置。
**********************************************************/
void YS_SYN_Set(unsigned char *Info_data)
{
  unsigned char Com_Len;
  Com_Len = strlen((char*)Info_data);

  HAL_UART_Transmit(&huart2,Info_data,Com_Len,10000);
//  USART3_SendString(Info_data, Com_Len);
}
/*
以下数组可以定义在主函数中,通过YS_SYN_Set进行调用,实现对模块的控制
unsigned char SYN_StopCom[] = {0xFD, 0X00, 0X02, 0X02, 0XFD}; //停止合成
unsigned char SYN_SuspendCom[] = {0XFD, 0X00, 0X02, 0X03, 0XFC}; //暂停合成
unsigned char SYN_RecoverCom[] = {0XFD, 0X00, 0X02, 0X04, 0XFB}; //恢复合成
unsigned char SYN_ChackCom[] = {0XFD, 0X00, 0X02, 0X21, 0XDE}; //状态查询
unsigned char SYN_PowerDownCom[] = {0XFD, 0X00, 0X02, 0X88, 0X77}; //进入POWER DOWN 状态命令
unsigned char SYN_BoteRateCom[] = {0xFD, 0X00, 0x03, 0x31, 0X00, 0xCF}; //设置波特率9600
*/

运行结果

这里结果不太好展示,所以我只能简单的描述一下:语音模块会每10s播放一次,你好我是魔法小厨娘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/621153.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

picoCTF-Web Exploitation-Java Code Analysis!?!

Description BookShelf Pico, my premium online book-reading service.I believe that my website is super secure. I challenge you to prove me wrong by reading the ‘Flag’ book!Here are the credentials to get you started: Username: “user”Password: “user” S…

计算机发展史故事【11】

爆发超新星 IBM 号称巨人&#xff0c;竟在巨型机领域败在小小的控制数据公司CDC 手下。在小型机领域&#xff0c;“霸主”DEC 公司的“后院”也曾“起火”&#xff0c;绝非一直风平浪静。 本世纪60 年代末&#xff0c;DEC 公司因开发小型电脑迅速崛起&#xff0c;赢得“小型机…

五子棋对战(网页版)

目录 一、项目背景 用户模块 匹配模块 对战模块 二、核心技术 三、相关知识 WebSocket 原理 报文格式 代码 服务器代码 客户端代码 四、项目创建 4.1、实现用户模块 编写数据库代码 数据库设计 配置MyBatis 创建实体类 创建UserMapper 创建UserMapper接口 实现UserMapper.xml 前…

Android Studio Please select Android SDK

解决方案&#xff1a; 1、打开 SDK Manager 2、选择编辑&#xff08;Edit&#xff09; 3、 一直Next&#xff0c;直到完成&#xff0c;解决&#xff01;

科技查新中的工法查新点如何确立与提炼?案例讲解!

按《工程建设工法管理办法》( 建 质&#xff3b;2014&#xff3d;103 号) &#xff0c;工法&#xff0c;是指以工程为对象&#xff0c;以工艺为核心&#xff0c;运用系 统工程原理&#xff0c;把先进技术和科学管理结合起来&#xff0c;经过一定工程实践形成的综合配套的施工方…

redis安装与群集

项目需求&#xff1a; 1.安装redis 2.测试redis性能&#xff0c;100个并发连接&#xff0c;100000个请求测试 3.在当前数据库下创建键值对 a11,a22,a33,a44&#xff0c;a55 4.查看键值对 5.将a1改名为a11,将a2删除 5.将a3移动到1号数据库 6搭建redis集群(可选) 测试环境…

如何使用Docker安装并运行Nexus容器结合内网穿透实现远程管理本地仓库

前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊如何使用Docker安装并运行Nexus容器结合内网穿透实现远程管理本地仓库&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496…

vue3组件插槽

Index.vue: <script setup> import { ref, onMounted } from vue import Child from ./Child.vue import ./index.cssonMounted(() > {}) </script><template><div class"m-home-wrap"><Child>插槽</Child><div class&qu…

linux不小心将/etc/passwd用户文件清空或删除解决方法

大概思路&#xff1a;进入单用户模式将passwd-引子程序复制为删除的passwd用户文件&#xff0c;关闭selinux 此系统为&#xff1a;centos 7 1.在GRUB引导的时候按e进入编辑模式&#xff0c;linux16那一行的ro 修改为rw rd.break ‘ ’ 2.ctrlx执行 3.进入单用户模式后修改根…

Cocos 2048从创建到发布上线

一、制作2048小游戏过程 扫描体验2048小游戏 场景搭建&#xff0c;4X4棋盘和基础设置绘制背景板&#xff0c;包含预制体等信息考虑在棋盘中随机出现两个数字方块&#xff0c;数字为2&#xff0c;初始化操作滑动事件部分&#xff0c;让方块移动起来&#xff0c;每滑动一次就生成…

【机器学习与实现】K近邻算法

目录 一、KNN算法简介&#xff08;一&#xff09;KNN算法包括三个步骤&#xff08;二&#xff09;超参数K的影响 二、距离度量三、邻近点的搜索算法四、KNN算法的特点五、KNN常用的参数及其说明六、分类算法的性能度量&#xff08;一&#xff09;混淆矩阵及相关概念&#xff08…

从零创建一个vue2项目

标题从零创建一个vue2项目&#xff0c;项目中使用TensorFlow.js识别手写文字 npm切换到淘宝镜像 npm config set registry https://registry.npm.taobao.org安装vue/cli -g npm install -g vue/cli检查是否安装成功 vue -V创建项目 vue create 项目名安装TensorFlow npm …

韶音、南卡、倍思开放式耳机值得买吗?王牌机型对比测评

今年&#xff0c;开放式耳机市场迎来了众多新品&#xff0c;为消费者提供了丰富的选择。在这样的背景下&#xff0c;正确挑选一款既符合音质需求又兼具佩戴舒适的开放式耳机显得格外关键。作为长期使用开放式耳机的用户&#xff0c;我发现很多人在韶音、南卡、漫步者这三个品牌…

k8s v1.20二进制部署

目录 一、环境准备 二、操作系统初始化配置 2.1.关闭防火墙 ​编辑 2.2.关闭selinux 2.3.关闭swap 2.4.根据规划设置主机名 2.5在master添加hosts 2.6.调整内核参数 2.7.时间同步 三、部署 docker引擎 3.1.所有 node 节点部署docker引擎 四、部署 etcd 集群 4.1.…

【数据库】docker搭建mysql8一主两从节点,配置proxysql读写分离

docker搭建mysql8一主两从节点&#xff0c;配置proxysql读写分离 一、docker 搭建 mysql8 一主两从节点1.1 相关配置文件与docker启动1.2 半同步复制1.3 主从同步异常处理 二、mysql 中间件 ProxySql 配置读写分离2.1 在mysql服务里创建给proxySQL访问的用户2.2 安装ProxySql及…

Reactor Netty TCP 服务器端-响应式编程-011

🤗 ApiHug {Postman|Swagger|Api...} = 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Next Generation API Development Platform…

2024第八季完美童模 上海翎秀赛区 初赛 火热启动

第八季完美童模新篇启航&#xff0c;打响2024全明星联赛第三站的火热赛程&#xff01;本季全球赛亮点纷呈&#xff0c;带领全球选手体验暑期最高规格国民赛&#xff01;6季上榜CCTV新闻报道&#xff0c;稳坐行业赛事头把交椅&#xff1b;分赛区遍布全球各地&#xff0c;覆盖350…

【Linux】自动化构建工具make/Makefile和git介绍

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 Linux项目自动化构建工具-make/Makefile 举例 .PHONY 常见符号 依赖关系…

前端报错 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse

问题描述​ 控制台提示 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse 问题原因​ 原因&#xff1a;JSON 数据格式错误&#xff0c;是否符合 JSON 格式。 解决方法​ 应为json格式数据 什么是json格式数据 JSON&#xff08;JavaScript Object …

使用sqlmodel实现唯一性校验2,插入之前检查是否已存在

虽然之前添加唯一性校验的方法能够解决数据唯一的问题&#xff0c;但是如果忘了处理异常&#xff0c;则可能会导致程序崩溃。 在此基础上&#xff0c;我们可以在插入数据之前检查该数据是否已存在。 原来的代码&#xff1a; from sqlmodel import Field, Session, SQLModel,…