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

2024-05-13 19:36

本文主要是介绍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 ; 			//构造帧头FDFrame_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播放一次,你好我是魔法小厨娘

这篇关于STM32+CubeMX移植HAL库实现SYN6288语音合成模块模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986631

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import