# [2025李宏毅ML] 第12講:語言模型如何學會說話 — 概述語音語言模型發展歷程 :::success :+1: 筆記全集Book 請至: https://hackmd.io/@4j/r1U_UJ_pye/ ::: :::info 2025生成式AI時代下的機器學習_李宏毅 課程網站 https://speech.ee.ntu.edu.tw/~hylee/ml/2025-spring.php video: https://youtu.be/gkAyqoQkOSk?si=kQOsj80qTEI0kN2g [[ppt]](https://docs.google.com/presentation/d/1JjbWkIMOWKmeouWtrMi7ph5-2j8TPlUF/edit?slide=id.p1#slide=id.p1) [[pdf]](https://speech.ee.ntu.edu.tw/~hylee/ml/ml2025-course-data/speech.pdf) (20250530) ::: :::spoiler 目錄 [TOC] ::: 可以聽和說的語音語言模型 ![image](https://hackmd.io/_uploads/HyyjBLwfle.png =500x) ## 語音語言模型 Speech LLM ![image](https://hackmd.io/_uploads/BkYjSIPGle.png =500x) 輸入聲音 輸出聲音 跟文字比有更多的挑戰: 內容、語者、情緒、環境 Example 各大語音模型 ![image](https://hackmd.io/_uploads/ryVx8LPfge.png =500x) • Moshi(最早釋出服務的) https://arxiv.org/abs/2410.00037 • GLM-4-Voice https://arxiv.org/abs/2412.02612 • Step-Audio https://arxiv.org/abs/2502.11946 • Qwen2.5-Omni https://arxiv.org/abs/2503.20215 • Kimi-Audio https://arxiv.org/abs/2504.18425 • SpeechGPT https://github.com/OpenMOSS/SpeechGPT-2.0-preview • Sesame (老師目前覺得互動最流暢的) https://www.sesame.com/research/crossing_the_uncanny_valley_of_voice ![image](https://hackmd.io/_uploads/S1C7U8vzel.png =500x) 【生成式AI時代下的機器學習(2025)】[第六講:生成式人工智慧的後訓練(Post-Training)與遺忘問題](https://www.youtube.com/watch?v=Z6b5-77EfGk) 有提到如何讓模型學習聽懂聲音,但不遺忘文字模型的技能 而此節會較著重在 "語音是如何被產生出來" ![image](https://hackmd.io/_uploads/rkxzPIDGxx.png =500x) 把語音訊號 轉為 語音token <-- Tokenization 接龍 <-- Speech LLM 語音token 轉回 聲音訊號 <-- Detokenization ![image](https://hackmd.io/_uploads/Sy7QPIPzel.png =500x) ▪ How to Train Speech LLM pre-trained model, SFT 人類標註, RLHF 提醒他好與不好 ## 語音生成的基本單位是什麼?(Speech Token) ![image](https://hackmd.io/_uploads/rynLv8PGxl.png =500x) What is a "token" in the context of speech? ![image](https://hackmd.io/_uploads/H1StwLwMlg.png =500x) **▪ 若 用 ASR+TTS, 模型變成只是 TextLLM, 好嗎?** ==> 僅把語音訊號轉文字是不夠的,會忽略掉很多資訊 (ex:反諷的語氣) ![image](https://hackmd.io/_uploads/SyD9w8DGll.png =500x) **▪ 若 把取樣點當token基本單位, 好嗎?** 1秒至少8000 tokens, sequence會非常長... ![image](https://hackmd.io/_uploads/S14jwUPzge.png =300x) ![image](https://hackmd.io/_uploads/rygi2P8Dzgg.png =300x) **▪ Various Types of Speech Tokenizers** Overview paper about Speech Tokenization https://arxiv.org/abs/2402.13236 https://arxiv.org/abs/2502.06490 ![image](https://hackmd.io/_uploads/HyRy_IPfle.png =500x) **▪ What is the best choice of tokens?** 2 benchmark, 可在訓練前 判斷 token 的好壞 - **Codec-SUPERB** https://codecsuperb.github.io/ 把 token 解回來看品質(音質或任務的準確度)有無下降 - **DASB** https://poonehmousavi.github.io/DASB-website/ 直接檢測 token 內涵的資訊, ex:把 token 拿去訓練情緒分類模型 ## 如何產生 token ![image](https://hackmd.io/_uploads/SJZN_Lwzll.png =300x) ![image](https://hackmd.io/_uploads/H1SrOLDMxx.png =300x) ### 方法一:SSL 現成 encoder(speech SSL model), 通常以 "0.02秒"為單位對應成一向量 可參考 [【機器學習 2022】語音與影像上的神奇自督導式學習 (Self-supervised Learning) 模型](https://www.youtube.com/watch?v=lMIN1iKYNmA) ![image](https://hackmd.io/_uploads/Sk-M6LvGee.png =500x) 其他步驟 **Quantization**: 把相近的向量歸類到同個id表示, K-means or VQ-layer **Deduplicate**: 把重複的 token 拿掉 **BPE (Byte Pair Encoding)**: 將常一起出現的組合合併成新的id ![image](https://hackmd.io/_uploads/r1J7p8DMxx.png =500x) ==> 這一串把聲音訊號轉為離散token向量表示的過程 稱為 **Tokenization** (不需訓練) 反之 將 token 轉回聲音訊號的過程叫 **Detokenization** (需另外訓練模型) ### 方法二:Neural Speech Codec ![image](https://hackmd.io/_uploads/ByOLaUPGge.png =500x) 此法 Tokenization 跟 Detokenization 是一起訓練的 像 autoencoder一樣訓練, 希望他輸入跟輸出越接近越好 `Codec = Co(compression) + dec(decompression)` ### Various Types of Speech Tokenizers ![image](https://hackmd.io/_uploads/Bk9d6UDzxg.png =500x) - SSL產生的token 常稱為 **"semantic token"** 但不精確 其實較像kk音標 跟語意比較沒關係 - Neural codec產生的token 常稱為 **"acoustic token"** 也不精確 不僅含有acoustic資訊 也有內容的資訊 ![image](https://hackmd.io/_uploads/By95pUwfll.png =500x) Neural codec 一段聲音會抽"多個" token 出來 表示不同面向 可查詢 "RVQ(Residual vector Quantization)" 另一種方法是讓 semantic token 當老師, 讓其中一組 Neural codec 去學跟他越像越好(一組學phonic資訓,其他學語意資訊) 可參考 paper: SpeechTokenizer 跟 Mimi(used in Moshi) ![image](https://hackmd.io/_uploads/BJai6LPMgg.png =500x) 其實不會只選一組token, 會把通通都用上去!!! ## **如何結合不同層級的 token** ![image](https://hackmd.io/_uploads/Bk7CTIvzlx.png =350x) ![image](https://hackmd.io/_uploads/HyqeRUvzlg.png =350x) 可組合不同層次的 token, 粗到細粒度的資訊(內容-->聲音訊號) 不同層次的可以從不同的LLM模型產生(架構也可以不同) ex: autoregressive model 生成慢 但品質比較高 [[去年筆記]](https://hackmd.io/uSMSupRPR2Kz71Tvrt4F7w?view#%E7%94%9F%E6%88%90%E7%9A%84%E7%AD%96%E7%95%A5Autoregressive-Generation-AR) ![image](https://hackmd.io/_uploads/B1N-AUDzgl.png =500x) 此種生法 **難以"streaming"**(即時反應不停頓), 因模型要粗到細都生完才會進detokenizer ![image](https://hackmd.io/_uploads/H1zmRIPzle.png =500x) 改成 **粗細交錯的生法** 就比較容易做 streaming but sequence 會需要很長 ![image](https://hackmd.io/_uploads/SyC70UDGgx.png =300x) ![image](https://hackmd.io/_uploads/SkMBAIDzee.png =300x) ex: Moshi 五分鐘需要 30k 的 tokens (右圖) 輸入上限長度達 30k 其實蠻困難的, gpt4剛出來時也未達 怎麼縮短? --> **一次(步)產生多組token** ![image](https://hackmd.io/_uploads/r1-LCUvfgx.png =500x) 但往往 細粒token需依靠粗粒token的資訊, 有先後順序無法同時生成 --> **Acoustic Delay** ![image](https://hackmd.io/_uploads/SJRDAUPfge.png =500x) 先生 `粗_1` --> `粗_2,中_1` --> `粗_3,中_2,細_1` --> ... 就會比較容易 ![image](https://hackmd.io/_uploads/SJ0dCIDGgl.png =500x) 另一種用兩個transformer的方法,可與 Acoustic Delay 併用 --- ### Why discrete tokens? 為什麼人類最後選擇了 "離散型" 當作語音的token呢? ![image](https://hackmd.io/_uploads/HkjtCUDzgg.png =500x) ![image](https://hackmd.io/_uploads/Byzo0IDGex.png =500x) **▪ continuous vs discrete token** 輸入 選用 **離散或連續token** 差不多(甚至連續較好 較多資訊) 輸出反而 **離散 token** 有優勢 -->因生成的特性 給定一個輸入下,可生成不同可能的輸出 (ex: "你好!" --> "你好啊"/"怎麼了"/"嗨嗨") ![image](https://hackmd.io/_uploads/SyS2A8wfgx.png =500x) ex1: 輸出為 **連續** 的狀況 正確答案可以是藍色或綠色 但模型生成了兩者的混合 --> 反而不正確了:( ![image](https://hackmd.io/_uploads/SybaRUwfee.png =500x) ex2: 輸出為 **離散** 的狀況 模型學習的是機率分佈, inference 時會 sampling 選出其中一個可能 --> ok ![image](https://hackmd.io/_uploads/BJm008Dzxg.png =300x) ![image](https://hackmd.io/_uploads/Hk7J1PPGgx.png =300x) ex3: 輸出為 **連續** 的狀況(但有好好處理) 其實也可以特別設計 loss fcn, 讓他學習輸出只能跟某一個答案接近 --> ok 在影像上會這麼做 在語音上可參考 MELLE https://arxiv.org/pdf/2407.08551 ![image](https://hackmd.io/_uploads/HyNbywwGeg.png =500x) **▪ Good performance in Text-to-Speech (TTS)** 語音合成(TTS)只是唸出來 沒有回覆意思 多輸入一個語音token, 可以使輸出有相同的語音特性, 合成效果更好 參考聯發科 Breezy Voice ![image](https://hackmd.io/_uploads/rJqfyDDGee.png =500x) **▪ Pre-trained Speech LLM ……** 人類的卡關 用幾萬小時的語音資料 訓練pre-trained speech model 是訓練不起來的! (效果差) --> 以 **"文字模型"** 作為語音模型的 Foundation Model ## 以文字模型作為語音模型的 Foundation Model ![image](https://hackmd.io/_uploads/SJr4kPPzxg.png =500x) ![image](https://hackmd.io/_uploads/BkjSJwDGxl.png =500x) 人類1分鐘約可講100個token 1百萬(1M)小時 可以產生 "6B" 的文字token 但 LLaMa3 訓練 pre-trained 可是用了 "15T" 的文字token 相當於285k年才唸的完的語音資料... ``` Text is a compressed version of speech. 文字是語音的壓縮版!! ``` --> 語音更複雜 保有更多資訊 所以訓練在語音上是更困難的 ![image](https://hackmd.io/_uploads/SktDkDwMle.png =500x) ex: (綠線)語音文字模型speech, (黑線)文字模型text 在資料量增多時 text模型可以大幅提升能力,但對speech模型仍很有挑戰 (此僅比較文字語意的能力) ### Leveraging Text: Starting from Text LLM ![image](https://hackmd.io/_uploads/SJo_yPPfxg.png =500x) 現今已有許多成熟的文字模型,我們可以從文字模型開始打造語音模型 ![image](https://hackmd.io/_uploads/BJFKkvwfex.png =500x) ex: 用 文字模型 當訓練語音模型時的 initialization **▪ Leveraging Text: Speech-Text Hybrid Generation** ![image](https://hackmd.io/_uploads/r15nyDwMgx.png =500x) ex: Hybrid decoding 讓他同時生成語音tk跟文字tk,文字作為生成訓練的輔助(像心中的獨白),可使模型表現更穩定 ![image](https://hackmd.io/_uploads/SkI61vDMeg.png =500x) 可以有各種設計方式 **- 1. text then speech:** 文字token後面接語音token,對模型來說像是先生草稿再TTS,是可以容易做好的! 缺點是比較難做及時的回應 要等文字都產生完 **- 2. text then speech(token-level):** 先產生一個文字token再產生一個語音token,持續下去 就可以即時回應 但訓練資料需要知道如何align, align品質影響大 ![image](https://hackmd.io/_uploads/Syp1gPvMxx.png =500x) **- 3. text and speech at the same time** 每一步同時產生文字跟語音的token 問題是文字跟語音對應的長度往往不同,所以有以下多種處理策略 ![image](https://hackmd.io/_uploads/SJOlxvwMlg.png =500x) **Mini-Omni**:文字生完後面都補等待符號 **LLaMA-Omni**: 生固定數目的等待,但文字也要補一些 **Moshi**: 模型自己預測每步要等多久 哪種方法比較好尚未明朗 **▪ 考慮文字的語音 Tokenization** ![image](https://hackmd.io/_uploads/Hy9UlDDfll.png =300x) ![image](https://hackmd.io/_uploads/rkOuxwPzgl.png =300x) TASTE (Text-Aligned Speech Tokenization and Embedding) 想法:其實語音token可以不保留文字資訊的 ![image](https://hackmd.io/_uploads/H1iYxvwGxl.png =500x) Can we have text-aligned speech representations? 希望有個 tokenizer 可以幫忙產生 **"相同長度的"** 文字/語音token ![image](https://hackmd.io/_uploads/Sytogwwfgg.png =300x) ![image](https://hackmd.io/_uploads/rykpePvfxg.png =300x) **network上的設計方法** ASR: 語音辨識成文字 speeech encoder: 抽多組 representation aggregator: 組合上述的q,k,v detokenizer:(一個語音合成系統) 會吃 文字 跟 文字所對應的語音token, 還原成聲音訊號 ![image](https://hackmd.io/_uploads/r1p6ewDMex.png =500x) 讓輸入跟輸出越接近越好 --> TASTE ![image](https://hackmd.io/_uploads/S1PWWwvGxx.png =500x) ![image](https://hackmd.io/_uploads/ryk7-vwzee.png =300x) ![image](https://hackmd.io/_uploads/HksX-DPGge.png =300x) 示範音檔:[[yt 1:10:27]](https://youtu.be/gkAyqoQkOSk?si=Yvtixotlsm6bPQpa&t=4227) 交換語音token **Training Speech LLM** ![image](https://hackmd.io/_uploads/r11S-wPMxl.png =500x) 語音資料 跟 文字token,通過 Tokenizer, 可得到對應的語音token 就可以拿成對token 來訓練 speech LLM [[demo yt 1:14:16]](https://youtu.be/gkAyqoQkOSk?si=zgjb5dSskpDPKE1D&t=4456): ![image](https://hackmd.io/_uploads/rkb8bPvGle.png =300x) ![image](https://hackmd.io/_uploads/Hy9wZwPMgx.png =300x) ## 有了 pretrained model 後 我們已經討論了很多生成語音的方式,然後怎麼訓練呢? ### 怎麼訓練 How to Train Speech LLM ![image](https://hackmd.io/_uploads/By7qWPPfge.png =500x) **▪ 監督式微調(Supervised Fine-tuning, SFT)** 常見做法: 拿 pretrained speech LLM 之前所用 **"文字模型"** 來生成對話 (網爬對話不一定最合適,會把 ptm 的文字能力 finetune 壞) 再用 **TTS語音合成** 唸出來,即為可拿來微調訓練的成對資料。 ![image](https://hackmd.io/_uploads/Sk9iZwwGxl.png =500x) **▪ RLHF:** Alignment with Feedback 語音模型產生多組答案 讓人去評價好壞 ![image](https://hackmd.io/_uploads/rkdnWDvzlg.png =500x) 學者前期較多研究 評價quality音質好壞 近期研究趨勢 聽懂聲音(文字以外的聲音) 音樂,環境音,... ![image](https://hackmd.io/_uploads/rkDpbPPzgx.png =500x) RLAIF: 用另一個模型來給語音模型回饋 ### Beyond the Turn-based Game ![image](https://hackmd.io/_uploads/rkuR-Pvfgl.png =500x) 文字對話 --> **Turn-based** 是回合制的 語音對話 --> **Full-duplex** 是複雜會重疊的 要會"邊聽邊說" ![image](https://hackmd.io/_uploads/r10JMvvMgg.png =500x) 模型如何邊聽邊說 參考文獻:Moshi, Dialogue GSLM ### Evaluation ![image](https://hackmd.io/_uploads/BkU-zwPGlg.png =500x) 要考慮文字 跟文字以外的事(語氣,情緒...) 參考 https://arxiv.org/abs/2505.15957 ![image](https://hackmd.io/_uploads/rkWzGDwfll.png =500x) To Learn More 最新的語音語言模型相關論文 https://github.com/ga642381/speech-trident ![image](https://hackmd.io/_uploads/Skxrfvvflx.png =500x) overview paper https://arxiv.org/abs/2410.03751 https://arxiv.org/abs/2410.18908 https://arxiv.org/abs/2411.13577 ![image](https://hackmd.io/_uploads/ry0UGDwzxx.png =500x) On The Landscape of Spoken Language Models: A Comprehensive Survey https://arxiv.org/abs/2504.08528 (李宏毅老師) -- END --