iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
生成式 AI

30 天 Vibe Coding:全端 × 機器學習的實作挑戰系列 第 26

Day 26|30 天 Vibe Coding:先找個能用的語音情緒模型再說

  • 分享至 

  • xImage
  •  

今天正式踏進「語音情緒」的世界。之前文字情緒分類已經走過一輪,這次要挑戰的是聲音,要讓系統能聽懂我說話裡的情緒!!

原本的計畫

一開始我想用 ASIC (Affective Speech in Chinese) 這個資料集,因為它是專門做中文語音情緒的 benchmark。但我並沒有找到ASIC 公開的下載入口,好像需要研究單位授權,我覺得有點太麻煩了只好放棄

最後的選擇:ESD 中文子集

我改用 Emotional Speech Dataset (ESD),這個資料集有中英文版本,我選用中文子集,因為我目前的目標就只是想辨識中文而已,並自己整理成一個 esd_cn.csv 檔案來做訓練。

類別原本有多種(快樂、悲傷、生氣、害怕、驚訝、中立…),我重新 mapping 成 三類:正向 / 中立 / 負向 (暫時只分三類,先建立 baseline,之後再細分成更多情緒類別)

錄音品質乾淨,標註完整,方便直接訓練 baseline,HuggingFace datasets 就能直接處理,挺方便的~

模型挑選:Wav2Vec2 中文版

我選擇了 TencentGameMate/chinese-wav2vec2-base。這是一個針對中文語音訓練的 Wav2Vec2 模型,可以直接從 raw waveform 學習,不需要額外算 MFCC 特徵,非常省事

好處是 HuggingFace 上可以直接載入並 fine-tune,對我這種 side project 來說超方便

前處理與訓練設定

載入音檔時透過 librosa.load(..., sr=16000) 統一成 16kHz 單聲道,符合 Wav2Vec2 的輸入要求,然後用 HuggingFace 的 Trainer 做 fine-tuning:

  • batch size = 8(累積梯度=2)
  • learning rate = 2e-5
  • epoch = 10
  • weight decay = 0.01
  • warmup ratio = 0.05
  • load_best_model_at_end=True,以 UAR 作為挑選依據

UAR (Unweighted Average Recall) 指的是「各類別 recall 的平均值」。在類別數量不平衡時,比單純 accuracy 更公平,因為每個類別的貢獻一樣大。

訓練成果

第一輪訓練結果完全超乎預期
https://ithelp.ithome.com.tw/upload/images/20250917/20140998zKXkNCTBwN.png

我原本設的驗收門檻是 UAR ≥ 0.6,結果拿到 UAR ≈ 0.97,大幅超標!
這也是 pretrained 模型的威力 —— 以前課堂上都是 from scratch,幾乎不可能看到這麼高的數字><

不過也確實跑了滿久,大概四個小時(GPU 訓練,樣本量也不少)

小小demo

丟了一條語音進去,可以看到模型很明確地抓到「正向」情緒。這樣的結果比單純看文字更貼近直覺,因為聲音的情感表達往往比文字更豐富

('positive',
 [9.348189632873982e-05, 0.00012997715384699404, 0.9997765421867371])

明日預告

今天的重點是把 pipeline 跑通,而這點我已經達成,甚至結果遠超預期!!
明天 Day 27,我就要把這個模型包成 API,實際串到前端 demo,錄音 → 傳到後端 → 回傳情緒分布 → 在網頁顯示/images/emoticon/emoticon42.gif


上一篇
Day 25|30 天 Vibe Coding:懶得打字,就用講的寫日記
系列文
30 天 Vibe Coding:全端 × 機器學習的實作挑戰26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言