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


    一、什么是SYN6288模块

    1、概述

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

    2、芯片引脚图

    image

    二、使用方法

    1、直接使用串口

    硬件连接方式如下:

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

    2、软件设置如下:

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

    image

    3、实物连接图

    image

    image

    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
      *
      * 

    © Copyright (c) 2024 STMicroelectronics. * All rights reserved.

    * * 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 %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  • 相关阅读:
    HarmonyOS—LocalStorage:页面级UI状态存储
    Apache网页优化
    论文阅读笔记 | 三维目标检测——VeloFCN算法
    多校联测11 模板题
    腾讯安全SOC+能力图谱正式发布,助力政企构建闭环安全运营体系
    Kafka系列之:kafka集群broker节点变化重新分配分区
    哈工大李治军老师操作系统笔记【13】:一个实际的schedule函数(Learning OS Concepts By Coding Them !)
    Axios传值的几种方式
    鼠标拖拽围绕某个物体旋转展示
    软件设计模式系列之七——原型模式
  • 原文地址:https://www.cnblogs.com/Johnson-Lan/p/18106982