CP勾指幕后
之前一直被催更,聽(tīng)到了無(wú)數(shù)好奇為什么完整版要做這么久的聲音。雖然完整版出了之后其實(shí)也就沒(méi)人關(guān)心這個(gè)了,但既然答應(yīng)了就還是寫(xiě)一下吧。
文中出現(xiàn)的所有代碼和推導(dǎo)均不保證正確性,請(qǐng)確保完全理解代碼后再使用,因此造成的一切后果自負(fù)。
完整版面臨的挑戰(zhàn)
因?yàn)镃醬只唱了一段,所以剩下的部分全部得靠虛擬cp來(lái)唱。聽(tīng)起來(lái)是個(gè)很簡(jiǎn)單的活,有手就能做。但是有些作為聽(tīng)眾不需要考慮的東西,作為創(chuàng)作者卻不得不仔細(xì)謹(jǐn)慎地審視:
虛擬C醬需要直面C醬本人的歌聲帶來(lái)的對(duì)比。我必須做到在C醬的聲音和虛擬C醬的聲音銜接時(shí),能夠以假亂真到不認(rèn)真聽(tīng)會(huì)聽(tīng)不出來(lái)區(qū)別。否則,整首曲子的連貫性與完整性都會(huì)因此大受打擊。這一點(diǎn)在初版中做得不夠好,因此需要進(jìn)一步改進(jìn)。
C醬本人的歌聲為咬字方式提供了一個(gè)強(qiáng)有力的參考。相比之下,其他AI翻唱并不需要關(guān)心咬字是否相似,只需要聲線相似即可。但在這里我不得不使用大量的翻唱作為推理源,選出其中最像C醬咬字風(fēng)格的片段拼湊出全曲,以保證C醬和虛擬C醬交接時(shí)不那么令人不適。進(jìn)一步推廣這個(gè)要求,我期望從任意C醬本人唱歌的時(shí)間點(diǎn)跳轉(zhuǎn)到任意虛擬C醬唱歌的時(shí)間點(diǎn),或是反過(guò)來(lái)時(shí),都應(yīng)該不容易被察覺(jué)到有巨大區(qū)別。
完整版應(yīng)當(dāng)和初版一樣,在結(jié)尾時(shí)讓人感到意猶未盡。考慮到結(jié)尾時(shí)幾乎只剩下人聲,這進(jìn)一步提高了對(duì)模型表現(xiàn)力的要求。
完整版的水準(zhǔn)必須配得上初版給所有人帶來(lái)的期待,以及面對(duì)必然的與初版的對(duì)比;無(wú)論如何都必須確保這不是一個(gè)讓人感到“狗尾續(xù)貂”或者“可惜”的完整版。
綜上,這對(duì)虛擬C醬的聲線重建能力提出了嚴(yán)苛的挑戰(zhàn)。她的聲線必須足夠接近C醬本人,并且有較強(qiáng)的重建能力,以便能夠在翻唱源質(zhì)量欠佳時(shí)依然提供足夠好的人聲,減少對(duì)本就稀少的唱功過(guò)關(guān)的人聲翻唱源的需求。
當(dāng)然也有其他不使用虛擬C醬的解決方案:
扔掉C醬本人的歌聲片段,全部替換為虛擬C醬,可以降低對(duì)高相似度的咬字的期待。然而那段歌聲畢竟是整個(gè)項(xiàng)目的起點(diǎn),初版也已經(jīng)用過(guò)真人的聲音,所以沒(méi)有任何這么做的理由。此外比起AI我當(dāng)然更希望能用上真人的聲音。不如說(shuō)要是能聽(tīng)到人聲本家的話(huà),我死而無(wú)憾
也曾有人問(wèn)我為什么不直接問(wèn)C醬能不能唱剩下的部分。很可惜雖然AI的聲線像,但是和真人比的區(qū)別還是很大,尤其是咬字上的特征,分辨能力好的話(huà)一耳朵便知。在AI相關(guān)的創(chuàng)作上,聽(tīng)得越多越能明白和真人的距離有多遠(yuǎn)。在這種前提下,C醬要是在知道干聲用途后還愿意提供干聲,想必被人發(fā)現(xiàn)后會(huì)有炎上吧。這不僅與她一直以來(lái)的做法相悖,而且為了二創(chuàng)素材打擾本人,我認(rèn)為也是不合適的。
雖然朋友圈的觀眾大多都有著和主播們同樣的溫柔,但是不能因?yàn)樯埔舛档鸵?。確實(shí)做得不好也沒(méi)關(guān)系,但誰(shuí)不希望做得真的好呢。
提升數(shù)據(jù)集質(zhì)量
回歸正題。眾所周知,語(yǔ)音數(shù)據(jù)量越大,干聲質(zhì)量越高,模型質(zhì)量就越好。和坐擁10小時(shí)雜談回切糕的Pi不一樣,C醬玩的游戲大多是有配音、BGM和大量交互音效的精良大作,因此即便是單人游戲也很難僅通過(guò)RMS+閾值作為依據(jù)只切出她說(shuō)話(huà)的片段,更不用說(shuō)很多時(shí)候她都在聯(lián)動(dòng)。此外她也很少雜談,即便雜談也總是開(kāi)著有vocal的jpop作bgm,這使得獲取高質(zhì)量數(shù)據(jù)集的難度進(jìn)一步上升。最后,因?yàn)樗伤圃?0月和11月間換了一次麥克風(fēng),中高頻的收音效果和貼臉感有較大差別,所以能夠使用的數(shù)據(jù)范圍再次縮小。
在訓(xùn)練過(guò)程很難做出差異的情況下,數(shù)據(jù)集的質(zhì)量是至關(guān)重要的。因此絕大部分時(shí)間都應(yīng)該花在數(shù)據(jù)的篩選和預(yù)處理上。一般來(lái)說(shuō),預(yù)處理可以分為如下幾步:
數(shù)據(jù)源。我用的是yt-dlp,可以批量下載m4a。如果有多個(gè)目標(biāo)視頻源,可以自己寫(xiě)個(gè)小腳本跑。
分離人聲。這一步通常使用UVR5,我用的是其中的demucs v4 htdemucs_ft模型。本地3070Ti跑還挺慢的,據(jù)說(shuō)外網(wǎng)有UVR colab notebook,可以使用更好的GPU快速分離。效果最好的似乎是Kim_Vocal_1,但比demucs還慢。此外,去除其他人聲可用UVR-MDX-NET Karaoke,可用于去除vocal和聲,增加可用的推理源。我沒(méi)有試過(guò)能不能去除雜談回背景中的vocal,但同理,可以一試。
去除噪音。游戲音效很難去除干凈,另外UVR有時(shí)也清不干凈BGM。這一步我使用了DeepFilterNet。值得注意的是官方的實(shí)現(xiàn)沒(méi)有針對(duì)超長(zhǎng)音頻數(shù)據(jù)的優(yōu)化,所以我自己寫(xiě)了一個(gè)不會(huì)爆顯存也不會(huì)爆內(nèi)存的,可以使用GPU加速的分塊enhance函數(shù)。
自動(dòng)切片。因?yàn)槲以诘谝淮翁幚頂?shù)據(jù)時(shí)還沒(méi)有傻瓜式一鍵切片器,所以用的也是自己寫(xiě)的。
可選的過(guò)濾器。我在這一步上浪費(fèi)了太多時(shí)間。我會(huì)簡(jiǎn)短地描述我做過(guò)的努力,為什么失敗,以及未來(lái)的期望方向。
因?yàn)槟壳斑€沒(méi)有很好的過(guò)濾系統(tǒng),UVR和DeepFilterNet的過(guò)濾能力也有限,因此第一步過(guò)濾其實(shí)是在數(shù)據(jù)源的選取上。如果輸入的數(shù)據(jù)本身就干凈,那么其實(shí)第二和第三步都不需要。只可惜對(duì)于游戲主播來(lái)說(shuō)能滿(mǎn)足這種條件的數(shù)據(jù)實(shí)在是太過(guò)稀有。
起初我的期望是,濾出15小時(shí)以上的說(shuō)話(huà)素材,以便從零訓(xùn)練出具有強(qiáng)重建能力的DiffSVC模型。然而過(guò)濾器的誤傷率實(shí)在太高,153小時(shí)的素材僅切出3小時(shí)的語(yǔ)音數(shù)據(jù),其中還有不少無(wú)聲部分。
數(shù)據(jù)這么少,那就應(yīng)該使用預(yù)訓(xùn)練模型,然而我一直試著拒絕它。一方面,DiffSVC的虛擬Pi展現(xiàn)了10小時(shí)干凈數(shù)據(jù)的潛力。另一方面,我希望盡可能地減少音色泄露的風(fēng)險(xiǎn)。此外從so-vits 2.0開(kāi)始,C醬就一直是不得不用預(yù)訓(xùn)練模型才能煉出合格效果的那個(gè),我的執(zhí)念希望她也可以從零煉出不亞于虛擬Pi水準(zhǔn)的模型來(lái)。
然而數(shù)據(jù)量和難度終于還是將我擊敗了,最終投降使用了預(yù)訓(xùn)練模型,真香。
分塊降噪器
首先是在UVR5分離人聲之后用于降噪的分塊enhance。
如果直接用DeepFilterNet提供的binary的話(huà),不僅沒(méi)法用GPU加速,對(duì)輸入數(shù)據(jù)的格式要求也過(guò)于嚴(yán)格(只支持16位48k采樣率的wav)。使用它的python庫(kù)可以更好地實(shí)現(xiàn)預(yù)處理,例如讀取各種格式的音頻數(shù)據(jù),并使用GPU加速。
值得一提的是,不留headroom的話(huà)deepfilternet會(huì)產(chǎn)生很恐怖的失真,尤其是沒(méi)有經(jīng)過(guò)true peak limit還被mp3重新有損壓縮過(guò)的數(shù)據(jù)。聽(tīng)起來(lái)像clip,但其實(shí)是直接輸出幅值1。如果使用python調(diào)用enhance,就可以靈活地調(diào)整輸入信號(hào)的峰值peak。以下是代碼:
切片器
正如上面提到的那樣,SVC模型要求我們把數(shù)據(jù)切成5-15秒的片段。人工切費(fèi)時(shí)費(fèi)力,因此當(dāng)然是交給機(jī)器做。
在干凈的干聲輸入上,例如Pi的切糕雜談回,可以直接根據(jù)RMS來(lái)判斷voice activity。因此,最初的思路就是求出RMS曲線后,根據(jù)閾值切出小塊語(yǔ)音來(lái)。
然而,RMS的精度是采樣級(jí)的,如果直接使用閾值的結(jié)果,得到的覆蓋率會(huì)驚人地低:C醬開(kāi)始認(rèn)真玩游戲之后,說(shuō)話(huà)就相對(duì)較少,而且都是短句。在這種情況下,不經(jīng)過(guò)合并的區(qū)間,幾乎很少有可以滿(mǎn)足5-15秒限制的片段。例如在AV860286073_part1上,結(jié)果如下:

