利用so-vits-svc架構製作AI聲音模型 === ###### tags: `GDG on Campus FCU 2024/25` {%youtube EbT8ISy7y9c%} ## 觀念 ### SVC項目解析 1. 人聲預處理 2. 人生特徵提取流程 3. 推理階段 ### 預處理階段 ![截圖 2024-11-20 晚上11.45.03](https://hackmd.io/_uploads/BkzzEFoz1x.png) - Source Audio: 要轉換的源音檔 - Vocals.wav: 通過人生過濾軟體,分離出源音頻中的純人聲 - Vocals.wav 44k: 模型只能處理采樣率44k的音頻,所以對人聲音頻進行重采樣 ### 特徵提取流程 - 預訓練模型:通過預訓練模型對音頻盡興特徵提取 - 樂理特徵:基音頻率(f0),高音的頻率 - 頻域特徵:頻譜/梅爾頻譜(mel spectogram) - 能量特徵:音頻音量(audio volume) - 增強特徵:增加隨機噪聲後再進行特徵提取 ### 預訓練特徵提取 ![截圖 2024-11-20 晚上11.45.38](https://hackmd.io/_uploads/H1MEEtsMJx.png) - HuBERT:基於BERT改進,修改適應語音序列 - Whisper:OpenAI提出利用大規模**弱監督學習**實現端到端語音識別模型,少量標注數據條件下,可以達到很好的識別性能。弱監督學習框架為利用大量無標注數據提高語音識別系統提供值得借鑒的範例 - ContextVec:語音**自監督學習方法**,通過HuBERT生成訓練標籤,通過學生網路學習音頻的表徵 #### 預訓練模型 這次使用的資源包內支持4種預訓練模型,實作體驗的是vec768l12 ![截圖 2024-11-20 晚上11.44.01](https://hackmd.io/_uploads/B1CTmtsM1x.png) #### 樂理特徵 ![截圖 2024-11-20 晚上11.44.47](https://hackmd.io/_uploads/ByoeVKiGJg.png) 6個f0預測器 #### f0預測器 在推理時必須選擇一個f0預測算法 | 預測器 | 優點 | 缺點 | | -------- | -------- | -------- | | pm | 速度快、佔用低 | 容易出現啞音 | | crepe | 基本上不會出現啞音 | 顯存佔用高,自帶均值濾波,因此可能會出現跑調 | | dio | - | 可能跑調 | | harvest | 低音部分有更好表現 | 其他音域不如其他演算法 | | rmvpe | 六邊形戰士 | 極端長低音可能出錯 | | fcpe | SVC開發組自研,目前最快的預測器,有不輸crepe的準確度 | 容易出現啞音 | #### 頻率特徵 ![截圖 2024-11-20 晚上11.56.13](https://hackmd.io/_uploads/ryqoLFjf1g.png) - 頻譜spectogram:通過對人聲音頻的時域信號進行 **短時傅立葉轉換(STFT)** 得到 - 梅爾頻譜Mel spectogram:頻譜經過 **梅爾濾波** 後得到 **短時傅立葉轉換(STFT)** - 一種將訊號或音頻拆解開,看出在不同時間點的頻率組成的方法 #### 能量、增強特徵 ![截圖 2024-11-20 晚上11.58.34](https://hackmd.io/_uploads/BJDVDKoMkg.png) - if diff: 檢查音頻文件是否需要增強處理 - utils.Volume_Extractor: - 提取音量 -> audio volume - 增強音頻 + 提取音量 -> aug audio volume - diffusion.vocoder: 用於語音編碼、聲音合成的處理,音頻重建/聲音風格的轉換 - 提取梅爾頻譜 -> audio mel - 增強音頻 + 提取梅爾頻譜 -> aug audio mel - if volume embed: 是否存在音量特徵 - True: 進行提取 - False: 無任何操作 ### 推理階段 #### 生成階段 生成模型主要用到**預訓練模型**的特徵編碼和**樂理特徵**(audio f0, uv) 生成音頻同時,也預測樂理特徵,用於生成+擴散的方案 ![截圖 2024-11-21 凌晨12.06.52](https://hackmd.io/_uploads/S1uXFtif1x.png) #### 擴散階段 音頻的編碼特徵和能量特徵仍採用源音頻提取的,樂理特徵和梅爾頻譜分別從生成器(vocoder)和生成音頻中得到 ![截圖 2024-11-21 凌晨12.09.08](https://hackmd.io/_uploads/Hkl2KFozkg.png) ## 實作步驟 ### 準備[資料集](https://drive.google.com/drive/folders/1ShcBwkwigqjawo9FhcWHTSqbZmNT8tBT) - 1~2小時的純人聲音頻 - 盡量無雜音 - WAV格式 - 每個data介於3~15秒 - 文件名只有數字、字母、底線 ![截圖 2024-11-21 凌晨12.13.12](https://hackmd.io/_uploads/BkQiqYozyl.png) 如果是自己準備的話 #### UVR-5 可以去除伴奏和合聲(用於準備**數據**和**推理**) 使用方法: 1. 依照示圖調參數 2. 選擇輸入輸出地址 3. 按下'start processing' ![截圖 2024-11-21 凌晨12.15.58](https://hackmd.io/_uploads/rJjSjtiGJl.png) #### Audio Slicer 分割音頻並丟棄空白段 若分割後有大於15秒的data: 1. 將該data重新放回去切割 2. 調整畫黃線數值為500 3. 調整畫藍線數值為100 ![截圖 2024-11-21 凌晨12.17.56](https://hackmd.io/_uploads/r1gpoFofkx.png) 將資料及文件夾剪下至dataset_raw ![截圖 2024-11-21 凌晨12.19.50](https://hackmd.io/_uploads/ry7N2Yozye.png) ### 訓練 #### 注意事項 - 支援CUDA的 Nvidia 卡 - 顯存6G以上 若無可至[AutoDL](https://www.autodl.com/)租賃雲端顯卡來進行訓練 #### 打開ㄑ**啟動webui**批次檔 ![截圖 2024-11-21 凌晨12.23.12](https://hackmd.io/_uploads/S13eaKiGJx.png) ![截圖 2024-11-21 凌晨12.23.27](https://hackmd.io/_uploads/S1sWTFjfJe.png) #### 識別資料集 按下**識別數據集**,會出現剛才資料集資料夾的名稱 ![截圖 2024-11-21 凌晨12.25.08](https://hackmd.io/_uploads/H1eu6Fszye.png) #### 資料預處理 按下**數據預處理**,檢查有無報錯訊息 ![截圖 2024-11-21 凌晨12.26.02](https://hackmd.io/_uploads/SkBiTKiGyx.png) 記得勾選擴散模型,效果較好 #### 調整模型參數 ![截圖 2024-11-21 凌晨12.26.53](https://hackmd.io/_uploads/HJOR6Kjzkl.png) 調整好後,按下**寫入配置文件** 注:不用動擴散模型配置 ![截圖 2024-11-21 凌晨12.28.39](https://hackmd.io/_uploads/r1GSRYiM1x.png) 按下**從頭開始訓練**,模型就開始訓練了! 模型會保存在**models_backup**資料夾裡 模型差不多一萬步就可以取出 ![截圖 2024-11-21 凌晨12.29.00](https://hackmd.io/_uploads/r1F8RtoGkl.png) #### 學習日誌 - loss_disc: **子判別器的總損失**,遍歷多個子判別器的判別結果對比真時波形和聲程的波形得出 - loss_gen: **生成器的對抗損失**,就是將生成器生成的波形經過判別器後的輸出,計算距離損失 - loss_fm: 對抗訓練中生成波形和真實波形在判別器中間**特徵之間的距離損失** - loss_mel: mel 重建損失,由L1損失得出。大致描述模型**發音準確率** - loss_kl: 先驗分佈和後驗分布之間的KL散度,衡量**模型的整體性能** - step: 當前評估對應訓練步數 - lr: 當前學習率(默認遞減) ![截圖 2024-11-21 凌晨12.36.25](https://hackmd.io/_uploads/SySMecozJg.png) #### 查看loss值 越低越好,模型效能越好 ![截圖 2024-11-21 凌晨12.41.16](https://hackmd.io/_uploads/rkKVbcifJx.png) ### 推理體驗 #### 前置 - 將提供的模型放至.\logs\44k - 配置文件(json)放至.\configs ![截圖 2024-11-21 凌晨12.43.05](https://hackmd.io/_uploads/SyIj-9iG1x.png) #### 推理 - 選擇模型及配置文件,勾選NSF_HIFIGAN增強 - 點擊**加載模型** ![截圖 2024-11-21 凌晨12.44.45](https://hackmd.io/_uploads/SJ_bG9sG1l.png) #### 音頻轉換 導入去除雜音的人聲音頻,如圖設置參數後按下**音頻轉換** ![截圖 2024-11-21 凌晨12.46.27](https://hackmd.io/_uploads/r11ufqofJl.png) #### 推理參數講解 - 聚類模型/特徵檢索混合比例:聚類模型和特徵檢索均可以有限提升音色相似度,但帶來的代價是會**降低咬字精確度**。需額外訓練聚類模型 - 擴散模型:原始輸出音頻在經過淺擴散處理後可以顯著**改善電音、底噪**等問題 - NSF-HIFIGAN增強器:能夠將升學模型產生的頻譜轉換為高質量的音頻 - 切片閾值:控制的是**最小滿刻度分貝值**,低於這革職將被切片工具是為靜音並去除。因此,當上傳的音頻比較嘈雜時,可以將該參數設置得高一些(如 -30);反之,可以將該值設置得小一些(如 -50)避免切除呼吸聲和細小人聲 - 音頻自動切片:自動音頻切片功能則是設定一個**最長音頻切片時長**,初次切片後,如果存在長於該時長的音頻切片,將會被按照該時常二次強制切分,避免爆顯存的問題