SYN6288E 中文語音合成芯片是北京宇音天下科技有限公司在 2010 年初推出的一款性/價比更高的 SYN6288 芯片的基礎上更改封裝方式的,效果更自然的一款中高端語音合成芯片。SYN6288E 通過異步串 口(UART)通訊方式,接收待合成的文本數據,實現文本到語音(或 TTS 語音)的轉換。
一、模塊來源
模塊實物展示:
資料鏈接:https://pan.baidu.com/s/1FjoAuJm387bxaZxS6g9HEg
資料提取碼:8888
二、規格參數
輸入電壓:2.4V~5.1V
額定電流:2.0uA~280mA
控制方式:串口
以上信息見廠家資料文件
三、移植過程
我們的目標是將例程移植至CW32F030C8T6開發板上【能夠播報語音的功能】。首先要獲取資料,查看數據手冊應如何實現讀取數據,再移植至我們的工程。
3.1查看資料
語音播報控制,只要配置出串口,再根據數據手冊要求的命令幀格式發送數據,就能實現播報功能。
注意!該模塊只能實現語音播報,沒有語音識別功能!也無法錄音。
3.2引腳選擇
想要使用uart串口,需要確定使用的引腳是否有串口外設功能,可以通過用戶手冊進行查看。在用戶手冊的第146頁。
這里選擇使用PA2和PA3的附加串口2功能。
有串口功能的引腳
模塊接線圖
3.3移植至工程
移植步驟中的導入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_syn6288.c與bsp_syn6288.h。這里不再過多講述,移植完成后面修改相關代碼。
在文件bsp_syn6288.c中,編寫如下代碼。
/* * Change Logs: * Date Author Notes * 2024-06-25 LCKFB-LP first version */ #include "bsp_syn6288.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #define SYN6288RX_LEN_MAX 255 unsigned char SYN6288RX_BUFF[SYN6288RX_LEN_MAX]; unsigned char SYN6288RX_LEN = 0; /****************************************************************** * 函 數 名 稱:SYN6288_GPIO_Init * 函 數 說 明:SYN6288引腳初始化 * 函 數 形 參:band_rate GPS通信波特率 * 函 數 返 回:無 * 作 者:LC * 備 注:默認波特率為9600 ******************************************************************/ void SYN6288_GPIO_Init(uint32_t band_rate) { GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結構體 BSP_SYN6288_GPIO_RCC_ENABLE(); // 使能GPIO時鐘 BSP_SYN6288_UART_RCC_ENABLE(); // 使能UART時鐘 GPIO_InitStruct.Pins = BSP_SYN6288_TX_PIN; // GPIO引腳 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽輸出 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; // 輸出速度高 GPIO_Init(BSP_SYN6288_GPIO_PORT, &GPIO_InitStruct); // 初始化 GPIO_InitStruct.Pins = BSP_SYN6288_RX_PIN; // GPIO引腳 GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉輸入 GPIO_Init(BSP_SYN6288_GPIO_PORT, &GPIO_InitStruct); // 初始化 BSP_SYN6288_AF_UART_TX(); // UART_TX復用 BSP_SYN6288_AF_UART_RX(); // UART_RX復用 // 配置UART USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = band_rate; // 波特率 USART_InitStructure.USART_Over = USART_Over_16; // 配置USART的過采樣率。 USART_InitStructure.USART_Source = USART_Source_PCLK; // 設置時鐘源 USART_InitStructure.USART_UclkFreq = 64000000; //設置USART時鐘頻率(和主頻一致即可) USART_InitStructure.USART_StartBit = USART_StartBit_FE; //RXD下降沿開始 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位1 USART_InitStructure.USART_Parity = USART_Parity_No ; // 不使用校驗 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 不使用流控 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 收發模式 USART_Init(BSP_SYN6288, &USART_InitStructure); // 初始化串口2 // 優先級,無優先級分組 NVIC_SetPriority(BSP_SYN6288_IRQ, 0); // UARTx中斷使能 NVIC_EnableIRQ(BSP_SYN6288_IRQ); // 使能UARTx RC中斷 USART_ITConfig(BSP_SYN6288, USART_IT_RC, ENABLE); } /****************************************************************** * 函 數 名 稱:SYN6288_Send_Bit * 函 數 說 明:向SYN6288發送單個字符 * 函 數 形 參:ch發送的字符 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void SYN6288_Send_Bit(unsigned char ch) { USART_SendData(BSP_SYN6288, (uint8_t)ch); while( RESET == USART_GetFlagStatus(BSP_SYN6288, USART_FLAG_TXE) ){} // 等待發送數據緩沖區標志置位 } /****************************************************************** * 函 數 名 稱:SYN6288_send_String * 函 數 說 明:SYN6288發送字符串 * 函 數 形 參:str要發送的字符串 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void SYN6288_send_String(unsigned char *str) { while( str && *str ) // 地址為空或者值為空跳出 { SYN6288_Send_Bit(*str++); } } //獲取串口接收的數據 unsigned char *Get_SYN6288RX_BUFF(void) { return SYN6288RX_BUFF; } //清除串口接收的數據 void Clear_SYN6288RX_BUFF(void) { unsigned char i = SYN6288RX_LEN_MAX-1; while(i) { SYN6288RX_BUFF[i--] = '?'; } SYN6288RX_LEN = 0; } /************************************************************ * 函數名稱:SYN6288_Send_Cmd * 函數說明:向SYN6288發送命令 * 型 參: * 【CmdType=命令字】 可使用參數有: * 0x01 語音合成命令 * 0x31 設置波特率(默認9600) * 0x02 停止合成命令 * 0x03 暫停合成命令 * 0x04 恢復合成命令 * 0x21 芯片狀態查詢命令 * 0x88 芯片進入低功耗模式 * 【CmdPar=命令參數】 可使用參數有: * 字節高5位的十進制為0時,表示不加背景音樂 * 字節高5位的十進制為1~15時,表示所選背景音樂的編號 * 字節低3位的十進制為0~3,并且命令字為語音合成命令時,分別代表設置文本為GB2312格式、GBK格式、BIG5格式、UNICODE格式; * 字節低3位的十進制為0~2,并且命令字為設置波特率時,分別代表設置波特率為9600、19200、38400; * 【text=播報的文本】 * 返 回 值:0=發送成功 * 備 注: * 接收到控制命令幀,芯片會向上位機發送1個字節的狀態回傳,上位機可根據這個回傳來判斷芯片目前的工作狀態 * 初始化成功回傳 0X4A * 收到正確的命令幀回傳 0x41 * 收到不能識別命令幀回傳 0x45 * 芯片播音狀態回傳 0x4E * 芯片空閑狀態回傳 0x4F *************************************************************/ unsigned char SYN6288_Send_Cmd(uint8_t CmdType, uint8_t CmdPar, uint8_t *text) { unsigned char frame_header = 0XFD; //幀頭 unsigned int Text_Len = strlen((const char*)text);//待發送文本的長度 unsigned int Data_Len = Text_Len + 3; //數據區長度;3=幀頭、幀尾和異或校驗 unsigned char Xor_Check = 0; //異或校驗存儲 unsigned char Send_Buff[210]; //待發送的命令幀,命令幀最大206個字節 uint8_t i = 0; Send_Buff[0] = frame_header; //幀頭 Send_Buff[1] = Data_Len>>8; //高位在前 Send_Buff[2] = Data_Len&0x00ff; //低位在前 Send_Buff[3] = CmdType; //命令字 Send_Buff[4] = CmdPar; //命令數據 sprintf((char*)Send_Buff+5, "%s", text ); //發送數據 for( i = 0; i < Text_Len+5; i++ ) { Xor_Check = Xor_Check ^ Send_Buff[i];//對每一個數據進行異或校驗保存 SYN6288_Send_Bit( Send_Buff[i] );//發送數據 } SYN6288_Send_Bit( Xor_Check );//發送最后一位:異或校驗數據 return 0; } /****************************************************************** * 函 數 名 稱:BSP_SYN6288_IRQHandler * 函 數 說 明:串口中斷服務函數 * 函 數 形 參:無 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void BSP_SYN6288_IRQHandler(void) { if(USART_GetITStatus(BSP_SYN6288,USART_IT_RC) != RESET) // 接收緩沖區不為空 { SYN6288RX_BUFF[ SYN6288RX_LEN ] = USART_ReceiveData(BSP_SYN6288); SYN6288RX_LEN = ( SYN6288RX_LEN + 1 ) % SYN6288RX_LEN_MAX; SYN6288RX_BUFF[SYN6288RX_LEN] = '?'; USART_ClearITPendingBit(BSP_SYN6288, USART_IT_RC); // 清除中斷標志位 } }
在文件bsp_syn6288.h中,編寫如下代碼。
/* * Change Logs: * Date Author Notes * 2024-06-25 LCKFB-LP first version */ #ifndef _BSP_SYN6288_H #define _BSP_SYN6288_H #include "board.h" #define BSP_SYN6288_GPIO_RCC_ENABLE() __RCC_GPIOA_CLK_ENABLE() // GPIO端口時鐘 #define BSP_SYN6288_UART_RCC_ENABLE() __RCC_UART2_CLK_ENABLE() // 串口2的時鐘 #define BSP_SYN6288_AF_UART_TX() PA02_AFx_UART2TXD() #define BSP_SYN6288_AF_UART_RX() PA03_AFx_UART2RXD() #define BSP_SYN6288_GPIO_PORT CW_GPIOA // GPIO的端口 #define BSP_SYN6288_TX_PIN GPIO_PIN_2 // 串口TX的引腳 #define BSP_SYN6288_RX_PIN GPIO_PIN_3 // 串口RX的引腳 #define BSP_SYN6288 CW_UART2 // 串口2 #define BSP_SYN6288_IRQ UART2_IRQn // 串口2中斷 #define BSP_SYN6288_IRQHandler UART2_IRQHandler // 串口2中斷服務函數 void SYN6288_GPIO_Init(uint32_t band_rate); unsigned char SYN6288_Send_Cmd(uint8_t CmdType, uint8_t CmdPar, uint8_t *text); #endif
四、移植驗證
在自己工程中的main主函數中,編寫如下。
/* * Change Logs: * Date Author Notes * 2024-06-25 LCKFB-LP first version */ #include "board.h" #include "stdio.h" #include "bsp_uart.h" #include "bsp_syn6288.h" int32_t main(void) { board_init(); uart1_init(9600); SYN6288_GPIO_Init(9600); printf("startrn"); delay_ms(1000); SYN6288_Send_Cmd(0x01,0x00,(uint8_t *)"立創開發板"); while(1) { } }
移植現象:模塊播報"立創開發板"。
模塊移植成功案例代碼:
鏈接:https://pan.baidu.com/s/1eaj1otbe_v5xWZtn7We84w?pwd=LCKF
提取碼:LCKF
-
模塊
+關注
關注
7文章
2767瀏覽量
48712 -
語音合成
+關注
關注
2文章
92瀏覽量
16335 -
CW32
+關注
關注
1文章
232瀏覽量
999
發布評論請先 登錄
相關推薦
【項目展示】基于CW32的遙控循跡小車

【CW32模塊使用】JQ8900語音播報模塊

XFS5152CE語音合成模塊
語音播報功能的實現

評論