03-【HAL库】STM32实现SYN6288模块语音播报.md

一、什么是SYN6288模块

1、概述

​ SYN6288 中文语音合成芯片是北京宇音天下科技有限公司于2010 年初推出的一款性/价比更高,效果更自然的一款中高端语音合成芯片。SYN6288 通过异步串口(UART)通讯方式,接收待合成的文本数据,实现文本到语音(或TTS 语音)的转换。
​ 宇音天下于2002 年最早研制出国内首款语音合成芯片 OSYNO6188。公司最新推出的 SYN6288 语音合成芯片,继承了 OSYNO6188 语音芯片的优秀特点:最小 SSOP28L 贴片封装、硬件接口简单、低功耗、音色清亮圆润、极高的性/价比;除此之外,SYN6288 在识别文本/数字/字符串更智能、更准确,语音合成自然度更好、可懂度更高。

2、芯片引脚图

03-【HAL库】STM32实现SYN6288模块语音播报.md

二、使用方法

1、直接使用串口

硬件连接方式如下:

SYN6288引脚:  RX --> PA2  TX --> PA3  VCC --> 5V  GND --> GND 

2、软件设置如下:

请注意:本次实验,我是用的是串口2,并且波特率选择为9600

03-【HAL库】STM32实现SYN6288模块语音播报.md

3、实物连接图

03-【HAL库】STM32实现SYN6288模块语音播报.md

03-【HAL库】STM32实现SYN6288模块语音播报.md

2、关键函数

syn6288.c文件如下:

#include "syn6288.h" #include "usart.h" #include "string.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(u8 *Info_data) * 功    能: 主函数	程序入口 * 入口参数: *Info_data:固定的配置信息变量 * 出口参数: * 说    明:本函数用于配置,停止合成、暂停合成等设置 ,默认波特率9600bps。 * 调用方法:通过调用已经定义的相关数组进行配置。 **********************************************************/ void YS_SYN_Set(uint8_t *Info_data) {   uint8_t Com_Len;   Com_Len = strlen((char*)Info_data);   HAL_UART_Transmit(&huart2,Info_data,Com_Len,10000); }  

syn6288.h如下

#ifndef __SYN6288_H #define __SYN6288_H   #include "stm32f1xx_hal.h" void SYN_FrameInfo(uint8_t Music, uint8_t *HZdata); void YS_SYN_Set(uint8_t *Info_data);   #endif  

main.c如下:

请注意:在main.c中,有以下代码需要重点关注:

[vx]:前景文本播放音量,x音量值,取值:0~16(其中0为静音)  [mx]:背景音乐音量,x为音量值,取值:0~16(其中0为静音)  [tx]:词语语速,x为词语语速值,取值:0~5(5为最高语速) 
/* USER CODE BEGIN Header */ /**   ******************************************************************************   * @file           : main.c   * @brief          : Main program body   ******************************************************************************   * @attention   *   * <h2><center>&copy; Copyright (c) 2024 STMicroelectronics.   * All rights reserved.</center></h2>   *   * This software component is licensed by ST under BSD 3-Clause license,   * the "License"; You may not use this file except in compliance with the   * License. You may obtain a copy of the License at:   *                        opensource.org/licenses/BSD-3-Clause   *   ******************************************************************************   */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "usart.h" #include "gpio.h"  /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "syn6288.h" /* USER CODE END Includes */  /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */  /* USER CODE END PTD */  /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */  /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */  /* USER CODE END PM */  /* Private variables ---------------------------------------------------------*/  /* USER CODE BEGIN PV */  /* USER CODE END PV */  /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */  /* USER CODE END PFP */  /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ uint8_t SYN_StopCom[] = {0xFD, 0X00, 0X02, 0X02, 0XFD}; //停止合成 uint8_t SYN_SuspendCom[] = {0XFD, 0X00, 0X02, 0X03, 0XFC}; //暂停合成 uint8_t SYN_RecoverCom[] = {0XFD, 0X00, 0X02, 0X04, 0XFB}; //恢复合成 uint8_t SYN_ChackCom[] = {0XFD, 0X00, 0X02, 0X21, 0XDE}; //状态查询 uint8_t SYN_PowerDownCom[] = {0XFD, 0X00, 0X02, 0X88, 0X77}; //进入POWER DOWN状态命 /* USER CODE END 0 */  /**   * @brief  The application entry point.   * @retval int   */ int main(void) {   /* USER CODE BEGIN 1 */    /* USER CODE END 1 */    /* MCU Configuration--------------------------------------------------------*/    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */   HAL_Init();    /* USER CODE BEGIN Init */    /* USER CODE END Init */    /* Configure the system clock */   SystemClock_Config();    /* USER CODE BEGIN SysInit */    /* USER CODE END SysInit */    /* Initialize all configured peripherals */   MX_GPIO_Init();   MX_USART2_UART_Init();   /* USER CODE BEGIN 2 */    /* USER CODE END 2 */    /* Infinite loop */   /* USER CODE BEGIN WHILE */   while (1)    {     /* USER CODE END WHILE */      /* USER CODE BEGIN 3 */ 	  SYN_FrameInfo(2, "[v10][m0][t4]车牌已识别,请入库停车"); 	  HAL_Delay(1000); 		 		HAL_Delay(1000); 		HAL_Delay(1000); 		HAL_Delay(1000); 		HAL_Delay(1000);   }   /* USER CODE END 3 */ }  /**   * @brief System Clock Configuration   * @retval None   */ void SystemClock_Config(void) {   RCC_OscInitTypeDef RCC_OscInitStruct = {0};   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};    /** Initializes the RCC Oscillators according to the specified parameters   * in the RCC_OscInitTypeDef structure.   */   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;   RCC_OscInitStruct.HSEState = RCC_HSE_ON;   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;   RCC_OscInitStruct.HSIState = RCC_HSI_ON;   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)   {     Error_Handler();   }   /** Initializes the CPU, AHB and APB buses clocks   */   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)   {     Error_Handler();   } }  /* USER CODE BEGIN 4 */  /* USER CODE END 4 */  /**   * @brief  This function is executed in case of error occurrence.   * @retval None   */ void Error_Handler(void) {   /* USER CODE BEGIN Error_Handler_Debug */   /* User can add his own implementation to report the HAL error return state */    /* USER CODE END Error_Handler_Debug */ }  #ifdef  USE_FULL_ASSERT /**   * @brief  Reports the name of the source file and the source line number   *         where the assert_param error has occurred.   * @param  file: pointer to the source file name   * @param  line: assert_param error line source number   * @retval None   */ void assert_failed(uint8_t *file, uint32_t line) {   /* USER CODE BEGIN 6 */   /* User can add his own implementation to report the file name and line number,      tex: printf("Wrong parameters value: file %s on line %drn", file, line) */   /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */  /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/  

发表评论

评论已关闭。

相关文章