[其他ST产品] 基于STM32 + SYN6288语音播报

[复制链接]
 楼主| 欢乐家园 发表于 2023-1-31 00:10 | 显示全部楼层 |阅读模式
一、接线示例: 474363d7ebe1f3be0.png

二、模块重点: 1:5V供电 ,功耗约120mA (带图中小喇叭);
2:最少接3根线:5V,  GND,  RXD,TXD-可不接,BY-可不接
3:两种音源输出接口,排针、标准3.5mm接口,接小喇叭和普通音箱都无压力。
4:每次最多可转换200字节文本;


 楼主| 欢乐家园 发表于 2023-1-31 00:12 | 显示全部楼层
三、代码重点:

1:串口配置波特率9600,输出文本到模块,模块自动输出语音;

2:输出的文本中,可插入控制参数,以实现更自然的朗读。

3:.....想不出有啥要注意了;厂家的封装和设计,令使用相当的简单。
 楼主| 欢乐家园 发表于 2023-1-31 00:12 | 显示全部楼层
四、实现代码
1:main.c文件
  1. #include <stm32f10x.h>            
  2. #include "bsp_led.h"              // LED指示灯
  3. #include "bsp_usart.h"            // USART1、2、3,UART4、5
  4. #include "bsp_syn6288.h"          // SYN6288_文本转语音模块


  5. float money = 18.5;                                   // 示例金额,仅用作测试


  6. static void delay_ms(uint32_t ms)                     // 定义一个ms延时函数
  7. {
  8.     ms = ms * 11993;                                 
  9.     for (uint32_t i = 0; i < ms; i++);               
  10. }



  11. // 主函数
  12. int main(void)printf
  13. {
  14.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 中断分组

  15.     USART1_Init(115200);                              // 串口1初始化; 用于printf

  16.     Led_Init();                                       // LED 初始化
  17.     LED_RED_ON;                                       // 点亮红灯

  18.     Key_Init();                                       // 按键 初始化

  19.     SYN6288_Init(USART2);                             // 初始化; USART2-PA2
  20.     SYN6288_Say("你的结算金额为: %3.1f元", money);     // 示例4:配合格式代输出带数值的语音

  21.     while (1)                                         // while函数死循环
  22.     {
  23.         delay_ms(500);                                // 间隔延时
  24.         LED_RED_TOGGLE ;                              // 规律闪烁LED,观察系统是否正常运行
  25.     }
  26. }
 楼主| 欢乐家园 发表于 2023-1-31 00:13 | 显示全部楼层
