最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

基于tacotron2的galgame角色語音合成+galgame解包 保姆級教程(千戀萬花版)

2023-01-25 01:55 作者:豚骨拉面--  | 我要投稿

(注:本專欄只討論相關(guān)技術(shù),不涉及任何其他目的,如侵刪)

(生成數(shù)據(jù)集的代碼有更新?。?! 2023.2.19)

前言

前段時間在b站上看到了基于TTS模型合成喜愛的二次元語音的一系列教程,覺得非常有意思,也想利用寒假復(fù)現(xiàn)一下。但當(dāng)時忙著復(fù)習(xí)期末考試,一直拖到了過年這幾天才有時間好好研究了一番。

我復(fù)現(xiàn)的方式是基于最開始的tacotron2模型,使用NVIDIA官方的預(yù)訓(xùn)練模型進(jìn)行微調(diào),訓(xùn)練語料來自于《千戀*萬花》中的芳乃,使用Google Colab + Kaggle的GPU進(jìn)行訓(xùn)練。因此本教程適合那些有基本的Python編程和深度學(xué)習(xí)知識、同樣想要復(fù)現(xiàn)的xdm。

(我本人也不是科班出身學(xué)人工智能的,Python和深度學(xué)習(xí)都是半路出家,所以這里不會涉及過于復(fù)雜的實現(xiàn)細(xì)節(jié)。本教程盡量一步步詳細(xì)地描述實現(xiàn)過程,希望大家看過之后能大概知道整個流程到底是怎么樣的)

tacotron2模型基本介紹

本教程采用原up最開始的思路,具體可以看下面這個視頻。

關(guān)于tacotron2模型的介紹,感興趣的同學(xué)可以看下面這個視頻(不是必要的,下面這個視頻有差不多一個小時),講得比較清楚。

由于我們是復(fù)現(xiàn),不要求對模型具體的結(jié)構(gòu)有過于深入的了解,所以我們只需要大概知道,tacotron2模型實現(xiàn)的效果是我們給定一段文本輸入,模型會輸出相應(yīng)的Mel譜,通過后續(xù)的WaveGlow聲碼器得到最終的聲音。

提取數(shù)據(jù)之前,我們在原up的github鏈接https://github.com/CjangCjengh/tacotron2-japanese中,下載相應(yīng)的代碼壓縮包,解壓后得到tacotron2-japanese-master文件夾。

文本

有了模型,接下來是最重要的部分:獲取數(shù)據(jù)。這里獲取數(shù)據(jù)的方式借鑒了下面的兩個教程:

下面我會一步步展示如何提取文本和生成filelist文件,后文有我寫的一個簡單的Python腳本,可以生成最終的filelist。

我這次提取的是《千戀*萬花》中的芳乃語音。游戲文件夾中有data.xp3(不是data1080.xp3)和voice.xp3兩個文件,分別存儲了角色臺詞和對應(yīng)語音。

角色臺詞
角色語音

進(jìn)入GARBro軟件,路徑設(shè)置為游戲文件夾,界面如下:

打開data.xp3,界面如下:

再打開scn文件夾:

這些scn后綴的文件就是我們需要的文本文件。從頭到尾全部選中,右鍵,提?。海ㄗ⒁獠灰惶崛》寄碎_頭的,因為在共同線和其他角色線中也有不少芳乃語音)

提取完后,使用Freemote軟件轉(zhuǎn)換為json文件,具體操作是選中文件后,拖至FreeMoteToolkit文件夾中的PsbDecompile.exe中,會顯示“用xxx.exe”打開:

這樣,每個scn文件會生成相應(yīng)的json文件和resx.json后綴的文件。

打開json文件和resx.json文件(可以用記事本打開),我們會發(fā)現(xiàn)有用的信息全在json文件中:

json文件
resx.json文件

然而,json文件包含眾多信息,以及多級字典嵌套,不方便直接生成我們想要的txt文件。在Python中,使用json庫讀入json文件,得到一個字典。經(jīng)過我的觀察,文本信息在該字典的“scene”元素下的某一個子字典,該字典中有“texts”鍵,對應(yīng)的值為一個列表,存儲相應(yīng)的文本信息:

