BLE超低功耗声纹门锁
<p align="center" style="text-align:center"><span style="font-family:Microsoft YaHei;"><span style="font-size:24px;"><b><span lang="EN-US"><span style="color:black">BLE</span></span><span style="color:black">超低功耗声纹门锁</span></b></span></span></p><p align="right" style="margin-right:64px; text-align:right"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><b><span style="font-size:12.0pt"><span style="font-family:"微软雅黑",sans-serif">作者:xujinxi</span></span></b></span></span></p>
<p style="margin-right: 64px;"> </p>
<p style="margin-right: 64px;"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><b><span style="font-size:14.0pt"><span style="background:white"><span style="font-family:"微软雅黑",sans-serif"><span style="color:black"> 一、项目背景</span></span></span></span></b></span></span></p>
<p style="text-indent: 21pt;"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span lang="EN-US" style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif">OnSemi</span></span><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif">提供的RSL10蓝牙模组,应该为业界最小的蓝牙低功耗模组,并且该模组有业界最优的低功耗管理,且开发套件的sensor外设丰富,为各种奇思妙想的实现提供了非常理想的平台。</span></span></span></span></p>
<p style="text-indent: 21pt;"> </p>
<p style="text-indent: 21pt;"><strong><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif">二、作品简介</span></span></span></span></strong></p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span lang="EN-US" style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif">RSL10</span></span><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif">蓝牙模组具有超低功耗以及方便使用的音频接口。搭载传感器以及相关的参考驱动代码,可以可靠、便捷的实现工程师的奇思妙想,深受工程师欢迎。EEWORLD+OnSemi开展的创意设计大赛,为广大工程师朋友提供施展才华的舞台。</span></span></span></span></p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif">本项目构思使用RSL10蓝牙模组搭载的DMIC和IMU单元。用于智能门锁户外敲门的识别和语音拾取,并发送至室内接收端。室内的RSL10蓝牙模组则接收户外传来的语音数据,通过串口传递至PC,PC使用该语音数据访问语音平台,识别语音指令。如果是正确的“开门”指令,则”开门”信号通过串口经室内RSL10蓝牙模组,再通过BLE传输至户外RSL10蓝牙模组,进而发出门锁开启信号。完成整个低功耗语音门锁的实现</span></span></span></span></p>
<p> </p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><b><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif"> 三、<span style="font-family:"微软雅黑",sans-serif">系统框图和各部分功能说明</span></span></span></b></span></span></p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif">整个体统主要由RSL10、IMU、DMIC等传感器接口组成,如下为系统电子系统框图:USB端口连接Jlink,Jlink通过USB CDC建立与PC的通讯路径,RSL10户外语音采集板将采集的语音数据通过蓝牙传至室内RSL10模组,再通过Jlink的串口上传至PC Python代码,用于数据分析和处理。PC将数据推送至百度语音识别引擎,识别结果返回给PC。最后下发至室内和户外RSL10模组做相应操作。</span></span></span></span></p>
<p style="text-indent:21.0pt; text-align:justify"> </p>
<p> </p>
<p style="text-align:justify"><strong><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif"> 四、作品源码和案例中处理的传感器数据</span></span></span></span></strong></p>
<p style="text-align:justify"></p>
<p style="text-align:justify"></p>
<p style="text-align:justify"></p>
<p> </p>
<p>/* ----------------------------------------------------------------------------<br />
* Copyright (c) 2015-2017 Semiconductor Components Industries, LLC (d/b/a<br />
* ON Semiconductor), All Rights Reserved<br />
*<br />
* Copyright (C) RivieraWaves 2009-2016<br />
*<br />
* This module is derived in part from example code provided by RivieraWaves<br />
* and as such the underlying code is the property of RivieraWaves [a member<br />
* of the CEVA, Inc. group of companies], together with additional code which<br />
* is the property of ON Semiconductor. The code (in whole or any part) may not<br />
* be redistributed in any form without prior written permission from<br />
* ON Semiconductor.<br />
*<br />
* The terms of use and warranty for this code are covered by contractual<br />
* agreements between ON Semiconductor and the licensee.<br />
*<br />
* This is Reusable Code.<br />
*<br />
* ----------------------------------------------------------------------------<br />
* app.c<br />
* - Main application file<br />
* ----------------------------------------------------------------------------<br />
* $Revision: 1.25 $<br />
* $Date: 2017/12/05 16:02:54 $<br />
* ------------------------------------------------------------------------- */</p>
<p>//20210626 add dmic support by hhz<br />
#include "app.h"<br />
#include <printf.h></p>
<p>#define DMIC_DATA_WIDTH_16 //16bit DMIC data-- DMIC_DATA_WIDTH_8 8bit DMIC data</p>
<p>#ifdef DMIC_DATA_WIDTH_8 //FS = 16000hz,data width = int8_t,2 second record data =16000*1 =16000 samples<br />
#define DMIC_BUF_SIZE 16000 //100 sample, equal 200 bytes data(int16_t)<br />
#else<br />
#define DMIC_BUF_SIZE 16000 //FS = 16000hz,data width = int16_t,2 second record data =16000*2 =32000 s<br />
#endif</p>
<p>#define BLE_TX_PACKET_SIZE 100 //200</p>
<p>uint32_t output_flag = 0;<br />
uint32_t data_ready_flag = 0; //init not data ready until interruption receive DMIC_BUF_SIZE data from DMIC</p>
<p>int16_t dmic_value_scope_int16 = 0;</p>
<p>#ifdef DMIC_DATA_WIDTH_8<br />
int8_t dmic_value_buf = {0}; //d0_msb,d0_lsb,d1_msb,d1_lsb...<br />
#else<br />
int16_t dmic_value_buf = {0}; //d0_msb,d0_lsb,d1_msb,d1_lsb...<br />
#endif</p>
<p>//dmic_value_buf = lsb, dmic_value_buf = msb<br />
uint8_t* dmic_buf_pointer_uint8 = (uint8_t *)dmic_value_buf;</p>
<p>uint32_t j = 0,k = 0;</p>
<p>uint32_t dmic_packet_num = 0;<br />
uint32_t tx_cnt = 0;<br />
uint32_t record_sample_num = 0;<br />
//+ lsb_num,~,~,msb_num packet num uint32 lsb fist<br />
uint8_t* pointer_record_sample_num_uint8 = (uint8_t *)(&record_sample_num);</p>
<p>uint8_t syn_head_array = {0x55,0x55,0x55,0x55}; //+ lsb_num,~,~,msb_num packet num uint32 lsb fist<br />
uint8_t syn_end_array = {0xaa,0xaa,0xaa,0xaa}; //+ lsb_num,~,~,msb_num packet num uint32 lsb fist<br />
uint8_t head_sended_flag = 0;<br />
uint8_t end_sended_flag = 0;</p>
<p>static uint8_t asr_flag = 0;</p>
<p>void DMIC_OUT_OD_IN_IRQHandler(void)<br />
{<br />
static int32_t i = 0;</p>
<p> //dmic_value_scope_int32 = (int32_t)AUDIO->DMIC0_DATA;<br />
//dmic_value_scope_int16 = (int16_t)((dmic_value_scope_int32 >> 1) & 0xffff);<br />
//dmic_value_scope_int16 = (int16_t)((dmic_value_scope_int32) & 0xffff);<br />
//dmic_value_scope_int16 = (int16_t)(dmic_value_scope_int32);<br />
//PRINTF("%d = %08x = %d\n",dmic_value_scope_int32,dmic_value_scope_int32,dmic_value_scope_int16);</p>
<p> //dmic_value_scope_int16 = (int16_t)AUDIO->DMIC0_DATA;<br />
dmic_value_scope_int16 = (int16_t)((uint16_t)(AUDIO->DMIC_DATA & 0x0000ffff));<br />
Sys_GPIO_Toggle(3); //test frame frequency</p>
<p> //dmic_value_scope_int16 = dmic_packet_num;<br />
//PRINTF("%d = %08x\n",dmic_value_scope_int16,dmic_value_scope_int16);</p>
<p> if(dmic_packet_num < DMIC_BUF_SIZE)<br />
{<br />
#ifdef DMIC_DATA_WIDTH_8 //FS = 16000hz,data width = int8_t,2 second record data =16000*1 =16000 samples<br />
dmic_value_buf = (int8_t)dmic_value_scope_int16;<br />
#else<br />
dmic_value_buf = dmic_value_scope_int16;<br />
//dmic_value_buf = dmic_packet_num;<br />
#endif</p>
<p> dmic_packet_num++;<br />
}<br />
else<br />
{<br />
data_ready_flag = 1;<br />
//asr_flag = 2;<br />
//NVIC_DisableIRQ(DMIC_OUT_OD_IN_IRQn); //close DMIC interrupt<br />
}</p>
<p>}</p>
<p><br />
void DIO0_IRQHandler(void)<br />
{<br />
//static uint8_t ignore_next_dio_int = 1;<br />
PRINTF("DIO0 INTERRUPT\n");<br />
asr_flag ++;</p>
<p> if(asr_flag == 2)<br />
NVIC_EnableIRQ(DMIC_OUT_OD_IN_IRQn);<br />
}</p>
<p><br />
int main(void)<br />
{<br />
uint32_t length;<br />
uint8_t temp; //for uart</p>
<p> static uint8_t time_cnt = 0;</p>
<p> /* Initialize the system */<br />
App_Initialize();</p>
<p> //setting dio3 as dmic interrupt toggle output for sample rate conform<br />
Sys_DIO_Config(3, DIO_MODE_GPIO_OUT_0); //CLOCK OUTPUT<br />
//Sys_DIO_Config(3, DIO_MODE_AUDIOCLK);</p>
<p> //Sys_DIO_Config(LED_DIO_GREEN, DIO_MODE_GPIO_OUT_0); //GREEN LED<br />
Sys_GPIO_Toggle(LED_DIO_GREEN);<br />
Sys_GPIO_Set_High(LED_DIO_GREEN);</p>
<p> NVIC_EnableIRQ(DIO0_IRQn);</p>
<p> PRINTF("HARDWARE INIT OK !\n"); //hhz<br />
PRINTF("into main loop !\n"); //hhz</p>
<p> /* Main application loop:<br />
* - Run the kernel scheduler<br />
* - Send notifications for the battery voltage and RSSI values<br />
* - Refresh the watchdog and wait for an interrupt before continuing */<br />
while (1)<br />
{<br />
Kernel_Schedule();</p>
<p> /*if(asr_flag == 2)<br />
{<br />
NVIC_EnableIRQ(DMIC_OUT_OD_IN_IRQn);<br />
//PRINTF("NVIC_EnableIRQ\n");<br />
}<br />
else if(asr_flag == 0)<br />
{<br />
NVIC_DisableIRQ(DMIC_OUT_OD_IN_IRQn);<br />
//PRINTF("NVIC_DisableIRQ\n");<br />
}*/</p>
<p><br />
if (unhandled_packets != NULL)<br />
{<br />
if (UART_FillTXBuffer(unhandled_packets->length,<br />
unhandled_packets->data) !=<br />
UART_ERRNO_OVERFLOW)<br />
{<br />
unhandled_packets = removeNode(unhandled_packets);<br />
}<br />
}</p>
<p> if (ble_env.state == APPM_CONNECTED)<br />
{<br />
if (app_env.send_batt_ntf && bass_support_env.enable)<br />
{<br />
app_env.send_batt_ntf = 0;<br />
Batt_LevelUpdateSend(0, app_env.batt_lvl, 0);<br />
}</p>
<p> if (cs_env.sentSuccess)<br />
{<br />
// Copy data from the UART RX buffer to the TX buffer<br />
length = UART_EmptyRXBuffer(temp);<br />
if (length > 0)<br />
{<br />
// Split buffer into two packets when it's greater than<br />
// packet size<br />
if (length > PACKET_SIZE)<br />
{<br />
CustomService_SendNotification(ble_env.conidx,<br />
CS_IDX_TX_VALUE_VAL,<br />
temp,<br />
PACKET_SIZE);<br />
CustomService_SendNotification(ble_env.conidx,<br />
CS_IDX_TX_VALUE_VAL,<br />
&temp,<br />
length - PACKET_SIZE);<br />
}<br />
else<br />
{<br />
CustomService_SendNotification(ble_env.conidx,<br />
CS_IDX_TX_VALUE_VAL,<br />
temp,<br />
length);<br />
}<br />
}<br />
}</p>
<p> //test dmic first 0~1000 sample data<br />
/*<br />
if((data_ready_flag == 1) & (tx_cnt < DMIC_BUF_SIZE))<br />
{<br />
PRINTF("%d\n",dmic_value_buf);<br />
tx_cnt++;<br />
}<br />
*/</p>
<p> //if (cs_env.sentSuccess)<br />
if (cs_env.sentSuccess & (data_ready_flag == 1))<br />
{<br />
head_sended_flag = 1; //without head test<br />
end_sended_flag = 1; //without end test</p>
<p> if(head_sended_flag == 0)<br />
{<br />
PRINTF("TX:syn_head_array !\n"); //hhz<br />
CustomService_SendNotification(ble_env.conidx,<br />
CS_IDX_TX_VALUE_VAL,<br />
syn_head_array,<br />
4);<br />
//CustomService_SendNotification(ble_env.conidx,<br />
// CS_IDX_TX_VALUE_VAL,<br />
// pointer_record_sample_num_uint8,<br />
// 4);<br />
head_sended_flag = 1;<br />
}</p>
<p>#ifdef DMIC_DATA_WIDTH_8<br />
for(tx_cnt=0;tx_cnt < DMIC_BUF_SIZE/BLE_TX_PACKET_SIZE;tx_cnt++)<br />
{<br />
PRINTF("TX:%d ' DMIC packet !\n",tx_cnt);<br />
CustomService_SendNotification(ble_env.conidx,<br />
CS_IDX_TX_VALUE_VAL,<br />
dmic_buf_pointer_uint8,<br />
BLE_TX_PACKET_SIZE);<br />
dmic_buf_pointer_uint8 += BLE_TX_PACKET_SIZE;</p>
<p> PRINTF("TX:tx dmic watchdog refresh !\n");<br />
Sys_Watchdog_Refresh();<br />
}<br />
#else<br />
if((data_ready_flag == 1) & (tx_cnt < DMIC_BUF_SIZE*2/BLE_TX_PACKET_SIZE))<br />
{<br />
//PRINTF("%d\n",dmic_value_buf);<br />
PRINTF("TX:%d ' DMIC packet !\n",tx_cnt);</p>
<p> //CustomService_SendNotification(ble_env.conidx,<br />
// CS_IDX_TX_VALUE_VAL,<br />
// syn_head_array,<br />
// 2);</p>
<p><br />
CustomService_SendNotification(ble_env.conidx,<br />
CS_IDX_TX_VALUE_VAL,<br />
dmic_buf_pointer_uint8,<br />
BLE_TX_PACKET_SIZE);</p>
<p> dmic_buf_pointer_uint8 += BLE_TX_PACKET_SIZE;</p>
<p> //CustomService_SendNotification(ble_env.conidx,<br />
// CS_IDX_TX_VALUE_VAL,<br />
// syn_end_array,<br />
// 2);</p>
<p> tx_cnt++;<br />
}<br />
else if((data_ready_flag == 1) & (tx_cnt >= DMIC_BUF_SIZE*2/BLE_TX_PACKET_SIZE))<br />
{<br />
data_ready_flag = 0;</p>
<p> //without head test<br />
//head_sended_flag = 0;<br />
//end_sended_flag = 0;<br />
dmic_buf_pointer_uint8 = (uint8_t *)dmic_value_buf;<br />
dmic_packet_num = 0;<br />
tx_cnt = 0;<br />
asr_flag = 0;<br />
NVIC_DisableIRQ(DMIC_OUT_OD_IN_IRQn);<br />
PRINTF("close od interrupt,init all flag\n");<br />
}<br />
/*for(tx_cnt=0;tx_cnt < DMIC_BUF_SIZE*2/BLE_TX_PACKET_SIZE;tx_cnt++)<br />
{<br />
PRINTF("TX:%d ' DMIC packet !\n",tx_cnt);<br />
CustomService_SendNotification(ble_env.conidx,<br />
CS_IDX_TX_VALUE_VAL,<br />
dmic_buf_pointer_uint8,<br />
BLE_TX_PACKET_SIZE);<br />
dmic_buf_pointer_uint8 += BLE_TX_PACKET_SIZE;</p>
<p> PRINTF("TX:tx dmic watchdog refresh !\n");<br />
Sys_Watchdog_Refresh();<br />
}*/</p>
<p>#endif<br />
if((end_sended_flag == 0) & (data_ready_flag == 0)) //all dmic data have been sended over BLE<br />
{<br />
PRINTF("TX:syn_end_array !\n"); //hhz<br />
CustomService_SendNotification(ble_env.conidx,<br />
CS_IDX_TX_VALUE_VAL,<br />
syn_end_array,<br />
4);<br />
//end_sended_flag = 1;</p>
<p><br />
head_sended_flag = 0;<br />
end_sended_flag = 0;</p>
<p> dmic_buf_pointer_uint8 = (uint8_t *)dmic_value_buf;<br />
dmic_packet_num = 0;<br />
tx_cnt = 0;<br />
asr_flag = 0;<br />
PRINTF("close od interrupt,init all flag\n");<br />
}</p>
<p> //PRINTF("TX dmic_value_buf\n");</p>
<p> //for(tx_cnt=0;tx_cnt < DMIC_BUF_SIZE;tx_cnt++)<br />
//{<br />
// PRINTF("%d\n",dmic_value_buf);<br />
// Sys_Watchdog_Refresh();<br />
//}</p>
<p> data_ready_flag = 0;<br />
}</p>
<p> //Sys_Watchdog_Refresh();</p>
<p> } //connected</p>
<p> Sys_GPIO_Toggle(3);</p>
<p> /* Refresh the watchdog timer */<br />
Sys_Watchdog_Refresh();</p>
<p> /* Wait for an event before executing the scheduler again */<br />
SYS_WAIT_FOR_EVENT;</p>
<p> } //while(1)<br />
} //main</p>
<p> </p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><b><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif"> 五、视频<span style="font-family:"微软雅黑",sans-serif">演示</span></span></span></b></span></span></p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span lang="EN-US" style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">1</span></span></span><span style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">、室内机RSL10模组上电;</span></span></span></span></span></p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span lang="EN-US" style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">2</span></span></span><span style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">、户外RSL10 sensor板上电;</span></span></span></span></span></p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span lang="EN-US" style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">3</span></span></span><span style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">、启动PC处理程序,连接室内RSL10模组;</span></span></span></span></span></p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span lang="EN-US" style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">4</span></span></span><span style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">、通过按键启动户外RSL10 sensor模组录音,录音数据通过BLE传输至室内RSL10模组,RSL10模组转接至PC,PC转百度语音识别引擎识别,识别结果返回PC,并做识别结果演示。</span></span></span></span></span></p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif">演示视频链接如下:</span></span></span></span></p>
<p><iframe allowfullscreen="true" frameborder="0" height="450" src="//player.bilibili.com/player.html?bvid=1Ff4y1j7KW&page=1" style="background:#eee;margin-bottom:10px;" width="750"></iframe></p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span lang="EN-US" style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">B</span></span></span><span style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">站:<a href="https://www.bilibili.com/video/BV1Ff4y1j7KW?share_source=copy_web" style="color:#0563c1; text-decoration:underline"><span style="color:black">https://www.bilibili.com/video/BV1Ff4y1j7KW?share_source=copy_web</span></a></span></span></span> </span></span></p>
<p> </p>
<p><iframe allowfullscreen="true" frameborder="0" height="450" src="http://player.youku.com/embed/XNTE4MzEzNDMwNA" style="background:#eee;margin-bottom:10px;" width="750"></iframe></p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><span style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif"><span style="color:black">优酷:https://v.youku.com/v_show/id_XNTE4MzEzNDMwNA==.html</span></span></span></span></span></p>
<p style="text-align:justify"> </p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><b><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif"> 六、项目总结</span></span></b></span></span></p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><b> </b><span lang="EN-US" style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif">RSL10</span></span><span style="font-size:14.0pt"><span style="font-family:"微软雅黑 Light",sans-serif">开发板撘载的多种sensor:例如IMU,DMIC,温度,湿度等传感器,在简单或者复杂环境下,可以同时采集多种数据用于数据分析,以找出环境与传感器的数据关系,从而方便电子设备辨别环境或者动作,实现电子系统对环境和动作的感知。相关的代码例程和sensor硬件DEMO,方便工程师将传感器集成进原来系统内,进而减少时间浪费,快速评估传感器,赞</span></span><b><span lang="EN-US" style="font-size:14.0pt"><span style="font-family:"Segoe UI Emoji",sans-serif">👍</span></span></b><b><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif">!</span></span></b></span></span></p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:"Times New Roman",serif"><b><span style="font-size:14.0pt"><span style="font-family:"微软雅黑",sans-serif"> </span></span></b></span></span></p>
<p style="text-align:justify"><strong><span style="font-family:Microsoft YaHei;"><span style="font-size:16px;">本项目只完成了户外RSL10模组DMIC数据采集,DMIC数据BLE传输至室内RSL10模组,RSL10通过串口传输音频数据到PC,并通过百度语音识别引擎完成语音识别,并输出识别结果。剩余功能未完成。另DMIC数据以及传输可靠性还需优化,成功率较低。</span></span></strong></p>
<p>头一个用到了音频功能!</p>
<p>语音采样率用的多少?8-bit还是16-bit?</p>
<p>感觉BLE要实时传输音频,带宽很吃紧。</p>
cruelfox 发表于 2021-7-19 20:58
语音采样率用的多少?8-bit还是16-bit?
感觉BLE要实时传输音频,带宽很吃紧。
<p>没做实时的,我用16bit 16khz配置。另外我的Python没用好,接收不稳定,要做实时就更不好办了。</p>
xujinxi 发表于 2021-7-19 21:29
没做实时的,我用16bit 16khz配置。另外我的Python没用好,接收不稳定,要做实时就更不好办了。
<p>BLE语音实时传输,RSL10有一套remote mic sample 可以了解一下。时延低至40ms。采样率16kHz使用G722编码</p>
客户专用 发表于 2021-7-27 11:41
BLE语音实时传输,RSL10有一套remote mic sample 可以了解一下。时延低至40ms。采样率16kHz使用G722编码
...
<p>那还不错,周末找时间试试</p>
您好,我的DMIC 一直没有数据,我不太懂硬件,付费求助,我要的是DMIC进,OD出,DMA方式
页:
[1]