覆蓋率僅有6%,至少有80%的數(shù)據(jù)被浪費(fèi)了。C醬的數(shù)據(jù)源本身就少,這樣的浪費(fèi)是不可接受的。
一種貪心的更優(yōu)解是,維護(hù)一個(gè)棧。順序掃描所有說(shuō)話(huà)區(qū)間,并總是盡可能地合并當(dāng)前棧頂與當(dāng)前說(shuō)話(huà)區(qū)間。當(dāng)當(dāng)前棧頂無(wú)法與當(dāng)前區(qū)間合并又不符合條件時(shí),刪除棧頂區(qū)間。為了進(jìn)一步控制切片平均RMS,我引入了動(dòng)態(tài)gap的概念,即根據(jù)棧頂區(qū)間長(zhǎng)度來(lái)計(jì)算棧頂區(qū)間與當(dāng)前區(qū)間間隔silence的長(zhǎng)度上限。
這是一種相當(dāng)啟發(fā)式的方法。即便如此也足以獲得比不合并好得多的覆蓋率。不過(guò),在說(shuō)話(huà)較少的數(shù)據(jù)上,如AV860286073_part1,覆蓋率依然不夠好:

于是又實(shí)現(xiàn)了基于dp的最大clip覆蓋率的合并方法。
首先用符號(hào)定義給定的參數(shù)。定義輸入信號(hào)為,采樣率為
。所有從RMS+閾值生成的clip區(qū)間的集合為
,第i個(gè)clip為
,
表示
的左邊界與右邊界。對(duì)應(yīng)地,我們能求出對(duì)偶的silence區(qū)域形成的集合
,使得該集合及其任意元素
滿(mǎn)足以下條件:
另外規(guī)定?,F(xiàn)在問(wèn)題可轉(zhuǎn)化成,求出一個(gè)長(zhǎng)度為
的01 bit mask,其中第
位代表是否選取
作為音頻的切分點(diǎn)。最樸素的解法自然是
枚舉,然而對(duì)于我們需要處理的,長(zhǎng)度動(dòng)輒半小時(shí)起步的數(shù)據(jù),這種復(fù)雜度肯定是不行的。
定義為,在選擇
作為分割點(diǎn)的情況下,集合
中最多能有多少clip被合法覆蓋。注意此處的合法覆蓋指,對(duì)于任意
,
。其中
是
左側(cè)第一個(gè)被選中的切分點(diǎn),
是
右側(cè)第一個(gè)被選中的切分點(diǎn)。lower和upper為so-vits / diff-svc要求的音頻片段長(zhǎng)度,此處為
。
這個(gè)子問(wèn)題是遞歸的,并且(0-indexed) 就是全局的最優(yōu)答案。它的狀態(tài)轉(zhuǎn)移方程為:
容易發(fā)現(xiàn)在第一項(xiàng)中滿(mǎn)足條件的j的區(qū)間是有限且連續(xù)的。因此可以簡(jiǎn)單地用二分查找滿(mǎn)足條件的最大j,然后逆序for循環(huán)+break來(lái)節(jié)省循環(huán)開(kāi)銷(xiāo)。
第二項(xiàng)涉及的范圍更大,不優(yōu)化的話(huà)哪怕是平均復(fù)雜度也會(huì)退化到。觀察到dp單調(diào)遞增,因此可以貪心地選
。容易證明替換后一項(xiàng)后,dp依然是單調(diào)遞增的,并且答案依然是最優(yōu)的。
和其他最優(yōu)化dp問(wèn)題一樣,只需要在狀態(tài)轉(zhuǎn)移時(shí)記錄前一狀態(tài),就可以在對(duì)應(yīng)生成的邊反向的樹(shù)上反向追溯最優(yōu)解。這樣就得到了最大覆蓋率的切片方案。
雖然說(shuō)應(yīng)該是最優(yōu)解,但我不知道怎么嚴(yán)格證明。歡迎知道怎么證的讀者在評(píng)論區(qū)告訴我!
當(dāng)然上述方程只是最優(yōu)化覆蓋的切片數(shù),而不是最優(yōu)化覆蓋clip的總時(shí)長(zhǎng)。好在只需要簡(jiǎn)單地修改轉(zhuǎn)移方程的第一項(xiàng)即可更改最優(yōu)化目標(biāo),這可以通過(guò)clip對(duì)應(yīng)的duration的前綴和數(shù)組快速實(shí)現(xiàn)。最終我也使用了總時(shí)長(zhǎng)最優(yōu)化來(lái)實(shí)現(xiàn)代碼,如下所示:
這次繼續(xù)在AV860286073_part1上測(cè)試,但是同時(shí)對(duì)比三種方案的覆蓋率:

