游戲音頻存檔 | 第 2 部分:案例分析

今天我們要講的是之前一個(gè)研究項(xiàng)目當(dāng)中的偶然發(fā)現(xiàn)??上ё罱K未能得償所愿,過程聽起來也有些曲折。別著急,聽我慢慢說??偟膩碚f,在進(jìn)行歷史研究的時(shí)候,這種意外發(fā)現(xiàn)并不少見?!禖onker's Bad Fur Day》研究項(xiàng)目就是個(gè)典型的例子。這要從我當(dāng)時(shí)寫的一篇關(guān)于 Nintendo 64 聲音系統(tǒng)的推文說起。帶著最初的疑問,我開始著手研究。后來牽出了很多問題,最后險(xiǎn)些以災(zāi)難收場。當(dāng)然,說“災(zāi)難”有點(diǎn)夸張了。不過,在看完本文之后,各位可能也會(huì)心有戚戚。

意外發(fā)現(xiàn)
N64 的聲音系統(tǒng)操作起來非常復(fù)雜。硬件本身不帶專用聲卡、芯片或處理器。為此,開發(fā)者只能各顯神通從頭開始構(gòu)建整套東西,以便使用 RCP 和 RSP 處理器播放音樂、音效和配音。為了維持 N64 系統(tǒng)在聲音、圖形、AI、數(shù)據(jù)存儲(chǔ)等方面的脆弱平衡,當(dāng)時(shí)大家想出了各種各樣的技術(shù)解決方案。就聲音而言,這種脆弱的平衡反過來也塑造了 N64 的發(fā)展歷史。然而,這段歷史并沒有多少人了解。所以,要想弄清其中的來龍去脈絕非易事。在研究過程中,我發(fā)現(xiàn) Rare Limited 很可能是第一個(gè)在像《Conker》和《Perfect Dark》這樣的游戲中使用 MP3 有損音頻壓縮格式的游戲開發(fā)商。于是,我就忍不住想“他們是怎么做的?”。要知道,當(dāng)時(shí) MP3 還是一種很新的格式,90 年代末的時(shí)候遠(yuǎn)沒有像之后那樣流行。在對游戲的文件格式進(jìn)行整合時(shí)肯定會(huì)有所取舍,這可能會(huì)讓人更加難以理清游戲音頻的發(fā)展脈絡(luò)。在搜集材料的時(shí)候,我發(fā)覺當(dāng)中只有對白使用了 MP3 格式。說來倒也合情合理,換做音樂的話,這種程度的壓縮率估計(jì)沒法聽。
我在瀏覽一個(gè)技術(shù)愛好者論壇的時(shí)候偶然間發(fā)現(xiàn)了一篇舊帖,有人居然提取了《Conker》中的所有 MP3 文件。這些音頻片段涵蓋了游戲中所有的角色語音。提取出來的其他文件聽起來都跟游戲中一樣,唯獨(dú) Conker 有所不同。這位主角的語音好像被加快了,而且當(dāng)中包含很多雜音。帖子中上傳了不少文件,不妨從里面隨便挑幾個(gè),看看是否每個(gè)都是如此。我們不知道作者到底用什么工具提取的文件,很難說這些奇怪的雜音就是提取不當(dāng)造成的。這樣假設(shè)未免太過牽強(qiáng)。別的文件怎么好好的呢,對吧?我看了一些混有 Conker 和其他角色語音的文件,偏偏只有 Conker 的語音存在前面說的加速問題。憑我有限的技術(shù)水平,實(shí)在想不出其中緣由。于是,我就請我的朋友?@Percight?前來幫忙。結(jié)果他也不清楚怎么回事,最后只好通過測試來查證。
在?@Percight?做完測試之后,我們還是沒搞明白具體什么原因。不過,好在慢慢摸索出了其中的一些門道。我們之所以無法弄清究竟為什么存在這一奇怪的音頻現(xiàn)象,關(guān)鍵在于不知道當(dāng)時(shí)使用了哪些反編譯、提取和解壓工具[存檔人員注:知道使用了哪些工具很重要,對非官方工具來說更是如此。我們可以猜測使用了哪些工具提取文件,但沒有辦法確定具體使用的是哪個(gè)版本,這樣的話就不好排除與版本有關(guān)的問題]。我們發(fā)現(xiàn),在使用不同的 MP3 讀取工具時(shí),Conker 的語音聽起來會(huì)有區(qū)別。為此,我將 MP3 文件轉(zhuǎn)碼為了 WAV 格式,以在 Acousmographe 工具中運(yùn)行頻譜分析。在使用 Windows 的默認(rèn)播放器時(shí),MP3 充滿了雜音和靜電干擾,根本聽不清 Conker 在說什么。WAV 版本聽起來還行,只不過速度加快了。這個(gè)時(shí)候,我們想到了論壇原帖中提到的大膽設(shè)想。會(huì)不會(huì)是為了節(jié)省存儲(chǔ)空間而有意將 Conker 的語音加快了?這個(gè)角色是游戲當(dāng)中話最多的,其對白會(huì)占用大量的數(shù)據(jù)空間。所以,這么做有沒有可能是想避免占用 N64 卡帶空間呢(當(dāng)時(shí)最大只有 64 MB)?
那么問題來了:如果是為了節(jié)省空間,為什么不把所有角色的語音都加快呢?要知道,不管對于哪種假設(shè),各種可能都要想到。
聽聽下面的片段,注意 Conker 的聲音效果。CW: Language。
https://www.audiokinetic.com/media/blog/Conker_Reserve_bank.mp3
歷史線索
經(jīng)過技術(shù)分析,我們做出了大膽的猜測。難道真的是為了節(jié)省空間才把游戲中的語音加快了?然而我們并沒有辦法證實(shí)自己的這一猜測,于是便試著查了查之前有沒有類似的先例。現(xiàn)在研究電子游戲歷史有一點(diǎn)好處,就是目前很多游戲開發(fā)人員還健在。我們可以面對面跟創(chuàng)作者進(jìn)行交流,從專業(yè)的角度了解當(dāng)時(shí)的一些情況。對各位來說可能聽起來很簡單,尤其游戲行業(yè)有那么多研討會(huì)。但有些問題最好還是趁早查實(shí),因?yàn)闀r(shí)間長了很容易記不清楚。隨后,我們試著通過 Twitter 與《Conker》的作曲家羅賓?賓蘭 (Robin Beanland) 進(jìn)行聯(lián)系,沒想到很快就得到了答復(fù)。他表示,如果只有對白使用了 MP3 格式,降到像 24 ~ 40 kb/s 這么低的比特率,何況樂曲還采用了品質(zhì)更高的格式,最終會(huì)很難確保角色語音清晰可辨。所以,他并不贊同我們關(guān)于節(jié)省空間的猜測,而且他也沒聽說過有這樣的事情。據(jù)我們所知,《Conker》是 Rare Limited 運(yùn)用 MP3 格式的第一款游戲。不過,在發(fā)布之前,代碼交給了《Perfect Dark》的開發(fā)團(tuán)隊(duì),所以他們也可以使用。能得知這些內(nèi)情實(shí)屬難得,至少讓我們有了一些眉目。
除此之外,我們還了解到了更多與聲音有關(guān)的細(xì)節(jié)。比如,當(dāng)時(shí)沒法在游戲過程中將 MP3 與 ADPCM 一起解壓和運(yùn)行。這就導(dǎo)致在游戲中專注播放音樂(如《Great Mighty Poo》樂曲)時(shí)格式總是在變(Great Mighty Poo 角色由 Chris Marlow 配音)。這段過場動(dòng)畫使用的是 MP3 格式,而游戲過程中使用的卻是 ADPCM。所以,我們需要知道樂曲什么時(shí)候開始播放。說回奇怪的語音加快問題,除了確認(rèn)并非出于節(jié)省內(nèi)存空間的目的,賓蘭對此也沒有更多的見解。有了這一新的認(rèn)識(shí),@Percight?決定更進(jìn)一步。為此,@Percight?用 Foobar2000 做了轉(zhuǎn)碼,并用 Checkmate MP3 Checker 進(jìn)行分析。不過,老是報(bào)告 unidentified bytes 和 invalid header values 錯(cuò)誤。由此可見,這是某種自定義 MP3。而且,Conker 說話時(shí)所用的標(biāo)頭也很奇怪。事情本來就要到此為止了。幾周后我在 Interactive Audio Montreal (IAM) 月會(huì)上談到了這個(gè)研究項(xiàng)目,然后跟?Plogue?的創(chuàng)立者大衛(wèi)?維恩斯 (David Viens) 交流了一下。沒想到峰回路轉(zhuǎn),又有了新的收獲。
在遇到想不明白的問題時(shí),最好向有關(guān)人員虛心求教。我之所以在 IAM 大會(huì)上談這個(gè)項(xiàng)目,是為了強(qiáng)調(diào)如果試圖脫離游戲這一大背景、沒有音頻團(tuán)隊(duì)的中肯解答,在對音頻的了解上就可能會(huì)犯很大的錯(cuò)誤。在演講結(jié)束之后,有幾位音頻專業(yè)人士跟我反饋了業(yè)內(nèi)的一些現(xiàn)實(shí)狀況。事實(shí)上,幾年前確實(shí)有為了節(jié)省內(nèi)存空間而將對白加快的做法。而且,在作品移交之后,作曲家并不知道接下來會(huì)發(fā)生什么,以及整體上會(huì)達(dá)到怎樣的聲音效果。整合人員的各種技術(shù)處理他們都不知情,自然很難解釋清楚整件事情的前因后果。這些反饋是偶然間得到的,也給我留下了更多的疑問。碰巧,沒多久法國技術(shù)雜志《Canard PC Hardware》便邀請我寫一篇關(guān)于 N64 聲音系統(tǒng)的文章。我心想,太好了,正好可以把這件事拿出來說說。
技術(shù)細(xì)節(jié)
對于執(zhí)著于技術(shù)細(xì)節(jié)的人,不妨看看下面?@Percight?對從 Great Mighty Poo 對白中提取的一個(gè) MP3 文件 (MyButt.mp3) 的分析。在 Great Mighty Poo 和 Conker 之間的這段對話中,語音加快問題更為明顯一些。在這當(dāng)中,與 Conker 語音對應(yīng)的一些幀使用了特定的標(biāo)頭。正常語音所用的標(biāo)頭為?0xFF 0xF3 0x50 0xC0,Conker 語音所用的標(biāo)頭為?0xFF 0xF3 0x50 0xC8(兩者的最后一個(gè)字節(jié)不同)。這表示在理應(yīng)分配給?Copyright?信息的位上將 0000 改為了 1000。就目前來看,這個(gè)位不太可能是為此目的而存在的。由下圖可見,1 表示在該幀的結(jié)尾和下一標(biāo)頭的開頭之間添加了數(shù)據(jù)。不過,這段信息未必帶有版權(quán)內(nèi)容。

