Python進行AI聲音克隆的端到端指南
人工智能語音克隆是一種捕捉聲音的獨特特征,然后準確性復制它的技術。這種技術不僅可以讓我們復制現有的聲音,還可以創(chuàng)造全新的聲音。它是一種徹底改變內容創(chuàng)作的工具,從個性化歌曲到自定義畫外音,開辟了一個超越語言和文化障礙的創(chuàng)意世界。
本文的將提供利用AI語音克隆技術-通過訓練自定義模型將任何音頻轉換為選定藝術家的音調甚至自己的聲音的端到端解決方案。
技術背景
我們將在本文中使用的技術稱為歌唱聲音轉換(Singing Voice Conversion ),特別是一個稱為SO-VITS-SVC的系統(tǒng),它代表“SoftVC VITS Singing Voice Conversion”。
SO-VITS-SVC系統(tǒng)代表了使用深度學習技術的聲音轉換(SVC)的復雜實現。理解這個系統(tǒng)需要了解它所使用的特定機器學習架構和算法。
1、變分推理和生成對抗網絡
SO-VITS-SVC的核心是文本到語音的變分推理(VITS)架構。該系統(tǒng)巧妙地結合了變分自編碼器(VAEs)和生成對抗網絡(GANs)。在SVC中,mel譜圖是音頻信號的重要表征,利用VAE對mel譜圖的分布進行建模,有助于捕捉語音的潛在變量。
VAE損失函數按下式表示。式中,x為輸入mel譜圖,z為潛變量,KL為Kullback-Leibler散度。
上面公式封裝了VAE損失函數,通過Kullback-Leibler散度平衡了mel譜圖的重建和潛空間的正則化。
GAN則增強了合成音頻的真實感。GAN中的鑒別器對生成器的輸出進行判別,提高了生成器的精度。GAN損失函數為:
GAN損失函數展示了對抗訓練動態(tài),驅動生成模型產生難以區(qū)分的歌聲。
如果想全面了解了解變分自編碼器(VAEs)和生成對抗網絡(gan),以下是原始論文:
VAEs: Kingma, D. P., and Welling, M. “Auto-Encoding Variational Bayes.” arXiv:1312.6114, 2013.
GANs: Goodfellow, I. J., et al. “Generative Adversarial Nets.” arXiv:1406.2661, 2014.
2、淺擴散過程
如附所示,淺擴散過程從噪聲樣本開始,通過一系列變換逐步細化為結構化梅爾譜圖。
上圖展示了SO-VITS-SVC合成流程,從淺擴散模型的初始噪聲生成到mel譜圖的細化和最終可聽聲音輸出的語音編碼。
初始噪聲樣本:噪聲的視覺表示,作為擴散過程的起點。
轉換步驟:噪聲在擴散模型中經歷一系列步驟,從無序狀態(tài)過渡到結構化的mel譜圖。其中xt是步驟t的數據,而ε表示高斯噪聲。
上面公式說明了擴散過程中的逐漸轉變,將隨機噪聲轉化為結構化數據,捕捉目標歌聲的細微差別。在SO-VITS-SVC的背景下,“淺”意味著更少的層或步驟,在計算效率和音頻質量之間取得平衡。
mel譜圖優(yōu)化:這個過程的結果是一個mel譜圖,它封裝了歌唱聲音的音頻內容,為下一個合成階段做好準備。
聲音編碼:最后的聲音編碼步驟將mel譜圖轉換成聲音波形,即可聽到的歌聲。
如果想深入探索擴散模型,請看一下的資料:
Sohl-Dickstein, J., et al. “Deep Unsupervised Learning using Nonequilibrium Thermodynamics.” arXiv:1503.03585, 2015.
Ho, J., et al. “Denoising Diffusion Probabilistic Models.” arXiv:2006.11239, 2020.
3、完整流程與SVC系統(tǒng)的整合
在淺層擴散模型將噪音結構化成更連貫的形式之后,如前面提到的圖表所示,生成的mel譜圖捕捉了歌唱聲音的微妙音頻內容。這個mel譜圖作為原始、非結構化數據與最終聲音輸出之間的關鍵橋梁。
然后使用聲碼器將優(yōu)化后的mel譜圖轉換為音頻波形。在這一步中,將從視覺數據轉換為可聽的歌唱聲音。聲碼器的作用是合成mel譜圖中捕捉到的音高、音色和節(jié)奏的細微差別,從而產生最終的歌唱聲音輸出。
為了實現高保真度的合成,SO-VITS-SVC系統(tǒng)會經過重新的訓練和優(yōu)化。訓練包括優(yōu)化結合了VAE、GAN和擴散模型組件貢獻的損失函數。這種優(yōu)化使用諸如隨機梯度下降或Adam等算法進行,其最終目標是最小化總體損失。這個過程確保最終輸出在音色、音高和節(jié)奏方面與目標歌唱聲音非常相似。
這個過程的最終結果是一個與目標歌唱聲音非常相似的合成聲音。在保持源聲音的音樂性和表現力細微差別的能力的同時,采用目標的音色特質,這是SO-VITS-SVC系統(tǒng)復雜性的體現。
4、使用的python庫
GitHub上的SO-VITS-SVC Fork是一個專門設計用于實時歌聲轉換的專業(yè)工具。它是提供了增強功能的原始SO-VITS-SVC項目的分支:如使用CREPE更準確的音高估計、圖形用戶界面(GUI)、更快的訓練時間以及使用pip安裝工具的便利性。
它還集成了QuickVC并修復了原始存儲庫中存在的一些問題。并且支持實時語音轉換,下面我們來演示如何使用它。
AI聲音克隆
聲音克隆就是我們一般所說的推理階段,是指神經網絡模型在數據集上接受訓練以理解特定聲音后,用所學到的聲音生成新內容的過程。
在這個階段,我們可以通過向預訓練的模型提供新的輸入(原始的聲音音頻)來讓AI“唱歌”,然后該模型會在原始聲音音頻上產生模仿藝術家歌唱風格的輸出。
1、設置環(huán)境
為簡單起見,我們將創(chuàng)建一個心的虛擬環(huán)境,然后使用它
conda create -n sovits-svc
conda activate sovits-svc
安裝必要的庫。
!python -m pip install -U pip wheel
%pip install -U ipython
%pip install -U so-vits-svc-fork
如果你運行svc命令報錯,例如下圖
則需要使用pip uninstall Torchaudio卸載Torchaudio,然后使用pip install Torchaudio重新安裝。這可能是因為一些依賴沒有完整的安裝,所以卸載后重裝就可以了。
2、預訓練模型
entrepreneurdly在Huggingface上提供了很多預訓練模型
我們直接下載使用:
from huggingface_hub import hf_hub_download
import os
# Set the repository ID and local directory, we'll use Drake's Model
repo_id = 'Entreprenerdly/drake-so-vits-svc'
local_directory = '.'
# Download the config.json file
config_file = hf_hub_download(
repo_id=repo_id,
filename='config.json',
local_dir=local_directory,
local_dir_use_symlinks=False
)
# Construct the path to the config file in the current directory
local_config_path = os.path.join(local_directory, 'config.json')
print(f"Downloaded config file: {local_config_path}")
# Download the model file
model_file = hf_hub_download(
repo_id=repo_id,
filename='G_106000.pth',
local_dir=local_directory,
local_dir_use_symlinks=False
)
# Construct the path to the model file in the current directory
local_model_path = os.path.join(local_directory, 'G_83000.pth')
print(f"Downloaded model file: {local_model_path}")
3、選擇一個干凈的音頻文件
下面就是要復制音頻,但是這里需要音頻是一個只有人聲的干凈的音頻文件,如果音頻里面的噪聲比較多,我們需要手動進行預處理。因為源音頻的質量會顯著影響語音轉換的保真度,因此始終建議使用高質量、干凈的錄音。
import requests
vocals_url = 'https://drive.google.com/uc?id=154awrw0VxIZKQ2jQpHQQSt__cOUdM__y'
response = requests.get(vocals_url)
with open('vocals.wav', "wb") as file:
file.write(response.content)
display(Audio('vocals.wav', autoplay=True))
4、運行推理
from IPython.display import Audio, display
import os
# Filenames
audio_filename = 'vocals.wav'
model_filename = 'G_106000.pth'
config_filename = 'config.json'
# Construct the full local paths
audio_file = f"\"{os.path.join('.', audio_filename)}\""
model_path = f"\"{os.path.join('.', model_filename)}\""
config_path = f"\"{os.path.join('.', config_filename)}\""
# Running the inference command
!svc infer {audio_file} -m {model_path} -c {config_path}
5、顯示輸出
可以直接在Jupyter筆記本或任何IPython界面中顯示輸出音頻:
from IPython.display import Audio, display
# Path for the output audio file
output_audio_path = "vocals.out.wav"
# Display the output audio
display(Audio(output_audio_path, autoplay=True))
使用GUI
SO-VITS-SVC系統(tǒng)提供了一個可選的GUI來執(zhí)行語音轉換??梢允褂靡韵旅顔铀?/p>
svcg
訓練自己的AI模型
上面我們演示了使用預訓練模型的推理過程,下面我們來介紹如何訓練自己的模型。
我們將展示使用SO-VITS-SVC系統(tǒng)訓練自定義歌聲轉換模型所需的步驟。從準備數據集開始,進行環(huán)境設置和模型訓練,最后通過從現有音頻剪輯生成歌聲來進行生成。
這個任務需要大量計算資源,需要一臺配備高端GPU和大量VRAM的系統(tǒng)——通常超過10GB。對于那些個人硬件可能不符合這些要求的人來說,Google Colab提供了一個可行的替代方案,提供了訪問強大GPU和足夠的內存——一塊T4 GPU就足夠了。
1、數據準備
可以在Hugging Face上找到許多適用于訓練自定義so-vits-svc模型的語音數據集。但是要個性化自己的模型以反映獨特的聲音特征,則需要錄制自己的聲音。
聲音樣本要求:
- 樣本長度:最好每段10秒。這個長度對于捕捉聲音細微差別而言是最理想的,同時也不會對處理過程提出太高的要求。
- 樣本數量:數據越多,效果越好。需要至少200個聲音樣本。如果需要唱歌,則需要50個歌唱樣本和150個說話樣本,類似這樣比例。
- 總音頻長度:至少五分鐘的總音頻時常。這為模型提供了一個學習的堅實基礎。
- 多樣化內容:通過朗讀語音質量平衡的句子來覆蓋各種音素。例如IEEE推薦的語音質量測量實踐提供了一個這樣的句子列表,這些句子可以為一個全面的數據集做出貢獻。
- 錄制工具:Audacity是一個免費、開源的軟件,非常適合錄制您的樣本。它可以輕松錄制、編輯和導出WAV文件,還可以對音頻進行處理,所以推薦使用
聲音樣本的預處理
我們需要從音頻軌道中去除背景噪音。Spleeter庫可以實現這個功能
!pip install spleeter
from spleeter.separator import Separator
# Initialize the separator with the desired configuration.
# Here, 'spleeter:2stems' means we want to separate the audio into two stems: vocals and accompaniment.
separator = Separator('spleeter:2stems')
# Use the separator on the audio file.
# This function will separate the audio file into two files: one containing the vocals, and one containing the background music.
separator.separate_to_file('audiofile.wav', './')
將音頻軌道分割為片段:我們可以使用AudioSlicer將大量的音頻文件分割成適合訓練模型的10至15秒的片段。
from audioslicer import slice_audio
# Path to the input audio file
input_audio_path = 'long_audio_file.wav'
# Path to the output directory where snippets will be saved
output_directory = 'output/snippets/'
# Length of each audio snippet in seconds
snippet_length = 15
# Slice the audio file into snippets
slice_audio(input_audio_path, output_directory, snippet_length)
在當目錄下創(chuàng)建了dataset_raw文件夾,并且錄音存儲在dataset_raw/{speaker_id}目錄中,如下面的文件夾結構所示
.
├── dataset_raw
│ └── {speaker_id}
│ └── {wav_file}.wav
我們處理后的音頻以這種形式保存即可
然后需要運行,進行svc的自動預處理
!svc pre-resample
!svc pre-config
!svc pre-hubert
2、訓練配置
訓練之前還配置模型,需要在config/44k/目錄中創(chuàng)建的config.json文件。這個配置文件中的關鍵參數包括:log_interval、eval_interval、epochs、batch_size:
對于包含200個樣本和批量大小為20的數據集,每個訓練輪次等于10步。如果要訓練100輪,這就等于1,000個步。
默認設置可能會建議10,000步,但根據您的硬件和數據集大小,可能需要調整這個設置。一個實際的方法可能是以20,000步(20000/10 約等于2000輪)為目標,然后評估性能再決定是否延長訓練。
3、開始訓練
使用svc train命令開始實際的模型訓練。
!svc train
4、模型推理
在對模型進行了訓練、微調和驗證之后,下一步是運行推理,將源音頻轉換為目標語音
from IPython.display import Audio, display
import os
# Filenames
audio_filename = 'vocals.wav' # vocals to applied trained model
model_filename = 'model.pth' # model file created
config_filename = 'config.json' # config file created
# Construct the full local paths
audio_file = f"\"{os.path.join('.', audio_filename)}\""
model_path = f"\"{os.path.join('.', model_filename)}\""
config_path = f"\"{os.path.join('.', config_filename)}\""
# Running the inference command
!svc infer {audio_file} -m {model_path} -c {config_path}
然后就可以查看結果了
總結
SO-VITS-SVC(基于擴散模型和變分自動編碼器的歌聲轉換系統(tǒng))是一個強大的工具,用于實現實時歌聲轉換。通過結合了擴散模型、變分自動編碼器和生成對抗網絡等技術,SO-VITS-SVC系統(tǒng)能夠捕捉歌聲的細微差別,并產生高質量的合成歌聲。
SO-VITS-SVC系統(tǒng)是一個功能強大且靈活的歌聲轉換工具,可以應用于多種場景,包括音樂制作、語音合成、語音轉換等領域,為用戶提供了實現個性化歌聲轉換的便利和可能。
so-vits-svc-fork地址: