基于AliOS Things玩转智能语音
摘要: 隨著AI技術的進步,智能語音開始將人機交互從手+眼睛的傳統模式中解放出來。帶給人們更便捷、更風趣、更有人情味的體驗,讓被操作對象變得不再只是一個死板的工具,而更像是一個有生命的助理。“幫我打開空調”,“明天上班需要帶傘嗎”,“快遞到哪了”…在萬物互聯的時代,你的所有需求只需要一句話便能實現。
點此查看原文:http://click.aliyun.com/m/43694/
隨著AI技術的進步,智能語音開始將人機交互從手+眼睛的傳統模式中解放出來。帶給人們更便捷、更風趣、更有人情味的體驗,讓被操作對象變得不再只是一個死板的工具,而更像是一個有生命的助理。“幫我打開空調”,“明天上班需要帶傘嗎”,“幫我沖100塊錢話費”…在萬物互聯的時代,你的所有需求只需要一句話便能實現。
AliOS Things 集成的Link Voice SDK即可實現智能語音交互。
關于阿里智能語音服務
阿里智能語音服務為設備提供語音交互能力、豐富的音樂內容、智能家居控制等,并可進行專有設備技能定制(如:語音操控跑步機、按摩椅等設備)。包括:
通用服務:搜歌、搜欄目、搜電臺、問天氣、百科、四則運算等;
阿里服務:控制智能家居、充值手機費、天貓超市購物、查詢電費等 (需接入賬號體系,可參考SDS接入);
私有服務:操控設備、售后電話查詢等 (需要技能定制,簽約時請提供產品需求)。
功能集成
設備接入阿里語音服務,需要集成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的底層連接進行加密,為其數據傳輸提供安全保障。
而目前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 checkout master建議再在主分支上新建一個自己的開發分支:
git checkout –b dev-xxx(yourname):到目前為止環境也安裝好了,代碼也準備完畢,只待編譯及燒錄測試。
編譯link-voice測試例程:
代碼燒入:
cd platform/mcu/xr871/tools/修改串口配置:
vim settings.ini將串口改成你板子的串口號,可ls /dev/tty*查看,保存退出。
代碼燒寫,先將全志開發板啟動選擇撥碼開關撥至NO位置,如同所示:
然后執行
./phoenixMC_linux 開始進行代碼燒寫,燒寫完成后再將撥碼開關撥回靠串口位置,重啟。打開minicom或其他串口工具監視設備輸入信息,波特率115200。
功能演示:
初次上電后先進行配網:
其中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
識別以下二維碼,干貨
總結
以上是生活随笔為你收集整理的基于AliOS Things玩转智能语音的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊聊代码整洁之道
- 下一篇: 阿里云发布vSphere虚拟机备份服务