SO-VITS-SVC實戰經驗分享:從零開始打造我的專屬AI歌手
AI唱歌系列之四-數據集預處理與準備訓練

前言:
在使用 SO-VITS-SVC 進行聲音模型訓練時,數據集的準備與預處理是至關重要的步驟。本文將詳細介紹如何進行音訊切片、響度匹配、數據預處理以及訓練參數的設置,幫助你高效完成模型訓練,打造專屬的 AI 歌姬。
1.音頻切片
1-1.命名規範
在切片之前,請將待切片的音訊檔案以純數字、字母、底線命名,避免使用特殊符號,確保文件名規範化。
1-2. 使用WeBUI進行智慧音訊切片
- 開啟 WebUI -小工具/實驗室特性 -智慧音訊切片。
- 將包含所有待處理音訊檔案(必須為.wav 格式)的資料夾路徑輸入到原始音訊資料夾 內。
- 點擊載入原始音訊 ,確認音訊被正確識別。
- 輸入切片後的輸出目錄,選擇對過短音訊的處理方式。
- 開始處理。
1-3. 注意事項
- 將音訊切片至 5s - 15s , 稍微長點也無傷大雅(不要超過17秒),實在太長可能會導致訓練中途甚至預處理就爆顯存。
- 推薦使用以下工具進行輔助切片。
- 只要調整其中的 Minimum Interval ,一般說話素材通常會保持預設即可,歌唱素材可調整至 100 甚至 50。
- 切完之後請手動處理過長(大於 15 秒)或過短(小於 4 秒)的音頻,過短的音頻可以多段拼接,而過長的音頻可以手動切分。
- 如果你使用 Whisper-ppg 聲音編碼器來訓練,所有的切片長度必須小於 30s。
2. 響度匹配與重採樣
2-1. 數據集預處理的流程是:
響度匹配 —— 重採樣 —— 產生設定檔 —— 擷取特徵。
2-2. 重採樣至 44100Hz 單聲道:
使用下面的指令(若已經經過響度匹配,請跳過該行看下面的 NOTE):
1.python resample.py
2-3. 響度匹配的重要性:
注意:雖然 So-VITS 專案自帶響度匹配腳本,但該腳本會將音訊配對到 0db, 這 可能會造成音質的受損。最佳的做法是使用專業音訊處理軟體, 如Adobe Audition自行將資料集響度配對處理後再進入預處理流程。如果資料集已經 完成了響度匹配或啟用了響度嵌入,可以在預處理時跳過程式自帶的響度匹配 流程。
2-4. 跳過響度匹配:
可以在執行上述指令時新增 --skip_loudnorm 跳過響度匹配步驟。如:
1.python resample.py --skip_loudnorm
2-5. 上述所有流程在 WebUI 中均可一键完成:
- 將上一步驟切片完成的數據集資料夾放置到整合包根目錄下dataset_raw資料夾內。
請注意檔案結構:dataset_raw/speaker_name/*.wav。
- 在 WebUI 訓練標籤中,點選識別數據集,確認數據集被正確識別。
- 根據說明自行選擇訓練使用的編碼器和 f0 預測器。
- 如要訓練擴散模型或啟用響度嵌入,請自行勾選。
勾選訓練擴散後將會擷取擴散模型所需的特徵文件,會佔用更多硬碟空間。有關擴散模型的詳細說明,請參考训练参数详解.。
啟用響度嵌入需要選擇 Vec768L12 編碼器,其它編碼器沒有響度嵌入的底模。
- 點選數據預處理:
資料預處理的輸出資訊中可能存在報錯資訊。如果出現報錯,則代表資料預處理未完 成。你可以參考常見報錯和解決方案自行排障。
數據預處理可以多進程執行,但會顯著佔用顯存和内存。建議 6G 以下顯存不要 開啟多線程。12G 以下顯存不要將線程數設置為 2 以上。
同一個數據集只需要預處理一次,往後繼續訓練不需要也不可以重新預處理!
提供一個好用的響度匹配工具:
2-6. 自動劃分訓練集、驗證集,以及自動產生設定檔
使用下面的指令(若需要響度嵌入,請跳過該行看下面的使用響度嵌入):
1.python preprocess_flist_config.py --speech_encoder vec768l12
編碼器詳解:

speech_encoder :
擁有以下七個選擇,具體講解請看2.2.1必須項及各編碼器的詳解。如果省略 speech_encoder 參數,預設值為 vec768l12。
1.vec768l12
2.vec256l9
3.hubertsoft
4.whisper-ppg
5.whisper-ppg-large
6.cnhubertlarge
7.dphubert
8.
更多的編碼器選項,請參考 訓練參數詳解 - 關於特徵編碼器。
音色洩漏指的是輸出的音色向底模/推理輸入源的原始音色接近,模型說話者越多, 音色洩漏越嚴重。考慮到大多數人都希望盡可能還原目標說話者的音色,因此音色洩露 被認為是一種不受歡迎的結果。
2-7. 使用響度嵌入
- 使用響度嵌入後訓練出的模型將匹配到輸入源響度,否則為訓練集響度。 (可簡單理解為訓練後模型的音量會與資料集匹配,否則會與底模匹配)。
- 若使用響度嵌入,需要增加 --vol_aug 參數,例如:
1.python preprocess_flist_config.py --speech_encoder vec768l12 --vol_aug
3. 設定檔依需求修改
config.json
3-1. 基本參數:
- vocoder_name : 選擇一種聲碼器,預設為 nsf-hifigan。
- log_interval :多少步輸出一次日誌,預設為 200。
- eval_interval :多少步進行一次驗證並保存一次模型,預設為 800。
- epochs :訓練總輪數,預設為 10000 ,達到此輪數後將自動停止訓練。
- learning_rate :學習率,建議保持預設值不要改。
- batch_size :單次訓練載入到 GPU 的資料量,調整到低於顯存容量的大小即可(單位:個,即資料集中的wav個數)。
- all_in_mem :將所有資料集載入到記憶體中,某些平台的硬碟 IO 過於低、同時記憶體容量 遠大於 資料集體積時可啟用。
- keep_ckpts :訓練時保留最後幾個模型, 0 為保留所有,預設只保留最後 3 個。
聲碼器列表:
1.nsf-hifigan
2.nsf-snake-hifigan
3.
diffusion.yaml
3-2. 擴散模型參數:
- cache_all_data :載入所有數據集到記憶體中,某些平台的硬碟 IO 過於低、同時記憶體容量 遠大於 數據集體積時可以啟用(註:至少還得預留1-2G記憶體給作業系統)。
- duration :訓練時音訊切片時長,可依顯存大小調整, 注意,此值必須小於數據集內音訊的最短時間!
- batch_size :單次訓練載入到 GPU 的資料量,調整到低於顯存容量的大小即可(單位:個,即資料集中的wav個數)。
- timesteps : 擴散模式總步數,預設為 1000。完整的高斯擴散共 1000 步。
- k_step_max : 訓練時可僅訓練 k_step_max 步擴散以節約訓練時間,注意,該值必須小於 timesteps ,0 為訓練整個擴散模型, 注意,如果不訓練整個擴散模型將無法使用僅擴散模型推理!
注意事項:
- 請嚴格區分輪數 (Epoch) 和步數 (Step):1 個 Epoch 代表訓練集中的所有樣本都參與了 一次學習,1 Step 代表進行了一步學習,由於 batch size 的存在,每步學習可以含有數 條樣本,因此,Epoch 和 Step 的換算如下:

- 訓練預設 10000 輪後結束,但正常訓練通常只需要數百輪即可有較好的效果。當你覺得 訓練差不多完成了,可以在訓練終端按 Ctrl + C 中斷訓練。中斷後只要沒有重新預處理 訓練集,就可以在 WebUI 中繼續上一次儲存的訓練進度。
4. F0 預測器選擇與最佳實踐
生成 hubert 與 f0
4-1. 使用下面的指令(若需要訓練淺擴散,請跳過該行看下面的淺擴散):
1.# 下面的命令使用了rmvpe作为f0预测器,你可以手动进行修改
2.python preprocess_hubert_f0.py --f0_predictor rmvpe
f0_predictor
4-2. 擁有六個選擇,部分 f0 預測器需要額外下載預處理模型,請參考2.2.3-可選項-根據情況選擇
1.crepe
2.dio
3.pm
4.harvest
5.rmvpe(推荐!)
6.fcpe
7.
4-3. 各 f0 預測器的優缺點:

4-4. 注意:
- 如果訓練集過於吵雜,請使用 crepe 處理 f0。
- 如果省略 f0_predictor 參數,預設值為 rmvpe。
若需要淺擴散功能(可選):
4-5. 需要增加--use_diff 參數,例如:
1.# 下面的命令使用了rmvpe作为f0预测器,你可以手动进行修改
2.python preprocess_hubert_f0.py --f0_predictor rmvpe --use_diff
執行完以上步驟後產生的 dataset 目錄便是預處理完成的數據,此時你可以按需刪除 dataset_raw 資料夾了。
最佳實踐
如果你是初次接觸,面對眼花撩亂的可選項,不知道該如何設定預處理參數,這裡為你 提供了一些不同使用場景下的最佳實踐:
4-6. 用於翻唱(非即時轉換):

4-7. 用於朗讀 / 說話(非即時轉換):

結語:
完成數據集的準備與預處理是 SO-VITS-SVC 訓練的關鍵步驟。通過規範的音訊切片、響度匹配與參數設置,你可以顯著提升模型的訓練效果。希望本文能幫助你順利完成專屬 AI 歌姬的打造!如果遇到問題,請參考官方文檔或社群資源進行排障。