使用STM32 CubeMX移植HAL库实现SYN6288语音合成模块
这里写目录标题
SYN6288语音模块简介
SYN6288中文语音合成芯片是北京宇音天下科技有限公司于2010年初推出的一款性/价比更高,效果
更自然的一款中高端语音合成芯片。SYN6288通过异步串口(UART)通讯方式,接收待合成的文本数据,
实现文本到语音(或TTS语音)的转换。
主控制器和SYN6288语音合成芯片之间通过UART接口连接,控制器可通过通讯接口向SYN6288语音合成芯
片发送控制命令和文本,SY6288语音合成芯片把接收到的文本合成为语音信号输出,输出的信号经功率放大
器进行放大后连接到喇叭进行播放。
具有以下特点:
引脚定义
SYN6288模块上引出的引脚具体接法如下:
注意要点
利用TxD和RxD以及GND实现串口通信。其中GND作为地信号。SYN6288芯片支持UART接口通讯方式,
通过UART接口接收上位机发送的命令和数据,允许发送数据的最大长度为206字节。默认通讯波特率为9600。






在使用文本控制标记是需要注意:
所有控制标识均为半角字符(英文字符) 控制标识需要按照语音合成命令的格式发送,特殊控制标记作为文本进行合成,即合成命令是“帧头+数
据区长度+合成命令字+文本编码格式+特殊控制标记文本”的格式。设置一次后,一直有效,知道下次复位失效。
CubeMX配置
- USART配置:这里我是用的串口2和SYN6288通讯,串口1用作调试,具体配置如下;
注意这里需要设置串口波特率为9600(因为SYN6288模块初始波特率为9600),否则需要在代码中设置另外设置波特率,且SYN6288模块不支持115200波特率。 - 定时器配置:使用定时器控制每隔一段时间触发一次语音合成,具体配置如下:
因为我使用的是stm32F411RCT6,主频为100MHz,这里经此配置后,每1s触发一次定时器中断:
3. 其他部分的配置:包括系统时钟,晶振、串口1、和Debug等这里不做介绍,不懂得可以去看看我之前的博客,由于篇幅限制,这里就不做展示了。
HAL库移植
- 在main函数中添加以下代码,开启定时器中断: HAL_TIM_Base_Start_IT(&htim10); //开启定时10中断
- 在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]你好,我是魔法小厨娘");
}
}
}
- 添加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播放一次,你好我是魔法小厨娘
作者:不想写代码的我