人腦對(duì)聲音的反應(yīng)速度和敏感性很高。
K歌時(shí)對(duì)人聲音軌和伴奏音軌的時(shí)間對(duì)齊有很強(qiáng)的要求。唱吧資深研發(fā)總監(jiān) 王國騰在LiveVideoStackCon2018大會(huì)的分享中詳細(xì)介紹了手機(jī)K歌在混音對(duì)齊方面存在的問題,解決方案以及值得探索的方向。LiveVideoStack對(duì)演講內(nèi)容進(jìn)行整理。文 / 王國騰
整理 / LiveVideoStack
大家好,我是王國騰,在唱吧主要負(fù)責(zé)音視頻技術(shù)的研發(fā)和音頻新技術(shù)的科研工作。本次將主要為大家介紹手機(jī)K歌在混音時(shí)間對(duì)齊方面存在的問題,常規(guī)的工程解決方案以及值得探索的方向。
1、手機(jī)K歌簡介
手機(jī)K歌APP模擬的唱歌過程中兩個(gè)主要的界面場景,演唱和預(yù)覽。演唱界面,用戶跟隨伴奏和提示的歌詞完成唱歌,主要生成一股人聲的干聲。預(yù)覽界面提供了很多音效的后期處理。包括音準(zhǔn)和節(jié)奏的校準(zhǔn)、特效或預(yù)制的混音需求,干聲和伴奏的合成預(yù)覽,甚至是分析人聲特點(diǎn),添加一些動(dòng)態(tài)的音效,做到一鍵修音。
2、音質(zhì)的評(píng)價(jià)標(biāo)準(zhǔn)
聲音后處理的效果要如何評(píng)價(jià)呢?比如一些混音師,他們有時(shí)候會(huì)說這個(gè)聲音很頂,不夠飽滿,然而從工程和科學(xué)的角度,我們從幾個(gè)抽象維度描述音效:還原度,清晰度,區(qū)分度,瑕疵的掩蓋能力,以及音樂和聲音融合度。
還原度是一個(gè)比較客觀的量化標(biāo)準(zhǔn),即聲音重放質(zhì)量與原聲對(duì)比,能夠達(dá)到怎么樣的程度;清晰度形容人聲“咬字清晰”,比如說到元音的時(shí)候瞬態(tài)好不好,說到輔音的時(shí)候音量是不是過大或者過小了。如果輔音的音量太大的話,聽起來會(huì)比較刺耳,如果音量太小的話,會(huì)有點(diǎn)像大舌頭似的感覺。區(qū)分度是我們?cè)黾拥囊粋€(gè)指標(biāo),希望用戶能夠有很多不同的選擇。比如說以前在八九十年代的大搖滾的作品,都會(huì)做很大的混響,而現(xiàn)在一般都會(huì)把這個(gè)聲音做得比較干,期望將歌手的原音表達(dá)更清楚。瑕疵掩蓋能力是指即便音準(zhǔn)和節(jié)奏都正確,但由于個(gè)人的音色引起的一些聲音處理的問題。比如鼻音比較重的話,在音效處理的時(shí)候,我們應(yīng)該怎樣去處理這種瑕疵問題,還有些人唇齒音會(huì)比較重,這種問題要怎么處理,是瑕疵掩蓋能力。音樂和聲音融合度,人聲也是寬帶信號(hào),在低頻上面,諧波會(huì)多一些。一段音樂伴奏,它所能覆蓋的頻段是比較寬的,那么該怎樣將這兩個(gè)聲音融合在一起,并且還能清楚的聽到人聲。而另外一個(gè)就是在音樂上面特有的問題,節(jié)奏是應(yīng)該嚴(yán)格對(duì)齊的。音準(zhǔn)和節(jié)奏都是有融合度問題,音準(zhǔn)和節(jié)奏不準(zhǔn)了,聽起來會(huì)是個(gè)跑調(diào)的狀態(tài)。
我們假設(shè)人聲唱的節(jié)奏本身沒有問題的話,將人聲和伴奏混在一起,如果偏差超過了35毫秒,人耳就會(huì)感覺到異常,如果超過50毫秒,就已經(jīng)是不可接受的了。除此之外,根據(jù)我們所做的雙盲測試,專家級(jí)的耳朵,如果人聲比伴奏提前10~15毫秒,或者是比伴奏晚了25毫秒,那么在專家級(jí)別人的耳中是有感覺的??偟膩碚f,偏差在35毫秒之內(nèi)大約有90%的人是沒有感受的。在音樂節(jié)奏的場景下,人的耳朵會(huì)非常敏感。在唱歌時(shí),聽到音樂的人本身對(duì)節(jié)奏會(huì)有一個(gè)認(rèn)識(shí),然后會(huì)再根據(jù)這個(gè)節(jié)奏唱出自己的聲音,一般歌曲的速度穩(wěn)定,那么唱歌的人也會(huì)跟隨穩(wěn)定的速度演唱,由此可見人本身就是無延遲的反饋系統(tǒng)。
3、時(shí)間偏移要義
演唱時(shí)間偏移主要分成兩大類,一類是演唱實(shí)時(shí)反饋的時(shí)間偏移,一類是混音對(duì)齊的時(shí)間偏移。
演唱實(shí)時(shí)反饋的時(shí)間偏移,主要關(guān)注的是演唱時(shí),人聲與從耳機(jī)反饋回去(實(shí)時(shí)耳返)的聲音之間的實(shí)時(shí)偏移。這個(gè)偏移量一般我們要控制在30毫秒以下,如果在30毫秒以上,人唱歌的時(shí)候會(huì)受到一些影響;在50毫秒的時(shí)候,演唱就會(huì)變得非常困難。混音對(duì)齊關(guān)注的是人聲和伴奏能否以對(duì)齊的方式混合在一起。
這里介紹一個(gè)測試演唱實(shí)時(shí)反饋的方法。找一個(gè)示波器,分別采樣麥克風(fēng)和耳機(jī)的聲音信號(hào),測試人員可以發(fā)出一些比較短促的聲音,如敲擊或是脈沖。此時(shí)示波器上可以看到分別從麥克風(fēng)采集出來的脈沖與從耳機(jī)得到脈沖,通過兩個(gè)脈沖的時(shí)間差就能了解到演唱實(shí)時(shí)反饋的時(shí)間偏移量的大小。
在安卓設(shè)備的系統(tǒng)中,各個(gè)廠家通常會(huì)做一些標(biāo)識(shí),”low_latency” tag 和”” tag,這兩個(gè)tag會(huì)告訴開發(fā)人員,手機(jī)的演唱實(shí)時(shí)反饋偏移量的大小?!眑ow_latency”關(guān)注的是在手機(jī)中播放一個(gè)聲音,從需要播放到speaker真正發(fā)出聲音來,偏移量的大小,一般是在45毫秒以下。而audio.pro則是round trip的時(shí)間,通常在20毫秒以內(nèi)。
造成演唱實(shí)時(shí)反饋時(shí)間偏移的原因分為以下幾種:計(jì)算性能導(dǎo)致的,系統(tǒng)性能導(dǎo)致的,處理緩沖區(qū)導(dǎo)致的時(shí)間偏移。
4、安卓手機(jī)的優(yōu)化處理
上圖為安卓手機(jī)處理聲音的示意圖,我們從Speaker輸入聲音,依次經(jīng)過ADC,總線Bus,Driver,Audio Recorder,應(yīng)用程序,再轉(zhuǎn)回來整個(gè)一圈的處理時(shí)間,就是之前提到的round trip 時(shí)間。除此之外,在應(yīng)用層時(shí)我們還會(huì)將聲音信號(hào)單獨(dú)寫出一個(gè)文件,用來進(jìn)行后處理。我們希望能將演唱實(shí)時(shí)反饋的延遲時(shí)間控制在30毫秒以內(nèi),然而在上述過程中的每個(gè)處理步驟都會(huì)花掉一些時(shí)間,一般情況下,audio flinger可能會(huì)花掉10~20毫秒,audio track可能會(huì)花掉20~40毫秒。當(dāng)然,根據(jù)設(shè)備的不同,實(shí)際耗時(shí)也會(huì)有所不同。
上圖展示是我們所做的一種通用的耳返延遲優(yōu)化方案,將之前上層的audio record和audio Track改成用Open SL來處理。因?yàn)镺pen SL本身是稍微偏底層的接口,這樣我們就可以避免掉不少延遲量,并且這個(gè)延遲量是相對(duì)穩(wěn)定的。針對(duì)相同型號(hào)的手機(jī)它們的差別并不是很大,并且在不同錄制上面的差別也比較小。
上圖是現(xiàn)有國產(chǎn)手機(jī)時(shí)間延遲的解決方案,因?yàn)樗鼈兪謾C(jī)延遲量的性能指標(biāo)不滿足需求,所以就找到了另外一種方式來繞過這個(gè)問題。把一個(gè)聲音從麥克風(fēng)錄進(jìn)去,我們只進(jìn)行半?yún)^(qū)的處理后保存下來。耳返的聲音從手機(jī)麥克風(fēng)添加的旁路芯片直接出來,這種做法的延遲量能夠控制的非常小,但芯片處理得到的耳返音效,甚至音量等因素,都很難控制。并且每個(gè)廠商會(huì)有自己不同的方案,處理的情況也都各不相同,這也大大增加了應(yīng)用程序上控制的難度。另外,由于安卓手機(jī)型號(hào)碎片化的問題,需要我們一個(gè)一個(gè)去做,進(jìn)展是還是比較緩慢的。但我們?nèi)匀豢梢蕴峁┮恍┙?jīng)驗(yàn),比如說我們拿Open SL來處理IO,但是不要處理音效,在旁路添加C++ code來完成。因?yàn)镺pen SL做音效存在較多問題,可能會(huì)快15~20毫秒,甚至?xí)霈F(xiàn)丟幀。如果我們需要在耳返處理添加實(shí)時(shí)效果器,一定要保證效果器是實(shí)時(shí)的,處理本身的固定緩沖延遲盡可能小。當(dāng)效果器處理是大計(jì)算性能的話,我們要考慮讓它走一個(gè)旁路來完成異步處理,只讓濕聲去走效果器,干聲仍然直接按原路回來,這樣的話,我們可以把這個(gè)延遲量控制的只是干聲的延遲量。在安卓上面可以用一些NEON指令做運(yùn)算優(yōu)化,在iOS上面會(huì)用DSP做計(jì)算的優(yōu)化。
5、混音對(duì)齊要義
混音對(duì)齊延遲再細(xì)分成4個(gè)場景,錄放的首幀延遲,演唱中斷偏移,效果去處理延遲和歌手演唱誤差。歌手演唱誤差很好理解,屬于自身唱得就不準(zhǔn)。錄放首幀延遲是指錄音文件第一幀時(shí)間與伴奏的時(shí)間相比較,如果二者在現(xiàn)實(shí)中不一致的話,就會(huì)產(chǎn)生播放首幀延遲。效果器處理延遲,是指我們?cè)谧鲂盘?hào)處理的時(shí)候,可能會(huì)存在一些算法導(dǎo)致的延遲,此外還有一些計(jì)算性能導(dǎo)致的延遲。演唱中斷偏移則是由一個(gè)特殊的功能導(dǎo)致的,是指我們?cè)谟檬謾C(jī)APP唱歌的時(shí)候,是有可能暫停的,比如來個(gè)電話、回個(gè)微信或者錄了一句不滿意反復(fù)錄播,暫停以后繼續(xù)切回來。這個(gè)時(shí)候,如果本身就存在錄放延遲的話,那么中斷一次就會(huì)導(dǎo)致再產(chǎn)生一個(gè)新的錄放首幀延遲,這個(gè)延遲累計(jì)起來就會(huì)是一個(gè)比較嚴(yán)重的問題了。有可能前面還是在可控制范圍之內(nèi),到后面延遲越來越大,就無可奈何了。
那么我們?cè)趺慈ソ鉀Q這四類問題呢?分析一下造成首幀延遲的原因,一般設(shè)備初始化IO調(diào)用的時(shí)候會(huì)產(chǎn)生延遲,最直接的解決方法就是把音頻的錄音設(shè)備和放音設(shè)備相關(guān)初始化提前到我們真正開始寫文件和開始播放的時(shí)候。首幀延遲問題不光存在安卓和IOS里,小程序中的這個(gè)問題更嚴(yán)重。如果沒有將初始化的時(shí)間提前到足夠量的話,那么最終混音出來的伴奏和人聲的時(shí)間差可能達(dá)到1~2秒的級(jí)別。第二個(gè)是減少系統(tǒng)開銷,系統(tǒng)開銷主要是會(huì)造成播放首幀延遲的抖動(dòng),形成不穩(wěn)定的延遲量。而如果是在穩(wěn)定延遲量的情況下,我們可以通過做一些白名單的方式去解決?,F(xiàn)在國產(chǎn)的一些旗艦機(jī),它們的錄放首幀延遲基本都是穩(wěn)定的,甚至有些可以滿足30毫秒之內(nèi)的要求。但也有不少低端機(jī)型的延遲量比較大,能夠到100~200毫秒。除此之外,現(xiàn)在安卓手機(jī)的KTV APP里,都會(huì)保留著一個(gè)slide bar來進(jìn)行人肉對(duì)齊。
效果器延遲的問題就比較好解決,因?yàn)榛煲魧?duì)齊是后處理,不受計(jì)算性能的影響,我們只要保證它不丟幀,因?yàn)槊恳粠娜寺暥紩?huì)對(duì)應(yīng)到每一幀內(nèi)伴奏上面,所以它的混音對(duì)齊不管是計(jì)算性能好,還是計(jì)算性能差,都一定是從第一幀開始對(duì)齊,到最后一幀還是對(duì)齊的。我們需要考慮的是,算法延遲量是什么樣的,如果算法的延遲量是一個(gè)比較穩(wěn)定且理論上可以計(jì)算的話,這件事情就比較簡單了。我們最終把人聲和伴奏混在一起的時(shí)候,把延遲量再找回來就好了。還有一些效果器,可能是不穩(wěn)定的偏移,只能從算法上做優(yōu)化,比如說剛才我講的實(shí)時(shí)反饋的延遲量,也是可以通過這種方式來解決的,我們?cè)跐衤暫透陕暽线M(jìn)行單獨(dú)的處理。還有一些效果器本身就是一個(gè)不穩(wěn)定偏移量,沒有辦法做一路濕聲,那么我們就只能從算法上盡量把它減小。
再單獨(dú)說一下演唱中斷偏移,比如說暫停或重復(fù)上一句,這樣都會(huì)導(dǎo)致一些演唱中斷偏移。其解決方法與上文錄放首幀偏移是類似的。需要注意的一點(diǎn)就是用戶要暫停這件事情從根本上說并不是要停止錄制,而只是想暫停一下,那么我們就可以用靜音做播放補(bǔ)償,如果錄放需要快進(jìn)的話,我們可以再做剪接。
我們?cè)诔璧臅r(shí)候,如果需要暫停,我們不需要讓播放伴奏這一路真正的停止播放,而是插入靜音幀。人聲這一路,也是同樣的處理,因?yàn)橐坏┩V共⒅匦逻\(yùn)行就會(huì)產(chǎn)生新的錄放首幀延遲。如果選擇靜音,我們只需要在最后混音的時(shí)候,嚴(yán)格減去相同的靜音數(shù)據(jù)就可以完成同步。
人聲在K歌的時(shí)候是一個(gè)貼唱的過程。貼唱就是指我們現(xiàn)在已經(jīng)有一個(gè)伴奏,人聲根據(jù)伴奏逐句演唱。人聲演唱時(shí)包含以下特點(diǎn):輔音提前,元音對(duì)齊;伴奏速度基本穩(wěn)定;節(jié)奏型出錯(cuò)少,速度型出錯(cuò)多。那么根據(jù)這些特點(diǎn)我們?cè)撊绾谓鉀Q混音對(duì)齊的問題?我們可以分析識(shí)別人聲的節(jié)奏特點(diǎn),比如我們可以將元音的時(shí)間全都找出來,將伴奏的速度找出來,然后再去做宏觀偏移,這個(gè)宏觀偏移是我們整首歌的宏觀編譯,也可以是按句的宏觀偏移。將每一句拉伸,壓縮,做偏移,再和伴奏的速度對(duì)比,這樣就可以比較容易的解決歌手演唱誤差導(dǎo)致的時(shí)間偏移。例如唱吧的預(yù)覽界面中展示的一鍵修音功能。
還有其它有關(guān)K歌對(duì)齊的問題,比如說丟幀遷移,當(dāng)本身計(jì)算性能有問題的時(shí)候,產(chǎn)生丟幀,勢必會(huì)造成偏移;還有像原唱和伴奏切換時(shí)的偏移,原本混音是按伴奏來進(jìn)行的,但由于原唱和伴奏之前的時(shí)間差,人聲伴奏在混音時(shí),就會(huì)產(chǎn)生一些偏移量。像歌詞和伴奏的同步,一般只有在差別比較大的時(shí)候才會(huì)出現(xiàn)問題,因?yàn)槿说难劬ο鄬?duì)來說沒有那么敏感;然后就是異步合唱,當(dāng)我唱完歌曲中的一部分后,再去找另外一個(gè)人,補(bǔ)充一個(gè)唱段,這樣就可能會(huì)多次產(chǎn)生偏移;當(dāng)然還有合唱直播,清唱伴奏跟隨,DJ無縫切歌,節(jié)奏修正等等其它我們可能遇到的一些K歌中的人聲伴奏對(duì)齊問題。
1.《手機(jī)K歌的人聲伴奏對(duì)齊優(yōu)化實(shí)踐》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。
2.《手機(jī)K歌的人聲伴奏對(duì)齊優(yōu)化實(shí)踐》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/gl/3112977.html