忽如一夜春風來,亞洲天后孫燕姿獨特而柔美的音色再度響徹華語樂壇,只不過這一次,不是因為她出了新專輯,而是人工智慧AI技術對於孫燕姿音色的完美復刻,以大江灌浪之勢對華語歌壇諸多經典作品進行了翻唱,還原度令人咋舌,如何做到的?
本次我們藉助基於Python3.10的開源庫so-vits-svc,讓亞洲天后孫燕姿幫我們免費演唱喜歡的歌曲,實現點歌自由。
so-vits-svc是基於VITS的開源專案,VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)是一種結合變分推理(variational inference)、標準化流(normalizing flows)和對抗訓練的高表現力語音合成模型。
VITS透過隱變數而非頻譜串聯起來語音合成中的聲學模型和聲碼器,在隱變數上進行隨機建模並利用隨機時長預測器,提高了合成語音的多樣性,輸入同樣的文字,能夠合成不同聲調和韻律的語音。
環境配置
首先確保本機已經安裝好Python3.10的開發環境,隨後使用Git命令克隆專案:
git clone https://github.com/svc-develop-team/so-vits-svc.git
隨後進入專案的目錄:
cd so-vits-svc
接著安裝依賴,如果是Linux或者Mac系統,執行命令:
pip install -r requirements.txt
如果是Windows使用者,需要使用Win系統專用的依賴檔案:
pip install -r requirements_win.txt
依賴庫安裝成功之後,在專案的根目錄執行命令,啟動服務:
python webUI.py
程式返回:
PS D:\so-vits-svc> python .\webUI.py
DEBUG:charset_normalizer:Encoding detection: ascii is most likely the one.
C:\Users\zcxey\AppData\Roaming\Python\Python310\site-packages\gradio\deprecation.py:43: UserWarning: You have unused kwarg parameters in UploadButton, please remove them: {'variant': 'primary'}
warnings.warn(
DEBUG:asyncio:Using proactor: IocpProactor
Running on local URL: http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.
說明服務已經正常啟動了,這裡so-vits-svc會在後臺執行一個基於Flask框架的web服務,埠號是7860,此時訪問本地的網址:127.0.0.1:7860:
此時,我們就可以載入模型,模型訓練先按下不表,這裡先使用已經訓練好的孫燕姿音色模型:
連結:https://pan.baidu.com/s/1RwgRe6s4HCA2eNI5sxHZ9A?pwd=7b4a
提取碼:7b4a
下載模型檔案之後,將模型檔案放入logs/44k目錄:
D:\so-vits-svc\logs\44k>dir
驅動器 D 中的卷是 新加捲
卷的序列號是 9824-5798
D:\so-vits-svc\logs\44k 的目錄
2023/05/10 12:31 <DIR> .
2023/05/10 11:49 <DIR> ..
2023/04/08 15:22 542,178,141 G_27200.pth
2023/04/08 15:54 15,433,721 kmeans_10000.pt
2023/05/10 11:49 0 put_pretrained_model_here
3 個檔案 557,611,862 位元組
2 個目錄 475,872,493,568 可用位元組
D:\so-vits-svc\logs\44k>
接著將模型的配置檔案config.js放入configs目錄:
D:\so-vits-svc\configs>dir
驅動器 D 中的卷是 新加捲
卷的序列號是 9824-5798
D:\so-vits-svc\configs 的目錄
2023/05/10 11:49 <DIR> .
2023/05/10 12:23 <DIR> ..
2023/04/08 12:33 2,118 config.json
1 個檔案 2,118 位元組
2 個目錄 475,872,493,568 可用位元組
D:\so-vits-svc\configs>
隨後,在頁面中點選載入模型即可,這裡環境就配置好了。
原始歌曲處理(人聲和伴奏分離)
如果想要使用孫燕姿的模型進行推理,讓孫燕姿同學唱別的歌手的歌,首先需要一段已經準備好的聲音範本,然後使用模型把原來的音色換成孫燕姿模型訓練好的音色,有些類似Stable-Diffusion的影像風格遷移,只不過是將繪畫風格替換為音色和音準。
這裡我們使用晴子的《遙遠的歌》,這首歌曲調悠揚,如訴如泣,和孫燕姿婉轉的音色正好匹配。好吧,其實是因為這首歌比較簡單,方便新手練習。
需要注意的是,模型推理過程中,需要的歌曲樣本不應該包含伴奏,因為伴奏屬於“噪音”,會影響模型的推理效果,因為我們替換的是歌手的“聲音”,並非伴奏。
這裡我們選擇使用開源庫Spleeter來對原歌曲進行人聲和伴奏分離,首先安裝spleeter:
pip3 install spleeter --user
接著執行命令,對《遙遠的歌》進行分離操作:
spleeter separate -o d:/output/ -p spleeter:2stems d:/遙遠的歌.mp3
這裡-o代表輸出目錄,-p代表選擇的分離模型,最後是要分離的素材。
首次執行會比較慢,因為spleeter會下載預訓練模型,體積在1.73g左右,執行完畢後,會在輸出目錄生成分離後的音軌檔案:
C:\Users\zcxey\Downloads\test>dir
驅動器 C 中的卷是 Windows
卷的序列號是 5607-6354
C:\Users\zcxey\Downloads\test 的目錄
2023/05/09 13:17 <DIR> .
2023/05/10 20:57 <DIR> ..
2023/05/09 13:17 26,989,322 accompaniment.wav
2023/05/09 13:17 26,989,322 vocals.wav
2 個檔案 53,978,644 位元組
2 個目錄 182,549,413,888 可用位元組
其中vocals.wav為晴子的清唱聲音,而accompaniment.wav則為伴奏。
關於spleeter更多的操作,請移步至:人工智慧AI庫Spleeter免費人聲和背景音樂分離實踐(Python3.10) , 這裡不再贅述。
至此,原始歌曲就處理好了。
歌曲推理
此時,將晴子的清唱聲音vocals.wav檔案新增到頁面中:
接著就是引數的調整:
這裡推理歌曲會有兩個問題,就是聲音沙啞和跑調,二者必居其一。
F0均值濾波(池化)引數開啟後可以有效改善沙啞問題,但有機率導致跑調,而降低該值則可以減少跑調的機率,但又會出現聲音沙啞的問題。
基本上,推理過程就是在這兩個引數之間不斷地調整。
所以每一次推理都需要認真的聽一下歌曲有什麼問題,然後調整引數的值,這裡我最終的引數調整結果如上圖所示。
推理出來的歌曲同樣也是wav格式,此時我們將推理的清唱聲音和之前分離出來的伴奏音樂accompaniment.wav進行合併即可,這裡推薦使用FFMPEG:
ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav
該命令可以把推理的人聲wav和背景音樂wav合併為一個output.wav歌曲,也就是我們最終的作品。
結語
藉此,我們就完成了自由點歌讓天后演唱的任務,如果後期配上畫面和歌詞的字幕,不失為一個精美的AI藝術品,在Youtube(B站)搜尋關鍵字:劉悅的技術部落格,即可欣賞最終的成品歌曲,歡迎諸君品鑑。