2:bsp_syn6288.h文件
  1. #ifndef __SYN6288_H
  2. #define __SYN6288_H
  3. /***********************************************************************************************************************************
  4. ** 【代码编写】  魔女开发板团队
  5. ** 【代码更新】  Q群文件夹      
  6. ** 【淘    宝】  魔女开发板      https://demoboard.taobao.com
  7. ***********************************************************************************************************************************
  8. ** 【文件名称】  bsp_sys6288.h
  9. **
  10. ** 【功能实现】  文本转换语音输出   
  11. **
  12. ** 【适用平台】  STM32F103 + 标准库v3.5 + keil5 + SYN6288
  13. **
  14. ** 【硬件重点】  接线,模块有五个引脚,可以只接三根线,即可实现文本转音:
  15. **               VCC  ---  5V
  16. **               GND  ---  GND
  17. **               RXD  ---  PC12   说明:与所用串口配合,USART1-PA9, USART2-PA2, USART3-PB10, UART4-PC10, UART5-PC12(本示例中所用引脚)
  18. **               TXD  ---  空置   
  19. **               BY   ---  空置   说明:模块忙状态引脚,测试时可空置,做真实项目时,建议用于配合检测状态。
  20. **
  21. ** 【移植说明】  1- 复制本工程bsp文件夹中的两个文件夹: USART、SYN6288,到目标工程文件夹中; (注意,本文件须配合bsp_usart.c文件使用)
  22. **               2- 在keil左侧工程管理器中,双击,把上述两者的c文件添加到工程;
  23. **               3- 点击魔术棒,在Options.../c.../Include...下添加头文件存放路径;
  24. **               4- 在代码中,#include "bsp_usart.h",和 #include "bsp_syn6288.h";
  25. **
  26. ** 【代码使用】  初 始 化:SYN6288_Init(USARTx);       // 使用不同的串口,就接不同的TX线
  27. **               输出语音:SYN6288_Say("你好吗?");     // 注意,传入参数可为格式化参数,如printf参数般使用
  28. **   
  29. ** 【更新记录】
  30. **               2022-06-09   完善输出语音函数、完善注释
  31. **               2022-05-00   示例工程建立
  32. **   
  33. ************************************************************************************************************************************/
  34. #include <stm32f10x.h>  
  35. #include "bsp_usart.h"
  36. /*****************************************************************************
  37. ** 全局变量 (无要修改)
  38. ****************************************************************************/
  39. typedef struct
  40. {
  41.     uint8_t         FlagOkay;           // 状态标记, 暂未用到,保留; 0=未初始化或异常, 1=正常
  42.     uint32_t        Baudrate;           // 记录所用的串口波特率,暂未用到,保留
  43.     USART_TypeDef*  USARTx;             // 记录所用的端口
  44. }xSYN6288_TypeDef;
  45. extern xSYN6288_TypeDef  xSYN6288;      // 声明为全局变量,方便记录信息、状态
  46.    
  47. /*****************************************************************************
  48. ** 声明全局函数
  49. **
  50. ****************************************************************************/
  51. void SYN6288_Init(USART_TypeDef *USARTx);
  52. void SYN6288_Say(char *fmt, ...);
  53. #endif
 楼主| 欢乐家园 发表于 2023-1-31 00:14 | 显示全部楼层
2:bsp_syn6288.h文件
  1. #ifndef __SYN6288_H
  2. #define __SYN6288_H
  3. /***********************************************************************************************************************************
  4. ** 【代码编写】  魔女开发板团队
  5. ** 【代码更新】  Q群文件夹      
  6. ** 【淘    宝】  魔女开发板      https://demoboard.taobao.com
  7. ***********************************************************************************************************************************
  8. ** 【文件名称】  bsp_sys6288.h
  9. **
  10. ** 【功能实现】  文本转换语音输出   
  11. **
  12. ** 【适用平台】  STM32F103 + 标准库v3.5 + keil5 + SYN6288
  13. **
  14. ** 【硬件重点】  接线,模块有五个引脚,可以只接三根线,即可实现文本转音:
  15. **               VCC  ---  5V
  16. **               GND  ---  GND
  17. **               RXD  ---  PC12   说明:与所用串口配合,USART1-PA9, USART2-PA2, USART3-PB10, UART4-PC10, UART5-PC12(本示例中所用引脚)
  18. **               TXD  ---  空置   
  19. **               BY   ---  空置   说明:模块忙状态引脚,测试时可空置,做真实项目时,建议用于配合检测状态。
  20. **
  21. ** 【移植说明】  1- 复制本工程bsp文件夹中的两个文件夹: USART、SYN6288,到目标工程文件夹中; (注意,本文件须配合bsp_usart.c文件使用)
  22. **               2- 在keil左侧工程管理器中,双击,把上述两者的c文件添加到工程;
  23. **               3- 点击魔术棒,在Options.../c.../Include...下添加头文件存放路径;
  24. **               4- 在代码中,#include "bsp_usart.h",和 #include "bsp_syn6288.h";
  25. **
  26. ** 【代码使用】  初 始 化:SYN6288_Init(USARTx);       // 使用不同的串口,就接不同的TX线
  27. **               输出语音:SYN6288_Say("你好吗?");     // 注意,传入参数可为格式化参数,如printf参数般使用
  28. **   
  29. ** 【更新记录】
  30. **               2022-06-09   完善输出语音函数、完善注释
  31. **               2022-05-00   示例工程建立
  32. **   
  33. ************************************************************************************************************************************/
  34. #include <stm32f10x.h>  
  35. #include "bsp_usart.h"
  36. /*****************************************************************************
  37. ** 全局变量 (无要修改)
  38. ****************************************************************************/
  39. typedef struct
  40. {
  41.     uint8_t         FlagOkay;           // 状态标记, 暂未用到,保留; 0=未初始化或异常, 1=正常
  42.     uint32_t        Baudrate;           // 记录所用的串口波特率,暂未用到,保留
  43.     USART_TypeDef*  USARTx;             // 记录所用的端口
  44. }xSYN6288_TypeDef;
  45. extern xSYN6288_TypeDef  xSYN6288;      // 声明为全局变量,方便记录信息、状态
  46.    
  47. /*****************************************************************************
  48. ** 声明全局函数
  49. **
  50. ****************************************************************************/
  51. void SYN6288_Init(USART_TypeDef *USARTx);
  52. void SYN6288_Say(char *fmt, ...);
  53. #endif
 楼主| 欢乐家园 发表于 2023-1-31 00:14 | 显示全部楼层