在文件中搜索“voice”,可以找到我們想要的臺詞文本和相應(yīng)的音頻文件:

由于沒有找到生成filelist文件的教學(xué),我寫了一個簡單的py腳本generate_txt.py,可以處理文件夾中所有的json文件,提取特定角色的語音,使用時直接把下面的腳本移動至tacotron2-japanese-master文件夾中即可運行。(下面的代碼2023.2.19有更新)

移動至tacotron2-japanese-master文件夾中

在后續(xù)訓(xùn)練中,我發(fā)現(xiàn)數(shù)據(jù)集中可能混雜著一些異常樣本,在經(jīng)過cleaner之后得到空字符串,長度為0,導(dǎo)致后續(xù)的pack_padded_sequence函數(shù)報錯。因此在生成數(shù)據(jù)集文件時,我們需要去除這些異常樣本。

這里我采用的是一種比較笨的方法,即對每個樣本做一次cleaner,保留長度不為0的樣本。(其實可以直接生成cleaner之后的txt,但我懶得改了)

(注:千戀萬花沒有單獨劃分h語音,我目前沒有特別好的辦法自動去除數(shù)據(jù)集中的h語音,去除所有包含消音字符“●”的文本可能有一定作用)

由此,我們得到了訓(xùn)練集和測試集,分別對應(yīng)transcript_train.txt和transcript_test.txt。

2023.2.19更新:

目前來看,上面的提取方法應(yīng)該適用于所有后綴是.scn的文本文件的提取,基本上用GARBro提取之后,使用Freemote都能轉(zhuǎn)換成前文所述的json文件。由于我電腦上現(xiàn)有的galgame不多,所以只試了9nine。根據(jù)下面這個視頻介紹的GARBro方法,正確打開.xp3文件需要加密,加密方式應(yīng)該選擇游戲名稱對應(yīng)的羅馬音。但我之前提取千戀萬花的時候選擇的是“沒有加密”,也成功提取了,所以具體需不需要加密因游戲而異。

GARBro內(nèi)置的加密方案只涉及部分游戲,經(jīng)過我的觀察,9nine的前三部(九九九、天天天、春之風(fēng)/春春春)可以用同一個加密方案成功提?。海ㄈ绻x錯加密方案,退至上一級文件夾,點擊文件夾欄右側(cè)的刷新重新進(jìn)入xp3文件時可以再次選擇加密方案)

(注:選錯加密方案之后同樣可以打開.xp3文件、完成scn的提取,但無法使用Freemote將scn轉(zhuǎn)換成json文件,會提示Your PSB is encrypted。我看到的說法是GARBro對于較新的游戲提取成功率不高,可以嘗試KrkrExtract,我打算試試這個軟件,到時候在評論區(qū)分享結(jié)果)

代碼部分我也做了更新,根據(jù)下面這篇專欄,scn文件一般的擴展名是ks.scn或者txt.scn(千戀萬花中是ks.scn,而9nine中是txt.scn,兩種文件經(jīng)Freemote分別轉(zhuǎn)換成ks.json和txt.json)。

新的filelist_build函數(shù)加了兩個參數(shù),format和collapse_LF。format是json文件的格式,即ks.json或者txt.json:

collapse_LF對應(yīng)是否清除文本中自帶的換行符,默認(rèn)為True(清除)。我發(fā)現(xiàn)在原文本中,有些句子內(nèi)會自帶換行符“\\n”:

我聽了幾個語音片段,感覺換行符的加入并沒有造成太多語義上的變化,而原作者的cleaner中似乎沒有清除行內(nèi)換行符\\n,而\\n作為非有效文本,不知道是否影響模型的學(xué)習(xí),因此我將collapse_LF作為可選參數(shù)。

最后提一下,character的輸入是日文漢字,因此需要在json文件中找到對應(yīng)角色的漢字名,比如香坂春風(fēng)是“春風(fēng)”不是“春風(fēng)”:

代碼最后會print提取的總樣本數(shù),如果total samples = 0,可以先檢查一下名字或者路徑是否輸入正確。因為我只試驗了部分游戲,難免有考慮不周的地方,有其他問題歡迎私信我或者評論區(qū)留言。

語音提取

提取完文本,接下來是提取語音。在GARbro中打開voice.xp3文件:

前三個字母代表角色(akh我也不知道是誰),后面的一串?dāng)?shù)字是音頻的章節(jié)和序號。我們找到“yos”開頭的音頻,選中后提取出來:

這時候我們提取出來的是ogg文件,需要轉(zhuǎn)換成wav文件。下載格式工廠,這是一個免費的格式轉(zhuǎn)換軟件,界面如下:

選擇轉(zhuǎn)換成wav文件,在輸出配置中設(shè)置采樣率為22050Hz,單聲道:

隨后選中所有ogg文件,批量轉(zhuǎn)換成wav文件,完成音頻導(dǎo)出:

模型訓(xùn)練(Colab)

提取完所有的數(shù)據(jù),我們正式開始訓(xùn)練模型,這里可以直接使用前述教程中原up提供的colab鏈接,但為了方便調(diào)參,我修改了一下相應(yīng)的colab筆記本,具體鏈接為https://colab.research.google.com/drive/1MvKoW9h1ul1WTn1WIubAqHMjpXajFQ6a#scrollTo=5mBxgMRL23_x

我稍微修改了原代碼中create_hparams()函數(shù)的定義,便于之后修改超參數(shù)。

在colab中,我直接clone原up的git,隨后我們需要上傳相應(yīng)的數(shù)據(jù)集文件至filelists文件夾,colab不支持重名文件替代,所以我們需要先刪除原來的txt:

(如果提示找不到原來的txt文件,可以刷新一下文件目錄)

同時注意后續(xù)create_hparams中self.training_files和validation_files的路徑:

隨后我們需要將自己的數(shù)據(jù)集以壓縮包形式上傳到Google drive,最好命名為wav.zip,隨后解壓:


在第一次訓(xùn)練時,我們需要下載官方提供的預(yù)訓(xùn)練模型,然后把warm_start設(shè)置為1,這樣會重置記錄的epoch數(shù)。同時我們還需要將checkpoint保存路徑設(shè)置為drive云盤,這樣如果訓(xùn)練中斷了,我們的模型不會消失:

在訓(xùn)練開始前,我們需要在create_hparams中修改總迭代epochs和多少次迭代保存一次:


(我個人的經(jīng)驗,100個epoch大概要跑9h左右)

隨后可以開始訓(xùn)練:

為了防止colab連接中斷,我們可以在睡覺前操作一下:https://blog.csdn.net/Thebest_jack/article/details/124565741

這樣睡醒后就可以看到訓(xùn)練好的模型了!!

模型訓(xùn)練(Kaggle)

Colab只能訓(xùn)幾個小時就不能用了,而Kaggle提供了35h的GPU使用時間,所以我也想利用Kaggle完成訓(xùn)練,但是在網(wǎng)上好像沒有相關(guān)的教程,我就自己摸索了一下。

在訓(xùn)練之前,我們需要將我們的模型和數(shù)據(jù)集上傳至Kaggle的Dataset。我們打開Create a New Dataset,建立兩個數(shù)據(jù)集:checkpoint和yoshino,其中checkpoint存放我們現(xiàn)有的模型,yoshino中有兩個子文件夾,存放wav和filelists:

注意,當(dāng)上傳文件夾時,Kaggle會自動解壓,因此wav.zip中可以包含filelists和wav,方便后續(xù)操作:

上傳成功后界面如下:

Kaggle的ipynb鏈接為https://www.kaggle.com/code/littleweakweak/tacotron2,下面簡單做一些解釋。

在Kaggle的環(huán)境中,不能直接安裝pyopenjtalk,搜索之后得知需要先uninstall cmake:

Kaggle的ipynb和Colab大同小異,但是需要針對Kaggle的文件路徑做一些調(diào)整。(根據(jù)你自己的dataset名字進(jìn)行修改)

