安信可離線語音VC01/02:硬件規格書、開發資料、燒錄工具、應用開發
安信可離線語音模組 VC-01、VC-02 系列教程 【基礎認知篇】
安信可離線語音模組 VC-01、VC-02 系列教程 【快速上手篇】
安信可離線語音模組 VC-01、VC-02 系列教程 【中級入門篇】
安信可離線語音模組 VC-01、VC-02 系列教程 【高級進階篇】
安信可離線語音模組 VC-01、VC-02 系列教程 【二次開發篇】虛擬開發環境搭建和分享
安信可離線語音模組 VC-01、VC-02 系列教程 【二次開發篇】事件和GPIO控制
安信可離線語音模組 VC-01、VC-02 系列教程 【二次開發篇】PWM輸出
安信可離線語音模組 VC-01、VC-02 系列教程 【二次開發篇】串口輸出
安信可離線語音模組 VC-01、VC-02 系列教程 【二次開發篇】SDK音頻替換失敗記錄過程
安信可離線語音模組 VC-01、VC-02 系列教程 【二次開發篇】自定義音頻播放控制
簡介
在上一篇文章中,我們已經成功搭建好了VC系列的Linux開發環境,使用VScode進行了遠程連接,成功進入到了下載后的SDK固件源碼中,并且進行了編譯等操作。
在本章我將對SDK中常見的模塊進行解析,并且帶著大家編譯一個通過安信可語音平臺生成固件中的語音喚醒或者控制事件在源碼中進行自定義的操作(即在安信可語音平臺生成語音喚醒詞和控制命令的時候,并不指定控制行為而是通過在SDK里指定控制行為)。
準備工作
首先給大家看一下默認生成的固件配置信息(來自安信可語音平臺)

下圖為配置的控制行為。

可以從以上兩個圖中看到, 我們僅僅是配置了默認的喚醒和1個控制行為。 但是這個控制行為并沒有對應的命令(無法點亮LED燈或者關閉LED燈)。
之后我們生成對應的SDK,并把它下載到虛擬機中(替換上一個帖子中下載的SDK,在文末會附上本次生成的SDK文件)。

SDK重要組件介紹
1、首先看
~/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/tools/scripts下的tones 目錄和 wav_tones 目錄。

這兩個目錄主要保存安信可語音平臺生成的音頻文件。
即所有的音頻輸出(喚醒詞回復詞等),在程序編譯后,其音頻文件會被編譯成PCM文件,然后由VC-01/ 02進行播放。
2、開發板PIN初始化配置信息
/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/tools/scripts/custom_config.json

當前的文件主要記錄了在安信可語音平臺中配置的PIN的初始化信息。
如下圖所示(不建議在代碼中配置, 推薦使用安信可語音平臺進行)。

3、cmd_reply_data.json 文件,
位于/home/vc02/Downloads/uni_hb_m_solution/unione_lite
_app_hb_m/tools/scripts/ 下

拿喚醒詞“你好小美”舉例子, 這里主要的JSON key 有PCM, CMD等。
PCM決定當前的命令詞觸發的時候將會播放哪些音樂
CMD則是做為對應喚醒事件的KEY(稍后會解釋這個是什么意思)
4、二次開發集成的example配置文件user_config.h 文件,
位于 ~/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/inc

在默認的SDK中,其開啟的Macro 為 USER_DEMO_AUTO_GPIO 。 所以用戶的自定義功能將會使用example下的hb_auto_gpio.c 文件作為額外自定義功能。
以此類推,如果開啟的是USER_DEMO_BUZZER 宏, 那么開啟的Demo則為
/home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/src/examples
下的hb_timer_buzzer.c。

而當前開發板所有支持的二次開發的庫函數的定義則都
在 /home/vc02/Downloads/uni_hb_m_solution/unione_lite_app_hb_m/user/inc 目錄下。

這里所有庫函數對應的例程都可以從example下找到。
5、user_event.h 位于inc 目錄下, 此文件記錄了所有開發板中可以觸發的事件。 比如說識別到“”你好小美“或者是識別到對應的命令。

