摘要: 隨着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
識別如下二維碼,閱讀更多幹貨