對(duì)于說(shuō)話(huà)更密集的數(shù)據(jù),例如AV566314551_part1,三種不同合并方案的覆蓋率和silence比例也大致不變:

然而切出來(lái)的所有數(shù)據(jù)里有50%都是silence,如果它們被SVC系統(tǒng)認(rèn)為是需要擬合的部分,會(huì)影響系統(tǒng)的性能。在引入非線性artifact和擬合silence之間,我選擇了去除silence。所以我又寫(xiě)了remove_silence函數(shù):
結(jié)果加上這個(gè)之后,dynamic gap也能經(jīng)常做到100%覆蓋率了,dp除了保證能提供最大化覆蓋率同時(shí)最小化silence比例的最優(yōu)解之外,好像也沒(méi)什么優(yōu)勢(shì)了。

呃,結(jié)果搞半天可能根本就不需要dp啊。
Bonus: 如何替換勾指起誓封面的字體顏色
沒(méi)有PS或者其他專(zhuān)業(yè)圖像處理工具,只有paint.net,選區(qū)替換顏色效果太差,重新找字體也不現(xiàn)實(shí)?,F(xiàn)在我剛完成了整首曲子的混母,很想快點(diǎn)投稿讓其他喜歡cp的朋友們也聽(tīng)到,但是就是差個(gè)漂亮的有cp代表色的封面,很急很急很急很急,怎么辦呢?
答案是PIL!
原理就是將目標(biāo)范圍內(nèi)的顏色的hue調(diào)整到目標(biāo)hue和saturation。最終就能得到小圖效果相當(dāng)不錯(cuò)的cp標(biāo)志色的封面咯!不過(guò)要是放大看的話(huà),邊緣還是不太行。