隨后我們就可以開始訓(xùn)練了。對于防止Kaggle中斷,網(wǎng)上也有類似的方法,但我嘗試過后好像不行。實際上Kaggle提供了更簡單高效的方式:save version

具體操作見https://www.cnblogs.com/zgqcn/p/14160093.html,設(shè)置完save version后,我們就可以關(guān)機睡覺了,等它訓(xùn)練完成后便可以查看結(jié)果。由于save version不會中途保存,我們設(shè)置迭代epoch時需要估計一下訓(xùn)練時長(100個epoch大概9h),以免超過使用時間限制

提醒?。。?/strong>Kaggle每次繼續(xù)訓(xùn)練時,記得更新checkpoint數(shù)據(jù)集中的模型,否則還會從上次的模型開始訓(xùn)練,我就是疏忽了這一點白訓(xùn)了十個小時)


訓(xùn)練心得

寫到這里,模型訓(xùn)練的過程大概描述完了,下面是個人的一些心得:

  • 訓(xùn)練過程中可以逐步調(diào)低學(xué)習(xí)率,一開始學(xué)習(xí)率1e-3,等訓(xùn)練一段時間之后可以調(diào)低至1e-4、1e-5等。時不時觀察一下train loss和val loss的變化趨勢,判斷模型的狀態(tài)

  • 我這次大概訓(xùn)練了不到30h,25000次迭代,最終train loss大概0.21,val loss大概0.27。實際上最后幾個小時,train loss一直慢慢下降,val loss一直在0.27附近波動,懷疑出現(xiàn)過擬合,最后學(xué)習(xí)率為1e-5,weight_decay為1e-5,不打算繼續(xù)訓(xùn)練了。由于之前沒有訓(xùn)練神經(jīng)網(wǎng)絡(luò)的經(jīng)驗,如果有大佬有比較好的方案,歡迎評論區(qū)指出)

  • 最后模型可以發(fā)出比較清晰的日語,但是音調(diào)有些奇怪;如果用假名表示漢語拼音,某些句子發(fā)音還不錯,如果每個音發(fā)的比較短,可以再加一個音,如:びぇえざいじぇえりいふぁあでん(鱉在這理發(fā)店)

  • 在inference時,如果輸出mel_outputs_postnet.shape,會發(fā)現(xiàn)每次inference的輸出都不同。查閱之后得知,這是因為模型的Prenet中,dropout層的training = True,所以model.eval()對其不起作用,而其他dropout層的training = self.training。我在訓(xùn)練完之后才知道這個事情,而訓(xùn)練過程中validate時同樣激活了Prenet的dropout層。而當(dāng)我直接修改prenet時,模型輸出異常。目前不知道在訓(xùn)練前調(diào)整prenet之后結(jié)果如何,感興趣的xdm可以嘗試之后告訴我。

結(jié)語

到這里整個模型的訓(xùn)練過程就講完了。經(jīng)過這幾天的努力,最終實現(xiàn)了一個還算不錯的結(jié)果。這真的是一個很有意思的項目,非常敬佩原up的創(chuàng)意和后來各位up的改進(jìn),由于我是第一次復(fù)現(xiàn)項目,也是第一次訓(xùn)練TTS模型,知識有限,還有很多的不理解之處,發(fā)出這個簡陋的教程也是希望和大家共同學(xué)習(xí),希望之后能繼續(xù)嘗試一些有意思的項目。


基于tacotron2的galgame角色語音合成+galgame解包 保姆級教程(千戀萬花版)的評論 (共 條)

分享到微博請遵守國家法律
兴业县| 湛江市| 永安市| 深泽县| 梁平县| 儋州市| 鲁山县| 河西区| 平罗县| 华宁县| 定陶县| 和龙市| 酉阳| 西林县| 竹北市| 田林县| 额敏县| 大埔县| 温州市| 呼图壁县| 小金县| 青冈县| 台中市| 柘荣县| 温泉县| 周宁县| 河南省| 十堰市| 女性| 武宁县| 雷波县| 平定县| 泗水县| 兴海县| 阿图什市| 奉化市| 繁峙县| 孝感市| 富源县| 灵武市| 古蔺县|