| Task | Notebook |
|---|---|
| Whisper_Vits_Japanese(內置艾拉數據集) |
這個項目將Google的Whisper項目作為VITS的數據處理器,通過修改Whisper項目的transcribe.py,生成音頻對應的Srt文件(這裡使用的是被刪掉的PR,現在已經找不到那個PR,所以無法引用到原作者),同時將Whisper只能讀取少數音頻文件的限制,放寬到可以遍歷文件夾下的所有音頻文件。 Whisper可以輸出Srt使得長音頻的輸入成為可能,用戶不需要再把音頻切割零碎,甚至不需要再轉寫長音頻的文本。我們直接靠Whisper進行語音識別和數據準備,自動切片為短音頻,自動生成抄本文件,然後送入VITS訓練流程。考慮到長時間的音頻幹聲更容易獲取,VITS入門壁壘再次大大降低。
處理流程大致如下:Whisper識別後的Srt文件會被auto.py處理,處理過程參考了tobiasrordorf/SRT-to-CSV-and-audio-split: Split long audio files based on subtitle-info in SRT File (Transcript saved in CSV) (github.com). 音頻文件首先被轉換為22050Hz和16bits,然後同名Srt文件的時間戳和語音識別的抄本被轉換為csv文件,Csv文件中帶有音頻各段區間的起始時間、結束時間,以及對應的抄本和音頻文件路徑,然後採用AudioSegment這個包按照起始時間和結束時間切分長音頻,按照切片順序生成帶有後綴的音頻文件,例如A_0.wav和A_1.wav等等。所有被切片的音頻都會被存入slice_audio文件夾,然後filelists文件夾下會生成VITS需要的帶有“路徑|轉寫”的txt文件,後續的數據流程就可以直接接上VITS部分。
我現在用的VITS的cleaner和symbol是CjangCjengh/vits: VITS implementation of Japanese, Chinese, Korean and Sanskrit (github.com)作為創世神時期最初始的那版,現在他的倉庫更新了更多的cleaner和symbol,不過我是很念舊的人,而且我很懷念剛開始大家來到VITS的時候,所以我還是用著最初的那版。 VITS主要有兩個預處理,一個是monotonic align,另一個是preprocess.py,然後就可以開始train.py。所有的流程我都放進了whisper-vits-japanese.ipynb,只需要逐行點擊就能運行,唯一需要用戶自己改動的地方就是把我的音頻zip路徑,換成你自己的音頻zip,其餘部分均不用修改。最後我還加上了把模型和處理好的文件存入網盤,以及下次訓練時恢復從網盤恢復上次最新的checkpoint的指令。
只需要將音頻文件格式命名為speakerId_XXXX.wav 上傳到audio文件夾,之後按照一般步驟運行,到了音頻處理就運行auto_ms.py文件,會自動生成txt文件,格式為Path|speakerId|text。
注意:若你使用了auto_ms.py來生成txt,必須在Alignment and Text Conversion這步修改為代碼:(因為在多人訓練時的text_index不是1而是2)
python preprocess.py --text_index 2 --text_cleaners japanese_cleaners --filelists /content/whisper-vits-japanese/filelists/train_filelist.txt /content/whisper-vits-japanese/filelists/val_filelist.txt
python train_ms.py -c configs/ms.json -m ms
hps = utils.get_hparams_from_file("./configs/ms.json")
net_g = SynthesizerTrn(
len(symbols),
hps.data.filter_length // 2 + 1,
hps.train.segment_size // hps.data.hop_length,
n_speakers=hps.data.n_speakers,
**hps.model).cuda()
_ = net_g.eval()
_ = utils.load_checkpoint("/root/autodl-tmp/logs/ms/G_29000.pth", net_g, None)
stn_tst = get_text("ごめんね優衣", hps)
with torch.no_grad():
x_tst = stn_tst.cuda().unsqueeze(0)
x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda()
sid = torch.LongTensor([11]).cuda() //11指speakerId为11,如果有12个n_speaker,编号就从0-11
audio = net_g.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=.667, noise_scale_w=0.8, length_scale=1)[0][0,0].data.cpu().float().numpy()
ipd.display(ipd.Audio(audio, rate=hps.data.sampling_rate, normalize=False))