奇怪的是,除了配音演員可能用了不同的話筒,從聲譜圖上也沒看出有什么特別的。

另外他還驚訝地發(fā)現(xiàn),并不是每個(gè)與 Conker 語音關(guān)聯(lián)的幀都使用了這一標(biāo)頭。其他文件里有所不同,所以需要進(jìn)一步驗(yàn)證。為此,@Percight?嘗試刪除了源自少數(shù)標(biāo)頭的幀以使文件更加穩(wěn)定,但聲音效果實(shí)在太差了,聽起來就跟音頻播放器選擇忽略默認(rèn)幀而非加速讀取一樣。我們慢慢發(fā)現(xiàn),在把聲音的一部分剪掉并將 Conker 的對白改成亂語時(shí),有些數(shù)據(jù)被抹掉了。于是,@Percight?又試著將所有標(biāo)頭由 0xC8 改為了 0xC0,使文件看起來像個(gè)固定比特率的正常 MP3??上?,最終也沒得到設(shè)想的結(jié)果。不過嘛,試試還是值得的。
最后還有一點(diǎn)有待查明:不知為何,與 Great Mighty Poo 對應(yīng)的幀使文件更大了。Conker 文件比使用不同標(biāo)頭的文件長了 9 個(gè)字節(jié)。為此,他嘗試消除了其各自的 9 字節(jié)分組,結(jié)果文件居然可以正常讀取了。到此,關(guān)于節(jié)省空間的猜測算是被推翻了。
撥云見日
經(jīng)過一番努力,@Percight?總算找到了 Conker 語音加快的原因,接下來只需要弄清這些附加字節(jié)的用途。從其獨(dú)有的模式 (0x4C 0x3A 0x01 0xXX?0x80 0x80/0x81 0xXX?0xXX?0x00) 來看,這些標(biāo)頭顯然不是無緣無故出現(xiàn)的?;谝纛l解碼器無法正常讀取這一情況,我們開始琢磨這會(huì)不會(huì)與聲音本身無關(guān)。這個(gè)問題只能由參與過該項(xiàng)目的人來回答,因?yàn)楸澈蟮脑蚩赡苓h(yuǎn)沒表面上那么簡單。隨著這篇研究文章的截稿日期越來越近,我們設(shè)法與當(dāng)時(shí)的音頻軟件工程師麥克?卡靈頓 (Mike Currington) 取得了聯(lián)系。他非常爽快地回答了我們的所有問題,并且道出了揭開這一謎題缺失的一環(huán)。
他表示,主角 Conker 除了是一只滿口臟話的松鼠,還有我們所沒有注意到的特點(diǎn)。事實(shí)確實(shí)如此。游戲中所有其他角色在對話過程中的口型都是隨機(jī)的,但我們這位主角在動(dòng)畫制作當(dāng)中卻進(jìn)行了特殊的處理。他有很多不同的面部和嘴部表情。這就需要?jiǎng)?chuàng)建各種各樣的面部混合形狀,而設(shè)計(jì)師必須在對話當(dāng)中同步予以實(shí)現(xiàn)。為了方便在過場動(dòng)畫中對口型,麥克?卡靈頓才在 MP3 文件中插入了前面所說的附加字節(jié)。經(jīng)過數(shù)月的研究,我們終于揭開了困擾自己的謎題!我的研究文章總算可以收尾了。
這項(xiàng)研究最初是通過另一推文以法語形式發(fā)表的。多虧 Rare 團(tuán)隊(duì),我們了解到了更多的信息。Conker 卡通語音的音高被調(diào)制了兩個(gè)半音,但整套處理和渲染都是在整合之前完成的。在這個(gè)過程中,羅賓?賓蘭確保了語音時(shí)長保持不變。所以,絕對不存在為了節(jié)省存儲(chǔ)空間而將語音加快的情況。