失敗的過(guò)濾器
前面都是簡(jiǎn)單的部分,如果目標(biāo)清晰的話(huà)只需要一晚上就能寫(xiě)完。拖了那么久才更新,是因?yàn)榇蠹s有一個(gè)多月的時(shí)間都浪費(fèi)在實(shí)現(xiàn)并提升過(guò)濾器的準(zhǔn)確率上,最后發(fā)現(xiàn)再怎么過(guò)濾都不如直接用人工篩選過(guò)的干凈數(shù)據(jù)源切塊后丟進(jìn)預(yù)訓(xùn)練模型效果來(lái)得好。
下面是我掙扎著寫(xiě)了一個(gè)月的過(guò)濾器的結(jié)構(gòu):

這個(gè)系統(tǒng)太過(guò)trivial,相比端到端又太過(guò)于復(fù)雜,以至于理所當(dāng)然般地沒(méi)什么好結(jié)果。訓(xùn)練數(shù)據(jù)只有5分鐘更是雪上加霜。
系統(tǒng)會(huì)使用不同的預(yù)訓(xùn)練模型,在音頻切片后計(jì)算說(shuō)話(huà)人向量。對(duì)于訓(xùn)練數(shù)據(jù),所有的說(shuō)話(huà)人向量會(huì)被用于訓(xùn)練novelty detector model(見(jiàn)上圖紅色部分),這個(gè)模型會(huì)在之后被用來(lái)計(jì)算評(píng)估集上的分離準(zhǔn)確率。以下是使用的所有說(shuō)話(huà)人向量與模型:
dvector (yistLin/dvector), vggish, VI-Speaker, ECAPA-TDNN (speechbrain)
Isolation Forest, Local Outlier Factor, Gaussian Mixture, One Class SVM, 以及受花兒不哭老師啟發(fā)而實(shí)現(xiàn)的取embedding在L2空間內(nèi)的平均值+余弦距離的打分器
訓(xùn)練集是長(zhǎng)達(dá)5分鐘的人工篩選的高質(zhì)量C醬干聲。eval集含有157條正樣例,124條負(fù)樣例。
我本以為能從各種各樣沒(méi)能被demucs消除干凈的干擾中提取出高質(zhì)量的干聲,盡可能提升數(shù)據(jù)量,結(jié)果到頭來(lái)似乎還不如寫(xiě)個(gè)網(wǎng)站讓艦長(zhǎng)群的朋友們幫忙一起篩選。越想越覺(jué)得不該一個(gè)人鉆牛角尖。
具體的代碼太長(zhǎng)不貼了,反正效果一團(tuán)糟。整個(gè)管線跑下來(lái),能得到模型的分類(lèi)結(jié)果的閾值、f1和準(zhǔn)確率:
可視化分類(lèi)結(jié)果后可以看到類(lèi)似這樣的輸出:

根據(jù)最高的準(zhǔn)確率/f0位置,可以簡(jiǎn)單地定義得到基于閾值的分類(lèi)器。
將過(guò)濾器,分類(lèi)器與切片器結(jié)合,可以得到類(lèi)似這樣的結(jié)果:

看起來(lái)很不錯(cuò)。然而,生成的切片中容易出現(xiàn)切片首尾存在其他人聲的情況。由于打分是基于平均的相似度,因此先切片再分類(lèi)的做法容易引入臟數(shù)據(jù),降低數(shù)據(jù)集質(zhì)量。因此,我又實(shí)現(xiàn)了先計(jì)算相似度曲線,后根據(jù)曲線+閾值確定說(shuō)話(huà)區(qū)間的做法。在688399338_part2上結(jié)果如下:

C醬說(shuō)話(huà)的聲音比游戲中經(jīng)過(guò)電平處理,峰值均勻統(tǒng)一的信號(hào)要響不少,因此僅通過(guò)輸入波形也能分辨出C醬說(shuō)話(huà)的部分。然而容易發(fā)現(xiàn),游戲內(nèi)配音的部分也有較高的打分,因而說(shuō)明分離度較差。
此外,這個(gè)系統(tǒng)在干凈的數(shù)據(jù)上表現(xiàn)出傾向于給“密集說(shuō)話(huà)”片段打高分的傾向,而不關(guān)心說(shuō)話(huà)人是否準(zhǔn)確。也許是因?yàn)閎lock size為3秒,導(dǎo)致時(shí)域分辨率太低。但是說(shuō)話(huà)人向量大多是在較長(zhǎng)的語(yǔ)音片段上訓(xùn)練的,編碼器在更小的block size上給出的向量的準(zhǔn)確率未知,因此也不能貿(mào)然通過(guò)更小的blocksize和hopsize提升分辨率。
一種準(zhǔn)確率遠(yuǎn)高于基于speaker embedding方法的分離方式是,注意到在C醬換麥克風(fēng)之前的數(shù)據(jù)中,其環(huán)境底噪在55Hz附近有一個(gè)明顯的正弦波分量;并且由于麥克風(fēng)自動(dòng)根據(jù)輸入電平大小mute/unmute輸出,因此很容易通過(guò)高階帶通濾波器+sosfiltfilt+閾值來(lái)得到精確的說(shuō)話(huà)區(qū)間。然而因?yàn)槲也皇褂门f麥克風(fēng)的數(shù)據(jù),因此這樣的觀察沒(méi)什么用。
展望
如果要繼續(xù)的話(huà),應(yīng)該從哪些地方改進(jìn)呢?
在sovits/diffsvc之外,最新的工作,像是VALL-E這樣有zero-shot TTS能力的模型,要是也能用于SVC就好了。但這也只是沒(méi)看過(guò)論文的外行小白的揣測(cè)罷了。可能看完abstract我就會(huì)立刻后悔打出這行字此外其社區(qū)實(shí)現(xiàn)還在積極開(kāi)發(fā)中,沒(méi)有可用的預(yù)模型,所以短期內(nèi)可能還沒(méi)什么盼頭。
預(yù)訓(xùn)練模型很好,但是在數(shù)據(jù)量較小的時(shí)候,DiffSVC還是會(huì)逐漸收斂到很糊的人聲上。也許基于diffusion方法的語(yǔ)音生成已經(jīng)有了新的改良,只是還沒(méi)有像sovits/diffsvc這樣可用?畢竟DiffSinger是21年的工作,如今已經(jīng)過(guò)了兩三年了。我想應(yīng)該多看看相關(guān)論文,要是真有的話(huà),說(shuō)不定早就有更好的模型呢?此外DiffSVC在質(zhì)量較差的推理源上受到的影響似乎比sovits嚴(yán)重的多,要是有相關(guān)理論分析并且加以改善就好了。
一個(gè)比較簡(jiǎn)單的改進(jìn)是把DiffSVC的內(nèi)容編碼向量從Soft Hubert換成ContentVec,這個(gè)應(yīng)該有點(diǎn)基礎(chǔ)改個(gè)半小時(shí)源碼就能跑起來(lái)。但是它的性能究竟是不是真的更好,還是要看論文和實(shí)驗(yàn)才知道。另外也沒(méi)有基于ContentVec的預(yù)訓(xùn)練模型,改出來(lái)也不能用。FishDiffusion似乎已經(jīng)完成了這一點(diǎn)改良,但我還沒(méi)試過(guò)效果。
除了模型,預(yù)處理上能做的事情還有很多,畢竟上面的分離系統(tǒng)的性能只能用一坨來(lái)形容。
一種可能的方式是使用target speaker extraction的各種SOTA系統(tǒng)進(jìn)一步過(guò)濾數(shù)據(jù)集。例如今年1月底,speech separation的一篇新SOTA提出了一種全新的能夠?qū)⒎蛛x信號(hào)的理論上限SNR提升3dB的方法。對(duì)于TSE任務(wù),類(lèi)似的方案也許也能獲得很好的效果,例如用SpEx+替換架構(gòu)圖中的B模塊。代價(jià)就是得自己動(dòng)手實(shí)現(xiàn)(......)不過(guò)既然預(yù)訓(xùn)練模型都可用,也許只要花幾個(gè)月就能寫(xiě)出來(lái)。
除此之外,也許也可以自己訓(xùn)練一份DeepFilterNet的參數(shù),但是參雜更多游戲音效在內(nèi)。只是這么做似乎只是在為demucs擦屁股而已。這么想的話(huà),最后這個(gè)分類(lèi)器可以認(rèn)為是更廉價(jià)的擦屁股紙巾,然而我卻在提升廉價(jià)紙巾的韌度和易用性上浪費(fèi)了一個(gè)多月,哈哈。
關(guān)于咬字的問(wèn)題,畢竟內(nèi)容編碼器是對(duì)所有語(yǔ)音通用的,但為了極致的“聽(tīng)起來(lái)就是本人”的效果卻不得不一直和這種不可控因素虛空較勁,很打擊創(chuàng)作的熱情。所以下一步應(yīng)該會(huì)試試DiffSinger,看了一下數(shù)據(jù)集的處理還挺簡(jiǎn)單的,應(yīng)該很快就能出效果。畢竟是基于拼音標(biāo)注的,想必也能學(xué)到不同音素的獨(dú)特發(fā)聲方式,進(jìn)一步逼近真人吧。
當(dāng)然說(shuō)不定效果最好的是用鈔能力拜托C醬錄一些干聲素材然后訓(xùn)練。只是那么做有一種自己輸了的感覺(jué)。
畢竟我不是機(jī)器學(xué)習(xí)從業(yè)者,總覺(jué)得自己的思路完全沒(méi)打開(kāi)。要追求前沿的極限效果,還是得多看論文多動(dòng)手才行啊。
總結(jié)
有時(shí)候會(huì)想,要是沒(méi)有浪費(fèi)這一個(gè)月鉆牛角尖的話(huà),是不是就能趕上情人節(jié)了呢?
其實(shí)給cp勾指做完整版不會(huì)再有多少額外的數(shù)據(jù)提升。但我還是做了。理由很簡(jiǎn)單,和你們一樣,我也想要聽(tīng)到。
但是做完之后,反而因?yàn)槁?tīng)了太多太久已經(jīng)沒(méi)有再聽(tīng)的欲望。那努力了這么久,究竟是圖什么呢。
看到觀眾在彈幕里聯(lián)想閃閃發(fā)光才驚覺(jué)原來(lái)歌詞也這么適合這他倆。作為創(chuàng)作者的我因?yàn)闀r(shí)時(shí)刻刻關(guān)注咬字聲線時(shí)值音高融合度這些更底層的音頻細(xì)節(jié),早就沒(méi)有那種他倆真的一起在唱歌的幻覺(jué)了。
真羨慕觀眾。