1.背景介紹
老人和小孩子獨(dú)自在家的時(shí)候如果遇到緊急情況,通過(guò)撥打電話或者微信的方式通知家人存在操作不便的問(wèn)題。例如,如果老人摔倒了手機(jī)很可能不在身邊,對(duì)小孩來(lái)說(shuō)手機(jī)的操作又過(guò)于復(fù)雜。針對(duì)這種情況,研發(fā)一種主動(dòng)語(yǔ)音上報(bào)的系統(tǒng),語(yǔ)音實(shí)時(shí)時(shí)別人的求救聲,然后通過(guò)網(wǎng)絡(luò)發(fā)送信息告知家人。
2.硬件選型
在該語(yǔ)音主動(dòng)告警系統(tǒng)中,需要語(yǔ)音時(shí)別模塊和網(wǎng)絡(luò)告警模塊。xr806有豐富的外圍接口,能夠采集外部多種傳感器的數(shù)據(jù),功耗低,可以采用移動(dòng)電源供電,支持wifi和bt,體積小,可以靈活部署于房間的各個(gè)角落。語(yǔ)音模塊選用天問(wèn)的ASRPRO模塊,該模塊集成度高,支持模塊化編程,識(shí)別率高的特點(diǎn)。
硬件連接框圖如下所示,Speech Module支持uart通信和gpio信號(hào),本次實(shí)驗(yàn)選用gpio通信,即當(dāng)識(shí)別到特定詞匯時(shí)拉高gpio向xr806發(fā)送信后,xr806接收到信號(hào)后發(fā)送信息給mqtt client。
硬件實(shí)物鏈接如下圖所示
3.軟件實(shí)現(xiàn)
3.1 軟件流程
軟件整體的流程如下圖所示。xr806完成初始化以后,連接網(wǎng)絡(luò),建立mqtt連接等待語(yǔ)音模塊的輸入,接收到信號(hào)后,發(fā)送mqtt信息給broken,訂閱該topic的所有client都會(huì)收到該告警信號(hào)。語(yǔ)音試別模塊上電完成初始化以后輸入語(yǔ)音提示信息并循壞等待語(yǔ)音的輸入,匹配到對(duì)應(yīng)語(yǔ)音后拉高gpio發(fā)送信號(hào)給x806,延遲一秒下拉gpio,并輸入提示語(yǔ)音。
3.2 語(yǔ)音識(shí)別(ASR)的實(shí)現(xiàn)
天問(wèn)的語(yǔ)音試別模塊支持類似Scrach的模塊化圖形編程,程序代碼如下。
程序編寫完成后先生成模型,然后編譯下載即可。
3.3 XR806主機(jī)編程
3.3.1 工程的建立
3.3.2 代碼開發(fā)
官方SDK中提供了參考,代碼位于xr806_sdk/project/example
,本次實(shí)現(xiàn)主要參考gpio和mqtt兩個(gè)文件,基于mqtt的代碼完成整體工程的開發(fā)。
官方例程是采用的阿里云的mqtt broken服務(wù),使用前需要注冊(cè),本次開發(fā)采用EMQX提供的免費(fèi)的公共MQTT服務(wù)器,相關(guān)信息如下:
按照此信息修改代碼的定義:
#define MQTT_DEMO_CLIENT_ID "xr806-mqtt"
#define MQTT_DEMO_HOST_NAME "mqtt://broker.emqx.io"
#define MQTT_DEMO_PORT "1883"
// #define MQTT_DEMO_USERNAME "xr806_senor_set0&vo84Hm3xbUj"
// #define MQTT_DEMO_PASSWORD "4f9ebb2143f01e4489133c1ea55051fbbfc4c44e"
#define MQTT_DEMO_TOPIC "/topic/xr806-sos"
客戶端采用EMQX免費(fèi)的MQTTX,該工具跨平臺(tái)且提供網(wǎng)頁(yè)版。手機(jī)端可以搜到MQTT助手等類似工具。
GPIO直接套用實(shí)例中的即可,需要完成默認(rèn)func等配置的初始化:
static void gpio_input_init(void)
{
GPIO_InitParam param;
param.driving = GPIO_DRIVING_LEVEL_1;
param.mode = GPIOx_Pn_F0_INPUT;
param.pull = GPIO_PULL_NONE;
HAL_GPIO_Init(GPIO_INPUT_PORT, GPIO_INPUT_PIN, ¶m);
}
static uint8_t gpio_input_read(void)
{
return (uint8_t)HAL_GPIO_ReadPin(GPIO_INPUT_PORT, GPIO_INPUT_PIN);
}
修改mqtt_demo_fun
的while(1)
代碼塊,先判斷采集到的gpio信號(hào),然后再publish信息,相關(guān)修改如下:
while (1) {
if (gpio_input_read()) {
/* publish message to topic */
mqtt_demo_publish(MQTT_DEMO_TOPIC, MQTT_DEMO_MSG_TEXT);
ret = MQTTYield(&mqtt_demo_client, 300);
if (ret != 0) {
printf("mqtt yield err, ret:%dn", ret);
reconnect:
printf("mqtt reconnectn");
mqtt_demo_disconnect();
ret = mqtt_demo_connect(MQTT_DEMO_HOST_NAME, MQTT_DEMO_PORT);
if (ret != 0) {
reconnect_times++;
if (reconnect_times > 5)
goto exit;
OS_MSleep(5000); //5s
goto reconnect;
}
}
}
OS_MSleep(10); //10ms
}
3.3.3 編譯執(zhí)行
編譯步驟可以參考工程建立章節(jié)提供的鏈接,官方實(shí)例,mqtt的啟動(dòng)依賴于網(wǎng)絡(luò)的建立,因此系統(tǒng)啟動(dòng)后需要先建立網(wǎng)絡(luò),建立網(wǎng)絡(luò)的命令如下:
# net sta config [ssid] [password]
# net sta enable
系統(tǒng)啟動(dòng)以后,說(shuō)一句“救命”,XR806就會(huì)發(fā)送"SOS"信息到broken,同時(shí)語(yǔ)音試別模塊會(huì)發(fā)出“我來(lái)了”的提示信息。訂閱/topic/xr806-sos
該topic的Client會(huì)收到sos信息,如下:
4.總結(jié)
首先感謝極術(shù)社區(qū)和全志科技組織的這次活動(dòng),能夠有機(jī)會(huì)試用到功能如此強(qiáng)悍的芯片。通過(guò)本次試用一方面對(duì)XR806芯片本身的功能和開發(fā)流程有了更深入的了解,另一方面也接觸到了FreeRtos的開發(fā)。相對(duì)于鴻蒙liteos SDK,F(xiàn)reeRtos的SDK使用起來(lái)方便了很多,這也看出了廠商的用心。因?yàn)闀r(shí)間的原因XR806的很多功能還沒(méi)有來(lái)得及挖掘,接下來(lái)有時(shí)間會(huì)利用這顆芯片做一些更有意思的設(shè)計(jì)。
-
傳感器
+關(guān)注
關(guān)注
2553文章
51395瀏覽量
756598 -
ASR
+關(guān)注
關(guān)注
2文章
43瀏覽量
18804 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62397 -
GPIO
+關(guān)注
關(guān)注
16文章
1216瀏覽量
52379 -
MQTT協(xié)議
+關(guān)注
關(guān)注
0文章
98瀏覽量
5485
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論