克里斯?西弗 (Chris Seavor) 最近在他的 Twitter 帳戶上分享了關(guān)卡設(shè)計(jì)草圖。各位不妨借此看看游戲在開發(fā)當(dāng)中是如何演變的(圖片來源:https://Twitter.com/conkerhimself/status/1359160911769010183)(經(jīng)克里斯?西弗友好授權(quán)使用)
最后總結(jié)
在此,我要感謝有關(guān)人員的默默努力、無私分享和熱心幫助。正是因?yàn)樗麄儯覀儾诺靡越议_ Conker 語音加快背后的謎題。在這當(dāng)中,假如沒有?@Percight?的分析和原創(chuàng)游戲音頻團(tuán)隊(duì)的解答,我可能會(huì)錯(cuò)誤地以為 Conker 語音加快是為了節(jié)省存儲(chǔ)空間。這聽起來好像不是什么大問題,但卻可能給人造成嚴(yán)重的誤導(dǎo)。首先來說,讀者得到的信息將是錯(cuò)誤的。其次,我們也有必要澄清背后的事實(shí)。好在我們沒有放棄,找到對的人尋根究底,讓大家知道了 90 年代的游戲是如何運(yùn)作的。
最終,我們明白了一個(gè)道理:顯而易見的答案并不總是正確的,有些信息可能會(huì)在倏忽之間丟失。而且,聲音文件有時(shí)還會(huì)包含聲音以外的數(shù)據(jù)。那么,我們不禁要問:作為一名存檔人員,應(yīng)當(dāng)如何統(tǒng)籌兼顧地處理這些數(shù)據(jù)呢?不可否認(rèn),它們將會(huì)改變我們的音頻存檔方式。在從聲音文件中提取數(shù)據(jù)時(shí),就算如實(shí)還原了游戲里的聲音,還是有可能會(huì)丟掉一部分信息。MP3 文件并不能說明一切,脫離背景注定會(huì)顧此失彼。
遺憾的是,程序員和音頻整合人員到現(xiàn)在也沒有記錄和分享相關(guān)技巧和流程的習(xí)慣。當(dāng)然,對此秘而不宣確實(shí)有一定的現(xiàn)實(shí)原因,比如個(gè)人職業(yè)道德、公司保密要求等。通常,一旦游戲發(fā)布,大家馬上便會(huì)轉(zhuǎn)向新的游戲、硬件和技術(shù)。隨后,工具慢慢被淘汰,技巧不久便過時(shí)。要是沒有妥善存檔,很快就會(huì)被人遺忘。正如前文所說,從游戲中提取的數(shù)據(jù)并不足以說明所有問題。逆向工程存在一定局限,只能填補(bǔ)部分信息空白。到最后只能管中窺豹,難以了解事情的全貌。而且,有些游戲并沒有多少人在意,時(shí)間一長很可能會(huì)無證可考。想想本文所說研究項(xiàng)目中的偶然發(fā)現(xiàn),該有多少類似情形是我們沒注意到的。

