iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0
Mobile Development

Flutter :30天打造念佛App,跨平台應用從Mobile到VR,讓極樂世界在眼前實現!系列 第 18

[ Day 18 ] Flutter 語音辨識 深入應用篇— 生活在地球的勇者啊,阿彌陀佛怎麼念呀(3) #ASR Hotwords #熱詞增強

  • 分享至 

  • xImage
  •  

2025 iThome鐵人賽
「 Flutter :30天打造念佛App,跨平台從Mobile到VR,讓極樂世界在眼前實現 ! 」
Day 18
「 Flutter 語音辨識 深入應用篇 — 生活在地球的勇者啊,阿彌陀佛怎麼念呀?(3)


前言

昨天我們已經實作離線的「KWS 關鍵字偵測」,今天我們接著來認識:
ASR模型與KWS模型的差異」、「VAD語音活動檢測」、「熱詞增強」!

點擊觀看 熱詞增強demo影片 (設置熱詞前)
點擊觀看 熱詞增強demo影片 (設置熱詞後)

Day18 今日目錄:
一、ASR模型 vs. KWS模型
二、VAD 語音活動檢測
三、熱詞增強


一、ASR模型 vs. KWS模型

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 詞彙表

  • 備註
    子詞分解:
    把完整詞拆成更小單位(子詞、音節、字母),再用小單位組合完整詞。

二、VAD 語音活動檢測

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) 熱詞增強成果


Day18 重點回顧

重點 內容
ASR vs. KWS 詞彙表型態、模型大小不同
VAD 語音活動檢測
熱詞增強 解碼過程針對指定詞進行權重加分

上一篇
[ Day 17 ] Flutter 語音辨識 深入應用篇— 生活在地球的勇者啊,阿彌陀佛怎麼念呀(2) #KWS keyword spotting #關鍵字偵測
下一篇
[ Day 19 ] Flutter 語音辨識 深入應用篇— 生活在地球的勇者啊,阿彌陀佛怎麼念呀(4) #KWS vs. ASR 準確度實測
系列文
Flutter :30天打造念佛App,跨平台應用從Mobile到VR,讓極樂世界在眼前實現!21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言