1.語音識別簡介
語音識別技術,也被稱為自動語音識別(Automatic Speech Recognition,ASR),其目標是將人類的語音中的詞匯內容轉換為計算機可讀的輸入,例如按鍵、二進制編碼或者字符序列。與說話人識別及說話人確認不同,后者嘗試識別或確認發出語音的說話人而非其中所包含的詞匯內容。
我們的語音算法是基于Whisper是OpenAI設計的。Whisper作為一個通用的語音識別模型,它使用了大量的多語言和多任務的監督數據來訓練,能夠在英語語音識別上達到接近人類水平的魯棒性和準確性。Whisper還可以進行多語言語音識別、語音翻譯和語言識別等任務。Whisper的架構是一個簡單的端到端方法,采用了編碼器-解碼器的Transformer模型,將輸入的音頻轉換為對應的文本序列,并根據特殊的標記來指定不同的任務。
基于EASY-EAI-Orin-nano(RK3576)硬件主板的運行效率:
| 算法種類 | 模型大小 | Real Time Factor (RTF) |
| speech_decoder | 383MB | 0.077 |
| speech_encoder | 217MB | 0.077 |
2.快速上手
如果您初次閱讀此文檔,請閱讀:《入門指南/源碼管理及編程介紹/源碼工程管理》,按需管理自己工程源碼(注:此文檔必看,并建議采用【遠程掛載管理】方式,否則有代碼丟失風險!!!)。
2.1開源碼工程下載
先在PC虛擬機定位到nfs服務目錄,再在目錄中創建存放源碼倉庫的管理目錄:
cd ~/nfsroot mkdir GitHub cd GitHub
再通過git工具,在管理目錄內克隆遠程倉庫(需要設備能對外網進行訪問)
git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-3576.git

注:
* 此處可能會因網絡原因造成卡頓,請耐心等待。
* 如果實在要在gitHub網頁上下載,也要把整個倉庫下載下來,不能單獨下載本實例對應的目錄。
2.2開發環境搭建
通過adb shell進入板卡開發環境,如下圖所示。

通過以下命令,把nfs目錄掛載上nfs服務器。
mount -t nfs -o nolock : /home/orin-nano/Desktop/nfs/

2.3例程編譯
然后定位到板卡的nfs的掛載目錄(按照實際掛載目錄),進入到對應的例程目錄執行編譯操作,具體命令如下所示:
cd EASY-EAI-Toolkit-3576/Demos/algorithm-speech_recognition/ ./build.sh

2.4模型部署
要完成算法Demo的執行,需要先下載法模型。
百度網盤鏈接為:https://pan.baidu.com/s/1jNjnfjnrmyW3_vvdgEG-rA?pwd=1234 (提取碼:1234)。

同時需要把下載的解碼模型和編碼模型復制粘貼到Release/目錄:

2.5例程運行及效果
進入開發板Release目錄,執行下方命令,運行示例程序:
cd Release/ ./test-speech_recognition speech_encoder.model speech_decoder.model filters.txt CN.txt cn 1-10-1_CN.wav
運行例程命令如下所示:

API的詳細說明,以及API的調用(本例程源碼),詳細信息見下方說明。
3.語音識別API說明
3.1引用方式
為方便客戶在本地工程中直接調用我們的EASY EAIapi庫,此處列出工程中需要鏈接的庫以及頭文件等,方便用戶直接添加。
選項 | 描述 |
| 頭文件目錄 | easyeai-api/algorithm/speech_recognition |
| 庫文件目錄 | easyeai-api/algorithm/speech_recognition |
| 庫鏈接參數 | -lspeech_recognition |
3.2語音識別檢測初始化函數
設置語音識別初始化函數原型如下所示。
int speech_recognition_init(const char *p_encoder_path, const char *p_decoder_path, const char *p_filter_path,
const char *p_vocab_path, rknn_whisper_t *p_whisper);
具體介紹如下所示。
函數名:speech_recognition_init | |
| 頭文件 | speech_recognition.h |
| 輸入參數 | p_encoder_path:編碼模型名字/路徑 |
| 輸入參數 | p_decoder_path:解碼模型名字/路徑 |
| 輸入參數 | p_filter_path:濾波器頻譜 |
| 輸入參數 | p_vocab_path:詞組文件 |
| 輸入參數 | p_whisper:語音識別句柄 |
| 返回值 | 成功返回:0 |
| 失敗返回:-1 | |
| 注意事項 | 無 |
3.3語音識別運行函數
設置語音識別運行原型如下所示。
int speech_recognition_run(rknn_whisper_t *p_whisper, audio_buffer_t audio, int task_code, std::vector &recognized_text);
具體介紹如下所示。
| 函數名:speech_recognition_run | |
| 頭文件 | speech_recognition.h |
| 輸入參數 | p_whisper:語音識別句柄 |
| 輸入參數 | audio:待識別音頻信息 |
| 輸入參數 | task_code:語音識別任務 |
| 輸入參數 | recognized_text:語音識別結果 |
| 返回值 | 成功返回:0 |
| 失敗返回:-1 | |
| 注意事項 | 無 |
3.4語音識別釋放函數
設置語音識別釋放原型如下所示。
int speech_recognition_release(rknn_whisper_t *p_whisper);
具體介紹如下所示。
| 函數名:speech_recognition_release | |
| 頭文件 | speech_recognition.h |
| 輸入參數 | p_whisper:語音識別句柄 |
| 返回值 | 成功返回:0 |
| 失敗返回:-1 | |
| 注意事項 | 無 |
- 語音識別算法例程
例程目錄為Demos/algorithm-speech_recognition/test-speech_recognition.cpp,操作流程如下所示:

