2025 iThome鐵人賽
「 Flutter :30天打造念佛App,跨平台從Mobile到VR,讓極樂世界在眼前實現 ! 」
Day 18
「 Flutter 語音辨識 深入應用篇 — 生活在地球的勇者啊,阿彌陀佛怎麼念呀?(3)」
昨天我們已經實作離線的「KWS 關鍵字偵測」,今天我們接著來認識:
「ASR模型與KWS模型的差異」、「VAD語音活動檢測」、「熱詞增強」!
點擊觀看 熱詞增強demo影片 (設置熱詞前)
點擊觀看 熱詞增強demo影片 (設置熱詞後)
Day18 今日目錄:
一、ASR模型 vs. KWS模型
二、VAD 語音活動檢測
三、熱詞增強
1. 模型名稱
(1) ASR 中文專用模型:
icefall-asr-zipformer-streaming-wenetspeech-20230615.tar.bz2
(2) KWS 中文專用模型:
sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile
2. 差異比較
項目 | ASR 中文專用模型 | KWS 中文專用模型 |
---|---|---|
目標任務 | 連續語音→ 逐字稿 | 偵測關鍵詞出現 |
典型輸出 | 文字轉錄 | keyword 命中時可回傳@標籤 |
延遲 | 延遲低 | 更低延遲 |
模型規模 | 大(數百 MB ) | 小(十多 MB ) |
詞彙表型態 | 以中文單字/子詞為主 | 以拼音音節/聲韻單位為核心 |
超出詞彙表 | 多數新詞可由子詞分解再拼出 | 視內建音節能否表達 |
自訂詞彙 | 熱詞增強 | 關鍵詞清單 |
Flutter 應用 | 字幕/全文轉錄/記錄 | 喚醒詞、指令觸發、少量詞彙監聽 |
ASR中文專用模型— tokens 詞彙表
KWS中文專用模型— tokens 詞彙表
- 備註
子詞分解:
把完整詞拆成更小單位(子詞、音節、字母),再用小單位組合完整詞。
1.簡介
VAD 語音活動檢測,用於判斷「段落音訊中是否有人聲」。
VAD 不會進行轉錄,只進行 有聲/無聲 的二元判斷。
2.常用情境
(1) 裁切語音段:找出說話的開始與結束,去除前後空白與長靜音。
(2) 啟動/結束錄音或解碼:有人聲才送進 ASR,可以節省耗電與效能。
(3) 串流端點偵測:協助判斷「一句話講完了」,可以輸出最終轉錄結果。
3.預訓練 VAD 專用模型
(1) silero-vad
(2) ten-vad
4.非VAD模型,enableEndpoint
除了使用VAD專用模型,
我們也可以在transducer模型建立Recognizer時調整端點偵測的相關參數,
達到類似於VAD的效果,但兩者原理並不相同,端點偵測是藉由模型解碼輸出的
非靜音/靜音 跡象與尾端靜音時長,判斷一句話是否結束。
在sherpa_onnx套件中,官方預設開啟 enableEndpoint,
這也對於即時串流模式的語音辨識有很大的幫助。
因為語者說話停頓時,就能判斷這句話是否結束,即時輸出對應的結果。
尤其在即時字幕的應用,觀眾當下就可以馬上看到相應的句子,而非一整段內容。
端點偵測的三條規則,任一條條件成立即視為一句結束。
rule1MinTrailingSilence
規則 1:只看尾端靜音長度,不要求有語音內容;若 ≥ 設定值 視為一句結束。
rule2MinTrailingSilence
規則 2:在本句已經出現過語音的前提下,尾端靜音 ≥ 設定值 就結束。
rule3MinUtteranceLength
規則 3:一句話長度的保險閥;說滿 ≥ 設定值 就強制結束。
Future<sherpa_onnx.OnlineRecognizer> createOnlineRecognizer(
String modelName,
) async {
final localModelConfig = await getModelConfigByModelName(
modelName: modelName,
);
final hotwordsPath = await materializeHotwordsFile();
final config = sherpa_onnx.OnlineRecognizerConfig(
model: localModelConfig,
ruleFsts: '',
decodingMethod: 'modified_beam_search',
hotwordsFile: hotwordsPath,
hotwordsScore: 6,
enableEndpoint: true, //端點偵測
rule1MinTrailingSilence: 2.0, //規則1 秒數設定
rule2MinTrailingSilence: 1.0, //規則2 秒數設定
rule3MinUtteranceLength: 3.0, //規則3 秒數設定
);
return sherpa_onnx.OnlineRecognizer(config);
}
即時串流模式應用
if (_recognizer!.isEndpoint(_stream!)) {
_recognizer!.reset(_stream!); //判斷句子已經結束,重置stream
if (text != '') {
_last = textToDisplay; //顯示文字
_index += 1;
}
}
1.簡介
熱詞增強又稱為語境偏移,用途是在「解碼過程針對指定詞進行權重加分」。
只支援Transducer 系列模型
2.常用情境
(1) 生僻字,模型常聽成別的字
(2) 情境性關鍵詞(例如:活動名稱)
(3) 多語或口音情境下,想穩定某些關鍵名詞的拼寫。
3.實作核心
(1) assets/hotwords.txt
- 一行一個關鍵字
- 記得對照tokens詞彙表,因為許多繁體字沒有在詞彙表內。
- 官方文件說明與示範,hotwords-file的token間不空格是能正常讀取。
- 冒號後可以設置加權分數,但必須是浮點數,若沒有設置就會使用全域加權分數。
南无阿弥陀佛 :3.0
(2) pubspec.yaml
flutter:
assets:
- assets/hotwords.txt
(3) 取得 hotwords.txt 路徑
Future<String> materializeHotwordsFile() async {
final txt = await rootBundle.loadString('assets/hotwords.txt');
final dir = await getTemporaryDirectory();
final path = '${dir.path}/hotwords.txt';
await File(path).writeAsString(txt);
return path;
}
(4) 建立 recognizer 帶入
final hotwordsPath = await materializeHotwordsFile();
final config = sherpa_onnx.OnlineRecognizerConfig(
model: localModelConfig,
ruleFsts: '',
decodingMethod: 'modified_beam_search', //必須使用modified_beam_search
hotwordsFile: hotwordsPath, //設置熱詞
hotwordsScore: 6, //熱詞全域加權分數
);
(4) 熱詞增強成果
重點 | 內容 |
---|---|
ASR vs. KWS | 詞彙表型態、模型大小不同 |
VAD | 語音活動檢測 |
熱詞增強 | 解碼過程針對指定詞進行權重加分 |