博客 / 詳情

返回

如何用 Fun-ASR-Nano 微調一個「聽懂行話」的語音模型?丨Voice Agent 學習筆記

雖然通用語音識別模型在大多數場景下表現不錯,但有些時候,面對專業術語、特定口音或私有詞彙時,難免“聽錯”甚至“幻聽”,比如把內部產品代號識別為常見詞,或在方言會議中漏掉關鍵信息。

如果你希望模型更貼合自己的業務場景微調是一個高效且實用的選擇。通過使用領域內標註數據微調模型(幾百到幾千小時不等),可以提升模型在特定場景、特定領域、特定用户羣體下的識別準確率,讓通用的模型更好地適應具體應用需求。微調後的模型在保持通用能力的同時,在目標場景下表現更優。

為了讓你更輕鬆地定製語音識別能力,我們支持了模型微調的代碼。現在,你可以基於自己的業務數據,一鍵啓動微調流程,快速打造屬於你的“專屬語音識別引擎”。

本文將帶你通過微調 Fun-ASR-Nano,低成本打造貼合業務的專屬語音識別能力。

Fun-ASR-Nano 1分鐘帶你快速回憶

Fun-ASR-Nano-2512 是通義百聆發佈的一款輕量級語音識別模型,總參數量僅0.8B,推理成本低,支持完全本地部署。模型採用端到端架構,開箱即用即可滿足多數通用場景的語音轉寫需求。此外,它支持全參數微調(無需 LoRA),可基於自有語音數據快速適配醫療、金融、客服等垂直領域,打造更貼合業務的識別能力。

在通用不同場景的測試集中,Fun-ASR-Nano-2512均取得了不錯的準確率指標,達到了商業可用的水平。

訓練環境安裝

Fun-ASR-Nano 模型基於 ModelScope/FunASR `框架進行模型的訓練與微調,在微調模型之前需要安裝該模型訓練框架:

git clone https://github.com/FunAudioLLM/Fun-ASR.git
cd Fun-ASR
pip install -r requirements.txt

數據準備

Fun-ASR-Nano 包含了一個參數量為 0.6B 的大語言模型 Qwen/Qwen3-0.6B,其訓練數據遵循 ChatML` (Chat Markup Language) 對話標記語言。

ChatML 是一種結構化的格式,由一系列消息組成,每條消息都包含一個 role和 content,我們模型訓練、微調和測試數據的每一個樣本都包含三條消息,對應三個 role:system,user 和 assistant。

其展開如下所示:

head -n1 data/train_example.jsonl | jq
{
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful assistant."
    },
    {
      "role": "user",
      "content": "語音轉寫:<|startofspeech|>!https://modelscope.cn/datasets/FunAudioLLM/funasr-demo/resolve/master/audios/IT0011W0002.wav<|endofspeech|>"
    },
    {
      "role": "assistant",
      "content": "幾點了?"
    }
  ],
  "speech_length": 145,
  "text_length": 3
}

其中

  • system 的 content 固定為 You are a helpful assistant.
  • user 的 content 包含了 prompt 和音頻文件的路徑(位於 <|startofspeech|>!和 <|endofspeech|>之間)。

    • prompt 默認為語音轉寫:或Speech transcription:
    • 可以結合對應的語種為語音轉寫成英文:或Transcribe speech into Chinese:
    • 當音頻文件對應的文本標註不含阿拉伯數字或者標點符號時,可以使用語音轉寫,不進行文本規整:或 Speech transcription without text normalization:
  • assistant 的 content 對應音頻文件對應的文本標註
  • speech_length:音頻文件的 fbank 幀數(一幀 10ms)
  • text_length:音頻文件標註文本的 token 數 (用 Qwen/Qwen3-0.6B編碼)

我們提供了數據格式轉換工具 scp2jsonl.py,可以將常見的語音識別訓練數據格式 wav scp 和 transcription 轉成 ChatML 格式。

👉data/train\_wav.scp

head -n1 data/train_wav.scp

IT0011W0002    https://modelscope.cn/datasets/FunAudioLLM/funasr-demo/resolve/master/audios/IT0011W0002.wav

👉data/train\_text.txt

head -n1 data/train_text.txt

IT0011W0002    幾點了?
python tools/scp2jsonl.py \
  ++scp_file=data/train_wav.scp \
  ++transcript_file=data/train_text.txt \
  ++jsonl_file=data/train_example.jsonl

wav scp 和 transcription 文件都是由兩列組成,兩個文件根據第一列 (Utterance ID) 一一對應,第二列分別是音頻文件的路徑和音頻文件的文本標註。

啓動訓練

截止目前,我們開源的模型主要包含 audio_encoder,audio_adaptor 和 llm 模塊。因此需要確認待微調的模塊有哪些,進而修改 finetune.sh腳本中的對應參數:

  • audio_encoder_conf.freeze:false表示微調 audio_encoder
  • audio_adaptor_conf.freeze:false表示微調 audio_adaptor
  • llm_conf.freeze:false表示微調 llm

推薦配置

  • 訓練數據少於 1000 小時,建議微調 audio_adaptor
  • 訓練數據少於 5000 小時,建議微調 audio_encoder和audio_adaptor
  • 訓練數據大於 10000 小時,建議全量參數微調

接下來即可運行微調腳本:

bash finetune.sh

Tensorboard 可視化

tensorboard --logdir outputs/tensorboard

瀏覽器中打開:http://localhost:6006/

模型測評

當模型微調結束後,可以使用 decode.py 腳本對模型進行解碼:

python decode.py \
  ++model_dir=/path/to/finetuned \
  ++scp_file=data/val_wav.scp \
  ++output_file=output.txt

解碼結束後,需要對標註和識別結果做文本逆歸一化,然後計算 WER:

python tools/whisper_mix_normalize.py data/val_text.txt data/val_norm.txt
python tools/whisper_mix_normalize.py output.txt output_norm.txt
compute-wer data/val_norm.txt output_norm.txt cer.txt
tail -n8 cer.txt

相信通過本文的指引,你已經瞭解瞭如何通過微調 Fun-ASR-Nano 來打造專屬的語音識別能力。無論是醫療術語、法律條文,還是企業內部的專業詞彙,都可以通過簡單的數據準備和訓練流程,讓模型真正"聽懂"你的業務語言。

現在就動手試試吧!從 GitHub 克隆代碼開始,體驗打造專屬語音識別引擎的完整流程。

開源地址魔搭、HuggingFace、GitHub

https://github.com/FunAudioLLM/Fun-ASR(GitHub)

https://funaudiollm.github.io/funasr/(GitHub.io)

https://modelscope.cn/studios/FunAudioLLM/Fun-ASR-Nano/(國內...

https://huggingface.co/spaces/FunAudioLLM/Fun-ASR-Nano(海外...

https://modelscope.cn/models/FunAudioLLM/fun-asr-nano-2512(...

https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512(海外模...

閲讀更多 Voice Agent 學習筆記:瞭解最懂 AI 語音的頭腦都在思考什麼

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.