typedef enum {
USER_INVALID_EVENT = 0, ///< 錯誤的事件類型
USER_AUDIO_PLAY_START, ///< 音頻開始播放時發送
USER_AUDIO_PLAY_END, ///< 音頻播放完畢或被停止時發送
USER_CUSTOM_SETTING, ///< 識別到客戶自定義的識別詞時發送
USER_VOLUME_SETTING, ///< 識別到音量調節指令時發送
USER_GOTO_SLEEPING, ///< 進入待喚醒狀態時發送
USER_GOTO_AWAKENED, ///< 進入識別狀態(已喚醒)時發送
USER_EVENT_MAX
}USER_EVENT_TYPE;
上述列舉了所有可以被用戶訂閱的事件,當對應的事件觸發的時候,也會觸發事件的callback function。
/** @brief 事件內容,共用體,根據事件類型具體處理*/
typedef union {
event_audio_play_t audio_play; ///< 對應USER_AUDIO_PLAY_START事件
event_audio_end_t audio_end; ///< 對應USER_AUDIO_PLAY_END事件
event_custom_setting_t custom_setting; ///< 對應USER_CUSTOM_SETTING事件
event_volume_setting_t voluem_setting; ///< 對應USER_VOLUME_SETTING事件
event_goto_sleeping_t goto_sleeping; ///< 對應USER_GOTO_SLEEPING事件
event_goto_awakend_t goto_awakend; ///< 對應USER_GOTO_AWAKENED事件
}user_event_context_t;
針對于上述事件的每一個事件, 其具備對應的事件內容。 比如說用戶訂閱了USER_GOTO_AWAKENED 事件。
那么便可以從user_event_context_t 的 goto_awakend 捕獲到對應的事件內容,而對應事件的內容信息則被下述結構體定義,只舉例喚醒事件(其他事件同理)。
typedef struct {
EVENT_TRIGGER trigger; ///< 觸發來源
char *cmd; ///< 命令詞意圖,對應UDP平臺上用戶定義腳本中的action
char *word_str; ///< 識別到的命令詞
char *reply_files; ///< 回復語列表[1, 2, 3],對應UDP平臺上用戶定義腳本中的回復語列表,在pcm_map.txt中可以找到對應關系
}event_goto_awakend_t;
這樣就可以通過CMD來獲取到對應的命令!
這里可以解釋在 3- cmd_reply_data.json 文件中所說明的JSON KEY對應Value的作用。即用戶可以根據對應的事件,判斷對應的CMD來自定義行為,其支持的行為為所有Inc文件夾下包含的庫函數。
GPIO控制
(通過使用喚醒詞“你好小美”并關閉LED,使用命令詞“打開臺燈”打開LED)
明白原理之后, 我們便可以開始著手來開發GPIO功能, 即通過使用喚醒詞:你好小美。關閉LED,使用命令詞:打開臺燈。打開LED。
需要注意的是: "你好小美" 是屬于喚醒事件, 而打開臺燈是屬于命令事件。 打開臺燈必須在你好小美之后觸發。明白原理之后就可以很輕松的在example下的hb_auto_gpio.c 進行修改 (默認啟用,上文有介紹)
首先在原本的_register_event_callback 方法中額外注冊一個用戶喚醒事件的回調:
user_event_subscribe_event(USER_GOTO_AWAKENED, _custom_setting_cb2);
如下圖所示

之后拷貝原本的 _custom_setting_cb 方法
改名為 _custom_setting_cb2 (我這里不規范, 不要學習我這樣的隨意命名, 可以改成_custom_setting_wakeup_cb)。
static void _custom_setting_cb2(USER_EVENT_TYPE event,
代碼解析:由于訂閱的是USER_GOTO_AWAKENED 事件, 所以其聯合體中goto_awakend 才會具有數據,因此需要根據上下文中的context 來獲取到對應的goto_awakend從而來獲取到對應的CMD命令 "wakeup_uni" (被cmd_reply_data.json 定義, 上文有介紹)。
這樣就可以實現, 當識別到“你好小美” 的時候關閉LED燈。
同理可以實現通過命令詞打開LED燈,代碼如下所示:
static void _custom_setting_cb(USER_EVENT_TYPE event,
最終當識別到 “你好小美”的時候便會關閉LED, 當識別到 “打開臺燈”等命令詞的時候便會打開LED,實現用戶的自定義控制~
編譯燒錄和測試
接下來可以在SDK的根目錄來編譯自己的固件了,執行命令:
./build.sh update

此時可以打開output 文件夾,然后把uni_app_release_update.bin下載到本地電腦,使用 UniOneUpdateTool.exe 進行燒錄。

下圖為燒錄成功界面:

實驗
使用 “你好小美” 喚醒VC-02, 通過命令詞“打開臺燈”, LED 燈被點亮。

使用 “你好小美” 喚醒VC-02, LED燈被熄滅。

附件
固件和SDK
https://www.123865.com/s/UNArVv-k4UKd
審核編輯 黃宇
-
VC
+關注
關注
1文章
115瀏覽量
89918 -
GPIO
+關注
關注
16文章
1328瀏覽量
56218 -
安信可
+關注
關注
0文章
226瀏覽量
5076
發布評論請先 登錄
僅1M flash 的安信可 ESP-01S 模塊,如何二次開發
ESP8266二次開發
AutoCAD的二次開發
ANSYS的二次開發技術
基于VC的Cadence二次開發
可支持快速二次開發的zigbee核心板
空間光調制器的簡便控制方法:靈活應用二次開發
安信可VC-01/02二次開發篇: 事件和GPIO控制
評論