基於AliOS Things玩轉智能語音

摘要: 隨着AI技術的進步,智能語音開始將人機交互從手+眼睛的傳統模式中解放出來。帶給人們更便捷、更風趣、更有人情味的體驗,讓被操做對象變得再也不只是一個死板的工具,而更像是一個有生命的助理。「幫我打開空調」,「明天上班須要帶傘嗎」,「快遞到哪了」…在萬物互聯的時代,你的全部需求只須要一句話便能實現。html

點此查看原文:http://click.aliyun.com/m/43694/linux

隨着AI技術的進步,智能語音開始將人機交互從手+眼睛的傳統模式中解放出來。帶給人們更便捷、更風趣、更有人情味的體驗,讓被操做對象變得再也不只是一個死板的工具,而更像是一個有生命的助理。「幫我打開空調」,「明天上班須要帶傘嗎」,「幫我衝100塊錢話費」…在萬物互聯的時代,你的全部需求只須要一句話便能實現。 
AliOS Things 集成的Link Voice SDK便可實現智能語音交互。git

關於阿里智能語音服務github

阿里智能語音服務爲設備提供語音交互能力、豐富的音樂內容、智能家居控制等,並可進行專有設備技能定製(如:語音操控跑步機、按摩椅等設備)。包括:web

通用服務:搜歌、搜欄目、搜電臺、問天氣、百科、四則運算等; 
阿里服務:控制智能家居、充值手機費、天貓超市購物、查詢電費等 (需接入帳號體系,可參考SDS接入); 
私有服務:操控設備、售後電話查詢等 (須要技能定製,簽約時請提供產品需求)。json

功能集成vim

設備接入阿里語音服務,須要集成Alink SDK和Link-Voice SDK,其中Alink SDK爲設備提供接入阿里IoT平臺的鏈接、帳號體系、配網、OTA等能力,而Link-Voice SDK爲設備提供阿里智能語音服務。設備首先要集成了Alink SDK成爲SDS平臺的一個設備,才能經過集成Link-Voice SDK使用阿里智能語音服務。安全

Link-Voice SDK除了依賴Alink爲設備完成平臺接入設備管理外,還須要表格所列模塊完成相應工做。其中websockets用來進行語音數據的交互;opus完成語音錄製的PCM格式到opus格式的轉換(服務端只接收opus格式);cjson用來作json解析;mbedtls爲alink和websockets的底層鏈接進行加密,爲其數據傳輸提供安全保障。websocket

圖片描述

而目前AliOS Things已完成以上表格全部模塊的移植適配工做並將其集成進來,因此咱們直接使用AliOS Things即可完成愉快的智能語音開發。主mcu性能建議:網絡

Flash>=512KB 
RAM>=200KB 
CPU>=180Mhz

單次語音識別流程圖

簡化緩衝處理等細節: 
圖片描述

開發平臺準備

按理知足功能集成章節性能要求,並帶音頻錄製及播放功能的開發板便可。前提是須要完成AliOS Tings的移植適配工做。本文以全志xr871evb(已完成OS適配)爲例進行介紹。

本平臺資源:

cpu:200Mhz cortext-M4f 
RAM:448KB(部分硬件相關code須要加載到ram中運行,實際可用約280KB) 
FLASH:2MB SPI FLASH

環境搭建及代碼編譯

先搭建AliOS開發環境(以linux爲例): 
AliOS-Things-Linux-Environment-Setup

而後從github阿里官方開源庫下載最新版本的AliOS Things源碼(https://github.com/alibaba/AliOS-Things): 
以linux下開發爲例:

git clone git@github.com:alibaba/AliOS-Things.git

切換到主分支:

git checkout master

建議再在主分支上新建一個本身的開發分支:

git checkout –b dev-xxx(yourname):

到目前爲止環境也安裝好了,代碼也準備完畢,只待編譯及燒錄測試。 
編譯link-voice測試例程:

aos make linkvoiceapp@xr871evb xr871=1

代碼燒入:

cd platform/mcu/xr871/tools/

修改串口配置:

vim settings.ini

將串口改爲你板子的串口號,可ls /dev/tty*查看,保存退出。

圖片描述

代碼燒寫,先將全志開發板啓動選擇撥碼開關撥至NO位置,如同所示:

圖片描述

而後執行

./phoenixMC_linux  開始進行代碼燒寫,燒寫完成後再將撥碼開關撥回靠串口位置,重啓。

打開minicom或其餘串口工具監視設備輸入信息,波特率115200。 
功能演示: 
初次上電後先進行配網:

netmgr connect ssid psswd

其中ssid和psswd分別替換爲你無線網絡名及密碼。 
因爲沒有加本地關鍵詞識別功能,因此如今沒次對話須要按鍵觸發。 
根據終端提示,待網絡鏈接後,出現如下提示時: 
圖片描述
按按鍵2(AK2)觸發語音識別功能。

圖片描述
此時對着開發板說話,語音數據被編碼、上傳到雲端、識別成功後返回相應信息,識別失敗亦有相應提示。

示例: 
1:明天上班須要帶傘嗎? 
2.給我講個鬼故事。 
3.推薦一部懸疑電影。 
4.把空調打開。

如下爲一個小的演示視頻: 
http://v.youku.com/v_show/id_XMzQ1NjQ4MjIyOA==.html?spm=a2h3j.8428770.3416059.1

API介紹

1)初始化