#include #include #include #include #include #include "sndfile.h" #include "speech_recognition.h" #include "audio_utils.h" int main(int argc, char **argv) { if (argc != 7){ printf("%s \n", argv[0]); printf("Example: %s speech_encoder.model speech_decoder.model filters.txt CN.txt cn 1-10-1_CN.wav\n", argv[0]); return -1; } const char *p_encoder_path = argv[1]; // 編碼模型地址 const char *p_decoder_path = argv[2]; // 解碼模型地址 const char *p_filter_path = argv[3]; // 濾波器頻譜 const char *p_vocab_path = argv[4]; // 詞組文件 const char *p_task = argv[5]; // 識別語種(cn/en) const char *p_audio_path = argv[6]; // 待識別音頻 int task_code = 0; std::vector recognized_text; // Tokenizer 預定義控制符號(切換語言或任務) if (strcmp(p_task, "en") == 0){ task_code = 50259; } else if (strcmp(p_task, "cn") == 0){ task_code = 50260; } else{ printf("\n\033[1;33mCurrently only English or Chinese recognition tasks are supported. Please specify as en or zh\033[0m\n"); return -1; } // 讀取音頻,并對音頻進行處理 audio_buffer_t audio; int ret = read_audio(p_audio_path, &audio); if (ret != 0){ printf("read audio fail! ret=%d audio_path=%s\n", ret, p_audio_path); return -1; } if (audio.num_channels == 2){ ret = convert_channels(&audio); } if (audio.sample_rate != SAMPLE_RATE){ ret = resample_audio(&audio, audio.sample_rate, SAMPLE_RATE); } // speech recognition初始化 rknn_whisper_t whisper; ret = speech_recognition_init(p_encoder_path, p_decoder_path, p_filter_path, p_vocab_path, &whisper); int iter = 0; for (int i=0; i < 5; i++) { clock_t start = clock(); recognized_text.clear(); // speech recognition語音識別 ret = speech_recognition_run(&whisper, audio, task_code, recognized_text); clock_t end = clock(); // 記錄結束時間 double infer_time = ((double)(end - start)) / CLOCKS_PER_SEC; // 轉換為秒 // 結果輸出 std::cout << "\nspeech recognition output: "; for (const auto &str : recognized_text){ std::cout << str; } std::cout << std::endl; float audio_length = audio.num_frames / (float)SAMPLE_RATE; // sec audio_length = audio_length > (float)CHUNK_LENGTH ? (float)CHUNK_LENGTH : audio_length; float rtf = infer_time / audio_length; printf("%d, Real Time Factor (RTF): %.3f / %.3f = %.3f\n", iter++, infer_time, audio_length, rtf); } // speech recognition釋放 speech_recognition_release(&whisper); return 0; }
-
語音識別
+關注
關注
39文章
1812瀏覽量
116145 -
瑞芯微
+關注
關注
27文章
803瀏覽量
54515 -
rk3576
+關注
關注
1文章
277瀏覽量
1629
發布評論請先 登錄
瑞芯微RK3588與RK3576技術參數詳解
米爾RK3576和RK3588怎么選?-看這篇就夠了
米爾瑞芯微RK3576實測輕松搞定三屏八攝像頭
國產開發板的端側AI測評-基于米爾瑞芯微RK3576
適配多種系統,米爾瑞芯微RK3576核心板解鎖多樣化應用
Onenet云網關方案應用--基于米爾瑞芯微RK3576開發板
如何精準驅動菜品識別模型--基于米爾瑞芯微RK3576邊緣計算盒
新品體驗 | RK3576開發板
瑞芯微RK3576語音識別算法
評論