随着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:192Mhz cortext-M4f
RAM:448KB(部分硬體相關code需要加載到ram中運作,實際可用約280KB)
FLASH:2MB SPI FLASH
先搭建AliOS開發環境(以linux為例):
AliOS-Things-Linux-Environment-Setup
以linux下開發為例:
切換到主分支:
建議再在主分支上建立一個自己的開發分支:
到目前為止環境也安裝好了,代碼也準備完畢,隻待編譯及燒錄測試。
編譯link-voice測試例程:
代碼燒入:
修改序列槽配置:
将序列槽改成你闆子的序列槽号,可ls /dev/tty*檢視,儲存退出。
代碼燒寫,先将全志開發闆啟動選擇撥碼開關撥至NO位置,如同所示:
然後執行
打開minicom或其他序列槽工具監視裝置輸入資訊,波特率115200。
功能示範:
初次上電後先進行配網:
其中ssid和psswd分别替換為你無線網絡名及密碼。
由于沒有加本地關鍵詞識别功能,是以現在沒次對話需要按鍵觸發。
根據終端提示,待網絡連接配接後,出現以下提示時:
按按鍵2(AK2)觸發語音識别功能。
此時對着開發闆說話,語音資料被編碼、上傳到雲端、識别成功後傳回相應資訊,識别失敗亦有相應提示。
示例:
1:明天上班需要帶傘嗎?
2.給我講個鬼故事。
3.推薦一部懸疑電影。
4.把空調打開。
以下為一個小的示範視訊:
<a href="http://v.youku.com/v_show/id_XMzQ1NjQ4MjIyOA==.html?spm=a2h3j.8428770.3416059.1">http://v.youku.com/v_show/id_XMzQ1NjQ4MjIyOA==.html?spm=a2h3j.8428770.3416059.1</a>
<code>int pal_init(const struct pal_config *config);</code>
說明: SDK初始化,隻需調用一次。
入參:<code>config</code>結構體向SDK傳遞必須的參數
傳回:0成功;-1失敗
<code>void pal_destroy();</code>
說明:SDK銷毀,釋放資源。
入參:無
傳回:無
<code>int pal_version();</code>
說明:傳回SDK的版本号
傳回:SDK版本号
<code>void pal_set_log_level(int level);</code>
說明:設定SDK的日志級别。調試階段可設定為PAL_LOG_LEVEL_DEBUG友善調試問題,調試穩定之後上線前把日志級别設定為PAL_LOG_LEVEL_ERROR。
入參:<code>level</code>為SDK的日志級别
<code>void pal_set_env(int env);</code>
說明:設定SDK的環境,預設是PAL_ENV_RELEASE,在廠商外部環境下可以連接配接阿裡線上環境。廠商無需使用這個接口。
入參:<code>env</code>為SDK的環境
傳回: 無
<code>int pal_notify_msg(const char *msg);</code>
說明:廠商的播放器的狀态或者按鍵事件需要按照<code>Link_Voice_SDK_播控協定_v1.0.0.xlsx</code>定義的json格式上報給SDK與上層應用同步狀态。
入參:<code>msg</code>為廠商播放器需要向SDK傳遞的事件消息
<code>int pal_post_alink_msg(const char *msg);</code>
說明:SDK初始化過程會把ALink進行初始化,與阿裡平台保持物聯長連接配接,廠商裝置需要上報給ALink的消息可通過該接口上報,SDK對該消息進行透傳上報給ALink服務端。
入參:<code>msg</code>為廠商需要通過SDK透傳給ALink進行上報的消息,格式按照ALink定義的消息格式
<code>int pal_asr_start();</code>
說明:裝置通過按鍵或者遠場喚醒觸發語音識别時調用。
傳回:0成功;-1失敗;
<code>int pal_asr_send_buffer(const char *buffer, int buffer_len);</code>
說明:該接口要在調用pal_asr_start成功了之後調用,發送語音資料。如果是PCM格式的資料,則要求每次640位元組。如果傳回PAL_VAD_STATUS_STOP則為雲端檢測到語音結束了,廠商這時候可以調用pal_asr_stop或pal_asr_stop_async來獲本次識别結果。
入參:<code>buffer</code>語音資料,<code>buffer_len</code>語音資料長度,位元組
傳回:傳回雲端檢測到的VAD狀态
<code>struct pal_rec_result* pal_asr_stop();</code>
說明: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之後自動進入拾音狀态,開始一次新的語音識别。
傳回:語音識别結果的結構體
<code>void pal_asr_stop_async(pal_asr_callback callback, void *user);</code>
說明:異步傳回的接口,功能與pal_asr_stop一樣。
入參:<code>callback</code>注冊的回調函數,用于傳回語音識别結果;<code>user</code>使用者自定義指針,在<code>callback</code>中會回傳給使用者
<code>void pal_asr_cancel();</code>
說明:取消本次的語音識别。
<code>void pal_rec_result_destroy(struct pal_rec_result *result);</code>
說明:pal_asr_stop和pal_asr_stop_async傳回的語音識别結果,需要通過該接口來釋放資源。
入參:<code>result</code>需要銷毀的結果
<code>struct pal_rec_result* pal_get_tts(const char *text);</code>
說明:提供文本轉語音的功能。傳回的結果pal_rec_result需要通過pal_rec_result_destroy銷毀。
入參:<code>text</code>需要轉換的文本
傳回:傳回的結構體,文本轉語音的結果在tts字段中,是一個可播放的url。