基于AliOS Things玩转智能语音
摘要: 隨著AI技術(shù)的進(jìn)步,智能語音開始將人機(jī)交互從手+眼睛的傳統(tǒng)模式中解放出來。帶給人們更便捷、更風(fēng)趣、更有人情味的體驗,讓被操作對象變得不再只是一個死板的工具,而更像是一個有生命的助理。“幫我打開空調(diào)”,“明天上班需要帶傘嗎”,“快遞到哪了”…在萬物互聯(lián)的時代,你的所有需求只需要一句話便能實現(xiàn)。
點(diǎn)此查看原文:http://click.aliyun.com/m/43694/
隨著AI技術(shù)的進(jìn)步,智能語音開始將人機(jī)交互從手+眼睛的傳統(tǒng)模式中解放出來。帶給人們更便捷、更風(fēng)趣、更有人情味的體驗,讓被操作對象變得不再只是一個死板的工具,而更像是一個有生命的助理。“幫我打開空調(diào)”,“明天上班需要帶傘嗎”,“幫我沖100塊錢話費(fèi)”…在萬物互聯(lián)的時代,你的所有需求只需要一句話便能實現(xiàn)。
AliOS Things 集成的Link Voice SDK即可實現(xiàn)智能語音交互。
關(guān)于阿里智能語音服務(wù)
阿里智能語音服務(wù)為設(shè)備提供語音交互能力、豐富的音樂內(nèi)容、智能家居控制等,并可進(jìn)行專有設(shè)備技能定制(如:語音操控跑步機(jī)、按摩椅等設(shè)備)。包括:
通用服務(wù):搜歌、搜欄目、搜電臺、問天氣、百科、四則運(yùn)算等;
阿里服務(wù):控制智能家居、充值手機(jī)費(fèi)、天貓超市購物、查詢電費(fèi)等 (需接入賬號體系,可參考SDS接入);
私有服務(wù):操控設(shè)備、售后電話查詢等 (需要技能定制,簽約時請?zhí)峁┊a(chǎn)品需求)。
功能集成
設(shè)備接入阿里語音服務(wù),需要集成Alink SDK和Link-Voice SDK,其中Alink SDK為設(shè)備提供接入阿里IoT平臺的連接、賬號體系、配網(wǎng)、OTA等能力,而Link-Voice SDK為設(shè)備提供阿里智能語音服務(wù)。設(shè)備首先要集成了Alink SDK成為SDS平臺的一個設(shè)備,才能通過集成Link-Voice SDK使用阿里智能語音服務(wù)。
Link-Voice SDK除了依賴Alink為設(shè)備完成平臺接入設(shè)備管理外,還需要表格所列模塊完成相應(yīng)工作。其中websockets用來進(jìn)行語音數(shù)據(jù)的交互;opus完成語音錄制的PCM格式到opus格式的轉(zhuǎn)換(服務(wù)端只接收opus格式);cjson用來做json解析;mbedtls為alink和websockets的底層連接進(jìn)行加密,為其數(shù)據(jù)傳輸提供安全保障。
而目前AliOS Things已完成以上表格所有模塊的移植適配工作并將其集成進(jìn)來,所以我們直接使用AliOS Things便可完成愉快的智能語音開發(fā)。主mcu性能建議:
Flash>=512KB
RAM>=200KB
CPU>=180Mhz
單次語音識別流程圖
簡化緩沖處理等細(xì)節(jié):
開發(fā)平臺準(zhǔn)備
按理滿足功能集成章節(jié)性能要求,并帶音頻錄制及播放功能的開發(fā)板即可。前提是需要完成AliOS Tings的移植適配工作。本文以全志xr871evb(已完成OS適配)為例進(jìn)行介紹。
本平臺資源:
cpu:200Mhz cortext-M4f
RAM:448KB(部分硬件相關(guān)code需要加載到ram中運(yùn)行,實際可用約280KB)
FLASH:2MB SPI FLASH
環(huán)境搭建及代碼編譯
先搭建AliOS開發(fā)環(huán)境(以linux為例):
AliOS-Things-Linux-Environment-Setup
然后從github阿里官方開源庫下載最新版本的AliOS Things源碼(https://github.com/alibaba/AliOS-Things):
以linux下開發(fā)為例:
切換到主分支:
git checkout master建議再在主分支上新建一個自己的開發(fā)分支:
git checkout –b dev-xxx(yourname):到目前為止環(huán)境也安裝好了,代碼也準(zhǔn)備完畢,只待編譯及燒錄測試。
編譯link-voice測試?yán)?#xff1a;
代碼燒入:
cd platform/mcu/xr871/tools/修改串口配置:
vim settings.ini將串口改成你板子的串口號,可ls /dev/tty*查看,保存退出。
代碼燒寫,先將全志開發(fā)板啟動選擇撥碼開關(guān)撥至NO位置,如同所示:
然后執(zhí)行
./phoenixMC_linux 開始進(jìn)行代碼燒寫,燒寫完成后再將撥碼開關(guān)撥回靠串口位置,重啟。打開minicom或其他串口工具監(jiān)視設(shè)備輸入信息,波特率115200。
功能演示:
初次上電后先進(jìn)行配網(wǎng):
其中ssid和psswd分別替換為你無線網(wǎng)絡(luò)名及密碼。
由于沒有加本地關(guān)鍵詞識別功能,所以現(xiàn)在沒次對話需要按鍵觸發(fā)。
根據(jù)終端提示,待網(wǎng)絡(luò)連接后,出現(xiàn)以下提示時:
按按鍵2(AK2)觸發(fā)語音識別功能。
此時對著開發(fā)板說話,語音數(shù)據(jù)被編碼、上傳到云端、識別成功后返回相應(yīng)信息,識別失敗亦有相應(yīng)提示。
示例:
1:明天上班需要帶傘嗎?
2.給我講個鬼故事。
3.推薦一部懸疑電影。
4.把空調(diào)打開。
以下為一個小的演示視頻:
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初始化,只需調(diào)用一次。
入?yún)?#xff1a;config結(jié)構(gòu)體向SDK傳遞必須的參數(shù)
返回:0成功;-1失敗
2)銷毀
void pal_destroy();
說明:SDK銷毀,釋放資源。
入?yún)?#xff1a;無
返回:無
3)獲取SDK版本
int pal_version();
說明:返回SDK的版本號
入?yún)?#xff1a;無
返回:SDK版本號
4)設(shè)置日志級別
void pal_set_log_level(int level);
說明:設(shè)置SDK的日志級別。調(diào)試階段可設(shè)置為PAL_LOG_LEVEL_DEBUG方便調(diào)試問題,調(diào)試穩(wěn)定之后上線前把日志級別設(shè)置為PAL_LOG_LEVEL_ERROR。
入?yún)?#xff1a;level為SDK的日志級別
返回:無
5)設(shè)置環(huán)境
void pal_set_env(int env);
說明:設(shè)置SDK的環(huán)境,默認(rèn)是PAL_ENV_RELEASE,在廠商外部環(huán)境下可以連接阿里線上環(huán)境。廠商無需使用這個接口。
入?yún)?#xff1a;env為SDK的環(huán)境
返回: 無
6)廠商播放器向SDK上報消息
int pal_notify_msg(const char *msg);
說明:廠商的播放器的狀態(tài)或者按鍵事件需要按照Link_Voice_SDK_播控協(xié)議_v1.0.0.xlsx定義的json格式上報給SDK與上層應(yīng)用同步狀態(tài)。
入?yún)?#xff1a;msg為廠商播放器需要向SDK傳遞的事件消息
返回:0成功;-1失敗
7)廠商播放器通過SDK透傳ALink消息
int pal_post_alink_msg(const char *msg);
說明:SDK初始化過程會把ALink進(jìn)行初始化,與阿里平臺保持物聯(lián)長連接,廠商設(shè)備需要上報給ALink的消息可通過該接口上報,SDK對該消息進(jìn)行透傳上報給ALink服務(wù)端。
入?yún)?#xff1a;msg為廠商需要通過SDK透傳給ALink進(jìn)行上報的消息,格式按照ALink定義的消息格式
返回:0成功;-1失敗
8)開始一次語音識別
int pal_asr_start();
說明:設(shè)備通過按鍵或者遠(yuǎn)場喚醒觸發(fā)語音識別時調(diào)用。
入?yún)?#xff1a;無
返回:0成功;-1失敗;
9)發(fā)送語音數(shù)據(jù)
int pal_asr_send_buffer(const char *buffer, int buffer_len);
說明:該接口要在調(diào)用pal_asr_start成功了之后調(diào)用,發(fā)送語音數(shù)據(jù)。如果是PCM格式的數(shù)據(jù),則要求每次640字節(jié)。如果返回PAL_VAD_STATUS_STOP則為云端檢測到語音結(jié)束了,廠商這時候可以調(diào)用pal_asr_stop或pal_asr_stop_async來獲本次識別結(jié)果。
入?yún)?#xff1a;buffer語音數(shù)據(jù),buffer_len語音數(shù)據(jù)長度,字節(jié)
返回:返回云端檢測到的VAD狀態(tài)
10)結(jié)束本次語音識別(同步接口)
struct pal_rec_result* pal_asr_stop();
說明:pal_rec_result結(jié)構(gòu)體返回本次語音識別的結(jié)果,同步的接口。結(jié)構(gòu)體里的字段status表示本次語音識別的狀態(tài);should_restore_player_status表示廠商播放器處理完本次語音識別事件之后是否恢復(fù)之前的狀態(tài),0是不恢復(fù),1是恢復(fù);asr_result表示ASR識別的文本;task_status表示語音識別任務(wù)狀態(tài),PAL_REC_TASK_STATUS_END表示單次語音識別會話結(jié)束,PAL_REC_TASK_STATUS_WAITING表示多輪對話,應(yīng)當(dāng)播完TTS之后自動進(jìn)入拾音狀態(tài),開始一次新的語音識別。
入?yún)?#xff1a;無
返回:語音識別結(jié)果的結(jié)構(gòu)體
11)結(jié)束本次語音識別(異步接口)
void pal_asr_stop_async(pal_asr_callback callback, void *user);
說明:異步返回的接口,功能與pal_asr_stop一樣。
入?yún)?#xff1a;callback注冊的回調(diào)函數(shù),用于返回語音識別結(jié)果;user用戶自定義指針,在callback中會回傳給用戶
返回:無
12)取消本次語音識別
void pal_asr_cancel();
說明:取消本次的語音識別。
入?yún)?#xff1a;無
返回:無
13)銷毀語音識別結(jié)果
void pal_rec_result_destroy(struct pal_rec_result *result);
說明:pal_asr_stop和pal_asr_stop_async返回的語音識別結(jié)果,需要通過該接口來釋放資源。
入?yún)?#xff1a;result需要銷毀的結(jié)果
返回:無
14)文本轉(zhuǎn)語音(同步接口)
struct pal_rec_result* pal_get_tts(const char *text);
說明:提供文本轉(zhuǎn)語音的功能。返回的結(jié)果pal_rec_result需要通過pal_rec_result_destroy銷毀。
入?yún)?#xff1a;text需要轉(zhuǎn)換的文本
返回:返回的結(jié)構(gòu)體,文本轉(zhuǎn)語音的結(jié)果在tts字段中,是一個可播放的url。
更多
關(guān)于AliOS Things更多信息,請參考https://github.com/alibaba/AliOS-Things/wiki
關(guān)于Link Voice的更多信息,請參考https://iot.aliyun.com/product/voice?spm=a2c2j.8959409.5007732.14.666018deKqxNU7
識別以下二維碼,干貨
總結(jié)
以上是生活随笔為你收集整理的基于AliOS Things玩转智能语音的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊聊代码整洁之道
- 下一篇: 阿里云发布vSphere虚拟机备份服务