總的來說,收獲還是很大的。雖然“節(jié)省空間”之說在這是錯(cuò)的,但之前的確有人采取過類似的做法。在研究當(dāng)中,我們發(fā)現(xiàn)有些游戲確實(shí)存在為了優(yōu)化存儲(chǔ)而將音頻加快的情形。據(jù)說,直到 PlayStation3 問世,這種做法才被擯棄。不過,對此我們并沒有確鑿的證據(jù)和例子。拿《Rainbow Six 3》來說,曾有玩家問過語音加快的問題,答案是很多 Ubisoft 游戲都這么做過。還有一些早期的 N64 游戲(如《Super Mario》和《Mario Kart 64》)可能也采取過這種做法。然而,除非有關(guān)人員出面證實(shí),否則無法斷定是否如此。也許讀者當(dāng)中就有人親身參與過相關(guān)項(xiàng)目。有興趣的話可以跟我聯(lián)系,說說自己都有怎樣的經(jīng)歷,告訴大家曾經(jīng)發(fā)生過什么,以免有些事情就此被遺忘。

范妮?雷比拉德 (FANNY REBILLARD)
范妮?雷比拉德 (Fanny Rebillard) 擁有音樂學(xué)和數(shù)字存檔雙碩士學(xué)位,在法國經(jīng)常為報(bào)刊雜志撰寫與游戲音頻和存檔相關(guān)的文章,其中包括 Gamekult.com、Canard PC Hardware、Game Music Magazine…她目前在蒙特利爾擔(dān)任高級本地化 QA 測試,同時(shí)進(jìn)行著有關(guān)游戲音頻行業(yè)的探索和寫作。她第一本關(guān)于《Legend of Zelda》系列游戲配樂的著作于 2021 年 3 月面世。