int pal_init(const struct pal_config *config);

說明: SDK初始化,只需調用一次。 
入參:config結構體向SDK傳遞必須的參數 
返回:0成功;-1失敗

2)銷燬

void pal_destroy();

說明:SDK銷燬,釋放資源。 
入參:無 
返回:無

3)獲取SDK版本

int pal_version();

說明:返回SDK的版本號 
入參:無 
返回:SDK版本號

4)設置日誌級別

void pal_set_log_level(int level);

說明:設置SDK的日誌級別。調試階段可設置爲PAL_LOG_LEVEL_DEBUG方便調試問題,調試穩定以後上線前把日誌級別設置爲PAL_LOG_LEVEL_ERROR。 
入參:level爲SDK的日誌級別 
返回:無

5)設置環境

void pal_set_env(int env);

說明:設置SDK的環境,默認是PAL_ENV_RELEASE,在廠商外部環境下能夠鏈接阿里線上環境。廠商無需使用這個接口。 
入參:env爲SDK的環境 
返回: 無

6)廠商播放器向SDK上報消息

int pal_notify_msg(const char *msg);

說明:廠商的播放器的狀態或者按鍵事件須要按照Link_Voice_SDK_播控協議_v1.0.0.xlsx定義的json格式上報給SDK與上層應用同步狀態。 
入參:msg爲廠商播放器須要向SDK傳遞的事件消息 
返回:0成功;-1失敗

7)廠商播放器經過SDK透傳ALink消息

int pal_post_alink_msg(const char *msg);

說明:SDK初始化過程會把ALink進行初始化,與阿里平臺保持物聯長鏈接,廠商設備須要上報給ALink的消息可經過該接口上報,SDK對該消息進行透傳上報給ALink服務端。 
入參:msg爲廠商須要經過SDK透傳給ALink進行上報的消息,格式按照ALink定義的消息格式 
返回:0成功;-1失敗

8)開始一次語音識別

int pal_asr_start();

說明:設備經過按鍵或者遠場喚醒觸發語音識別時調用。 
入參:無 
返回:0成功;-1失敗;

9)發送語音數據

int pal_asr_send_buffer(const char *buffer, int buffer_len);

說明:該接口要在調用pal_asr_start成功了以後調用,發送語音數據。若是是PCM格式的數據,則要求每次640字節。若是返回PAL_VAD_STATUS_STOP則爲雲端檢測到語音結束了,廠商這時候能夠調用pal_asr_stop或pal_asr_stop_async來獲本次識別結果。 
入參:buffer語音數據,buffer_len語音數據長度,字節 
返回:返回雲端檢測到的VAD狀態

10)結束本次語音識別(同步接口)

struct pal_rec_result* pal_asr_stop();

說明:pal_rec_result結構體返回本次語音識別的結果,同步的接口。結構體裏的字段status表示本次語音識別的狀態;should_restore_player_status表示廠商播放器處理完本次語音識別事件以後是否恢復以前的狀態,0是不恢復,1是恢復;asr_result表示ASR識別的文本;task_status表示語音識別任務狀態,PAL_REC_TASK_STATUS_END表示單次語音識別會話結束,PAL_REC_TASK_STATUS_WAITING表示多輪對話,應當播完TTS以後自動進入拾音狀態,開始一次新的語音識別。 
入參:無 
返回:語音識別結果的結構體

11)結束本次語音識別(異步接口)

void pal_asr_stop_async(pal_asr_callback callback, void *user);

說明:異步返回的接口,功能與pal_asr_stop同樣。 
入參:callback註冊的回調函數,用於返回語音識別結果;user用戶自定義指針,在callback中會回傳給用戶 
返回:無

12)取消本次語音識別

void pal_asr_cancel();

說明:取消本次的語音識別。 
入參:無 
返回:無

13)銷燬語音識別結果

void pal_rec_result_destroy(struct pal_rec_result *result);

說明:pal_asr_stop和pal_asr_stop_async返回的語音識別結果,須要經過該接口來釋放資源。 
入參:result須要銷燬的結果 
返回:無

14)文本轉語音(同步接口)

struct pal_rec_result* pal_get_tts(const char *text);

說明:提供文本轉語音的功能。返回的結果pal_rec_result須要經過pal_rec_result_destroy銷燬。 
入參:text須要轉換的文本 
返回:返回的結構體,文本轉語音的結果在tts字段中,是一個可播放的url。

更多

關於AliOS Things更多信息,請參考https://github.com/alibaba/AliOS-Things/wiki 
關於Link Voice的更多信息,請參考https://iot.aliyun.com/product/voice?spm=a2c2j.8959409.5007732.14.666018deKqxNU7

識別如下二維碼,閱讀更多幹貨 
圖片描述

相關文章
相關標籤/搜索