3:bsp_syn6288.c文件
  1. #include "bsp_syn6288.h"
  2. #include "stdarg.h"

  3. xSYN6288_TypeDef  xSYN6288;                // 全局变量结构体

  4. static void delay_ms(uint32_t ms)          // 简单的延时函数
  5. {
  6.     ms = ms * 11993;                       
  7.     for (uint32_t i = 0; i < ms; i++);   
  8. }


  9. //Music:选择背景音乐。0:无背景音乐,1~15:选择背景音乐
  10. // SYN6288_SendFrameInfo(0, "[v10][m1][t5]结算金额 为32.8元");
  11. // 参数: 0~15  :  背景音乐,0_无背景音乐,1~15_背景音乐可选
  12. //       [V0~16]:  文本朗读音量,0_最小,16_最大
  13. //       [m0~16]:  背景音乐音量,0_最小,16_最大
  14. //       [t0~5]:   朗读语速,0_最慢,5_最快
  15. //       其它不常用功能请参考数据手册
  16. static void SYN6288_SendFrameInfo(uint8_t Music, uint8_t *HZdata)
  17. {
  18.     /****************需要发送的文本**********************************/
  19.     unsigned  char  Frame_Info[50];
  20.     unsigned  char  HZ_Length;
  21.     unsigned  char  ecc  = 0;             //定义校验字节
  22.     unsigned  int i = 0;
  23.     HZ_Length = strlen((char *)HZdata);   //需要发送文本的长度

  24.     /*****************帧固定配置信息**************************************/
  25.     Frame_Info[0] = 0xFD ;                //构造帧头FD
  26.     Frame_Info[1] = 0x00 ;                //构造数据区长度的高字节
  27.     Frame_Info[2] = HZ_Length + 3;        //构造数据区长度的低字节
  28.     Frame_Info[3] = 0x01 ;                //构造命令字:合成播放命令
  29.     Frame_Info[4] = 0x01 | Music << 4 ;   //构造命令参数:背景音乐设定

  30.     /*******************校验码计算***************************************/
  31.     for (i = 0; i < 5; i++)               //依次发送构造好的5个帧头字节
  32.         ecc = ecc ^ (Frame_Info[i]);      //对发送的字节进行异或校验

  33.     for (i = 0; i < HZ_Length; i++)       //依次发送待合成的文本数据
  34.         ecc = ecc ^ (HZdata[i]);          //对发送的字节进行异或校验
  35.     /*******************发送帧信息***************************************/
  36.     memcpy(&Frame_Info[5], HZdata, HZ_Length);
  37.     Frame_Info[5 + HZ_Length] = ecc;
  38.     if (xSYN6288.USARTx == USART1)   USART1_SendData(Frame_Info, 5 + HZ_Length + 1);
  39.     if (xSYN6288.USARTx == USART2)   USART2_SendData(Frame_Info, 5 + HZ_Length + 1);
  40.     if (xSYN6288.USARTx == USART3)   USART3_SendData(Frame_Info, 5 + HZ_Length + 1);
  41.     if (xSYN6288.USARTx == UART4)    UART4_SendData(Frame_Info, 5 + HZ_Length + 1);
  42.     if (xSYN6288.USARTx == UART5)    UART5_SendData(Frame_Info, 5 + HZ_Length + 1);
  43. }



  44. /***********************************************************
  45. * 名    称: SYN6288_Set(uint8_t *Info_data)
  46. * 功    能: 主函数 程序入口
  47. * 入口参数: *Info_data:固定的配置信息变量
  48. * 出口参数:
  49. * 说    明:本函数用于配置,停止合成、暂停合成等设置 ,默认波特率9600bps。
  50. * 调用方法:通过调用已经定义的相关数组进行配置。
  51. **********************************************************/
  52. static void SYN6288_Set(uint8_t *Info_data)
  53. {
  54.     uint8_t Com_Len;
  55.     Com_Len = strlen((char *)Info_data);
  56.     UART5_SendData(Info_data, Com_Len);
  57. }


  58. /******************************************************************************
  59. * 函  数: SYN6288_Say
  60. * 功  能: 输出合成语音
  61. * 参  数: 格式化参数,如printf参数般一样的用法
  62. * 返回值: 无
  63. * 示  例: SYN6288_Say("你好吗?");
  64. *******************************************************************************/
  65. void SYN6288_Say(char *fmt, ...)
  66. {
  67.     static char  str_1[200];   // 缓存区1,模块每次可转换200字节
  68.     static char  str_2[200];   // 缓存区2,模块每次可转换200字节
  69.     va_list ap;
  70.     va_start(ap, fmt);
  71.     vsprintf(str_1, fmt, ap);
  72.     va_end(ap);
  73.     sprintf(str_2, "[d][V12][m15][t5]%s", str_1);  // [d]恢复默认状态,[V12]朗读音量0~16,[m15]背景音量0~16,[t5]语速0~5
  74.     SYN6288_SendFrameInfo(0, (uint8_t *)str_2); // 无背景音乐
  75. }

  76. /******************************************************************************
  77. * 函  数: SYN6288_Init
  78. * 功  能: 初始化所用串口, 模块默认通信波特率9600
  79. * 参  数: 串口-USARTx
  80. * 返回值: 无
  81. * 示  例: SYN6288_Init(USART1);
  82. *******************************************************************************/
  83. void SYN6288_Init(USART_TypeDef *USARTx)
  84. {
  85.     uint16_t baudrate = 9600;      // 默认波特率9600bps。
  86.     delay_ms(200);                 // 上电后,稍作延时,等待模块进入稳定状态
  87.     if (USARTx == USART1)    USART1_Init(baudrate);
  88.     if (USARTx == USART2)    USART2_Init(baudrate);
  89.     if (USARTx == USART3)    USART3_Init(baudrate);
  90. #ifdef STM32F10X_HD
  91.     if (USARTx == UART4)     UART4_Init(baudrate);
  92.     if (USARTx == UART5)     UART5_Init(baudrate);
  93. #endif
  94.     xSYN6288.FlagOkay = 0;         // 初始化状态
  95.     xSYN6288.USARTx   = USARTx;    // 记录所用串口端口
  96. }
 楼主| 欢乐家园 发表于 2023-1-31 00:15 | 显示全部楼层
五、资料下载

方式1:CSDN下载(5积分,有积分的老板,得大力支持,很缺积分!)

https://download.csdn.net/download/zhouml_msn/85592868
您需要登录后才可以回帖 登录 | 注册

本版积分规则

114

主题

1030

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

114

主题

1030

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部