速查 › 播報員為什麼不唸新球員的名字

播報員為什麼不唸新球員的名字

你把台灣球員加進名單,打擊、守備、大頭照都好了, 但播報員永遠不唸他的名字。這不是設定沒開,是那個名字根本不存在。 遊戲裡的球員名字是 2005 年錄好的音,不是合成出來的。

⚠️ 這頁的數字量自本站測試機,你的會不一樣

本站測試機的 attrib.datpitcher.dat 都被模組換過,裝的是一份混了大聯盟與台灣球員的名單 (pitcher.dat 的檔案日期還停在 2023 年 5 月attrib.dat 跟剛安裝好的原版不是同一份, 而且內容自本站 2026-04-14 那份快照以來一個位元組都沒變過(sha256 相同)。 2026-09-05 訂正:這裡原本拿它的檔案日期當佐證, 但那個時間戳後來被別的操作換掉了 —— 檔案日期會變,內容沒有, 所以本站不再用日期指認這份名單)。

所以像「3,247 位球員」「某某球員的識別碼是多少」這種跟名單內容有關的數字, 你自己跑會得到別的結果

不會變的是格式:欄位有幾個、每一格怎麼寫、資料怎麼分隔 —— 那是遊戲程式決定的,換名單也不會變。
⚠️ 但「哪一欄是什麼」會變。本站實測 46 個欄位裡有 27 個 在剛安裝好的原版與社群名冊之間位置不同(skin_tone 從第 12 欄搬到第 38 欄, 中間的欄位各前移一格;audioid 原版第 17、社群名冊第 16)。 兩份剛安裝好的原版(英文與中文)彼此完全相同,所以分界是原版 vs 社群名冊,不是語言。 永遠不要記欄號,要在執行時從表頭找欄位名 —— 本站的腳本都是這樣做的。 這頁講的規則對你成立,數字與欄號不一定。

同樣的道理本站在字型音訊動畫那幾頁也標過。

先看那條線:一個號碼餵三個檔名

兩套球員編號那頁證明了:球員資料檔的 playerattrib_audioid 存的四位數,同時決定大頭照與播報語音。 語音那一半長這樣:

倉庫檔名幾個裝什麼
audio\cd\spch_pbp\
pnamedat.big
6107a.dat
6107c.dat
6107d.dat
12,528 項 播報員唸這個人的名字
三種後綴:a 有 4,091 個、c 有 4,121 個、d 有 4,313 個,合計 12,525;另有 3 筆例外 —— 5165.dat5826.dat 沒有後綴,以及一個 3632.wav。三者相加才是 12,528。
audio\cd\spch_pa\
pnamedat.big
6107.dat 3,658 項另一組,幾乎都是單檔沒有後綴
3,658 項裡只有 8810 那組有 a/c/d 三個
audio\spch_pbp\
pnamehdr.big
6107a.hdr 12,459 項上面那些語音的檔頭

a / c / d 是什麼:解開了

答案寫在 data\audio\spch_pbp\spch_pbp.txt 裡。那個檔按類別分組, 組名長這樣:pnm_cc_full:0004。把四個類別的編號集合抓出來, 跟實際的檔案後綴逐一比對集合

後綴類別名意思編號數集合比對
apnm_cc_sur球評姓氏 1,462完全相同
cpnm_pbp_full主播全名 1,486完全相同
dpnm_pbp_sur主播姓氏 1,632完全相同
(沒有)pnm_cc_full球評唸全名 142沒有自己的檔案,142 個編號全部落在 c 裡面

數字量自剛安裝好的英文版原版。 上面規模表那組(a 4,091 / c 4,121 / d 4,313)量的是本站測試機那份社群名冊,兩組不能混用。

為什麼這個對應可以寫成「解開了」而不是「推測」

一、是集合相同,不是數量吻合。三組各自兩個方向零落差 —— 類別裡的每個編號都有對應檔案,每個檔案的編號也都在類別裡。 數量剛好相等只能算巧合的溫床;集合完全相同不可能是巧合。

二、音檔長度獨立佐證。唸全名的 c 中位數 6,912 位元組, 唸姓氏的 ad 都是 4,352 —— c 比另外兩個長約 60%,而兩個唸姓氏的中位數完全相同(平均數也只差 1.3%)。 這是從完全不同的角度(檔案大小)得到同一個結論。

不要寫成「一個人有三段語音」

它其實是兩個人 × 兩種稱呼:主播與球評各自可以唸全名或姓氏, 造句時擇一。而且四格裡只有三格有檔案 —— 球評唸全名那一格共用主播的

三種齊全的也只佔 75.0%:1,673 個有語音的編號裡, 1,255 個三種都有、397 個只有兩種、21 個只有一種。 所以「每位球員都有三段」是錯的。

⭐ 一份 2008 年的工作資料夾,從另一個方向印證了同一件事

上面那個答案是從遊戲自己的文字檔讀出來的。 本站後來在一批二十年前的舊資料裡,翻到一個台灣玩家做語音模組時留下的素材夾 —— 670 個切好的音檔。他當年並不知道 a / c / d 各代表什麼 (同一批資料裡的 2008 年教學明說「至於兩個誰是誰念的已記不清」), 但他把素材整理成這樣:

檔名形式數量內容是什麼
○○_a186姓氏(Allen、Anderson、Beltran、Berkman…)
○○_d186
沒有後綴296名字(Aaron、Adam、Alan、Alberto…)與中文單字
○○_c2全名

_a_d 的字根有 185 個完全配對 (只有兩個落單)。也就是說:同一個姓,他一定收兩份;而名字只收一份。

上表的後綴是把底線與連字號兩種寫法一起算的:那 186 個 ○○_a 裡有 14 個其實寫成 ○○-a,186 個 ○○_d 裡有 13 個寫成 ○○-d。 只認底線的話會少算。

那正是 ad 的意思 —— 同一個姓氏、兩位播報員各唸一次。 他沒有讀過格式文件,只是照著聽感把素材分類, 分出來的結構跟遊戲內部的編碼一模一樣

另外兩個對得上的細節:那 670 個檔有 669 個是 48,000 Hz、 立體聲、16 位元的 PCM, 而同一批資料裡 2008 年那篇教學給的指令正好是「重混成立體聲、重取樣到 48000」—— 規格對得起來,證明這個資料夾就是照那套流程做的。 唯一的例外是一個 24,000 Hz 的 MP3,顯然是別的來源。 中文那 68 個是單字(張、強、彬、德、宗男…)—— 從英文播報員唸過的音裡剪出來,用來拼台灣球員的名字。

本站不重貼那批音檔,也不提供下載。這裡記的是 一個外部證據怎麼獨立支持了本站從檔案裡讀出來的結論

⭐ 但輪到台灣球員,那兩位播報員是同一段錄音

上面說 ad 是「兩位播報員各唸一次」。 那是格式的意思,也確實是英文姓氏的做法。 可是把實際出貨的台灣球員語音包逐位元組比對,結果是這樣:

組數ad 內容完全相同
當年的來源錄音(英文姓氏)1850 組(0.0%)
實際出貨的台灣球員語音包159155 組(97.5%)

來源錄音那 185 組裡,184 組連檔案長度都不一樣anderson_a 是 99,004 個位元組、anderson_d 是 127,704) —— 真的是兩段不同的錄音。唯一長度相同的是 Cruz, 兩個檔各 115,956 個位元組,但內容仍然不同, 所以「內容完全相同」那一欄還是 0 組。 但台灣球員那邊,兩個槽位放的是同一段

為什麼(推論):英文姓氏播報員本人錄過,兩位各有現成的一份。 但「田」「陽」「林威助」英文播報員從來沒唸過 —— 做模組的人得從播報裡剪出中文單字一個一個拼。 拼一次就很費工,拼兩次沒有意義。

四個例外是 中村紀洋陽建福高政華林威助, 其中高政華與陽建福那兩組長度一模一樣、內容卻不同

這替上面那句「已記不清」補上了答案

2008 年那篇教學說「至於兩個誰是誰念的已記不清」。 現在知道為什麼記不清了 —— 對台灣球員來說,那兩個本來就一樣。

量法與完整過程見拆開一個語音檔

名單這邊:3,247 個人,只用了 1,835 個號碼

量到的數字
名單裡的球員3,247
audioid 是 0 的43
其餘用到的不重複號碼1,835
被多人共用的號碼22 個
其中一個號碼被幾個人共用1,337 人

一個號碼被一千三百多人共用,這件事很奇怪 —— 除非那個號碼的意思是「沒有」。

我們改過這一段:這是名冊作者的做法,不是 EA 的設計

上面那張表量的是本站測試機那份台灣名冊。拿剛安裝好的原版重跑同一套統計,結果完全不一樣:

非零 audioid不重複被共用的號碼
本站測試機(台灣名冊)3,2041,83522 個
剛安裝好的原版1,3001,3000 個

EA 的設計是「要嘛 0,要嘛獨一無二」。原版名冊裡 1,300 個非零 audioid 全部只有一個人用,零共用;而且 audioid = 1= 2 從頭到尾一次都沒出現過(原版的號碼範圍是 3 到 2665)。沒有語音的球員,EA 直接填 0 —— 原版有 1,621 位。

⚠️ 但反過來不成立:填了號碼不代表真的有錄音。 原版那 1,300 個非零號碼拿去比對播報語音庫, 有 118 個(9.1%)一個檔案都沒有, a/c/d 三件齊全的只有 998 個(76.8%)。 所以「填 0 = 沒語音」是對的,「非 0 = 有語音」是錯的 —— 這是 EA 自己出貨的名冊就有的狀況。 (本站測試機更明顯:1,835 個號碼裡 589 個沒有任何檔案。)

所以下面那一整節講的「2 是不唸的哨兵值」,是台灣名冊作者自己定的慣例,不是遊戲原本的設計。

對你來說結論沒變:如果你裝的是台灣名冊,你的名冊就是這樣運作的。但那不是 EA 的做法。

audioid = 2 就是「不唸」

去語音庫裡找 0002a.dat0002c.dat0002d.dat (倉庫裡的檔名補零到四位):一個都不存在。

所以那 1,337 個人指向的是一個沒有錄音的號碼。 加上 audioid = 0 的 43 人, 至少 1,380 位球員從一開始就不會被唸名字。

audioid = 1(12 人)不是同樣情形0001a.dat0001c.dat0001d.dat 三個都存在0001.fsh 也在大頭照倉庫裡。所以 1 跟 2 在檔案層面是兩回事。 為什麼會有 12 個人共用同一組錄音,本站沒有查出來。未解

反過來看:語音庫有七成的名字沒人在用

這才是真正的答案。把語音庫裡出現過的四位數號碼全部列出來, 再看名單裡有沒有人用:

量到的數字
語音庫裡的不重複號碼
本站測試機。EA 原廠是 1,673 個
4,343
名單裡沒有任何人在用的
本站測試機。EA 原廠是 491 個 = 29.3%
3,097
= 71.3%

遊戲裡躺著三千多個沒人認領的名字

先講清楚:這個 71.3% 是本站測試機的數字。原版的無人使用率是 29.3%(1,673 個號碼裡 491 個沒人用)——差距來自模組把語音庫加大了 2.6 倍,而名冊用到的號碼沒有跟著等比增加。

不過兩邊都有相當比例沒人用,而這代表語音庫是照 2005 年那份名單錄的。 那時候的球員大多已經不在現在這份名單裡了, 他們的名字錄音還留在檔案裡,只是沒有人指向它

這跟介面檔裡的孤兒資料是同一種現象: 遊戲從來不刪東西,只是不再指向它。

所以「為什麼不唸我的球員」

因為那是錄音,不是合成

播報員的每一個名字都是真人錄下來的一段聲音檔EA 原廠錄了 1,673 個號碼份的名字 (本站測試機的語音庫有 4,343 個,多出來的 2,670 個是淨值: 模組加了 2,681 個號碼,也拿掉了 11 個。 詳見原版與這台機器的對照)。

你新增的球員不在裡面。EA 沒有錄過他的名字, 所以照原樣設定,播報員唸不出來。

我們改過這一段

這頁上線時,這裡寫的是「沒有人錄過他的名字,所以無論你怎麼設定, 播報員都唸不出來」。

後半句太滿了。EA 沒錄是對的,但「沒有人錄過」不成立 —— 2008 到 2009 年,台灣的模組玩家自己做了 23 個人的語音檔, 就放在這台機器的遊戲資料夾旁邊。詳見 EA 沒錄的名字,台灣人自己錄了

所以你有兩條路。簡單的那條:把 audioid 改成一個已經有錄音的號碼 —— 但那樣播報員會唸出那個號碼原本的人的名字,不是你的球員。

難的那條:自己做一個語音檔放進去。當年有人做到了。 本站已經量出外層容器怎麼組成(檔名、號碼、acd 三組、 16 位元組的檔頭)。

⚠️ 2026-08-29 訂正:這一段原本寫「所以本站不寫這個教學」

原本的理由是「最裡面那層聲音是怎麼編碼的,本站沒有解開,所以本站不寫這個教學」。 那一格後來解開了 —— 「15 個位元組怎麼變回 28 個取樣」的公式已經寫出來, 本站有一支純 Python、零相依的腳本可以把聲音匯出成 WAV、也把 WAV 編回去, 見換掉遊戲的聲音

但先別把那一課直接套到這一頁講的檔案上。本站拿那支腳本對兩個語音庫實際跑過:

語音庫檔頭報的編碼器段數隨機抽 200 段
cd\spch_pbp\pnamedat.big 3GSTR 容器)12,572 完整解出 0 段、只解出一部分 9 段、解不出 191 段
cd\spch_pa\pnamedat.big 23,683 完整解出 0 段、只解出一部分 13 段、解不出 187 段

對照組:應援曲那個 cd\chants\chantdat.big 也是編碼器 2,103 段裡有 40 段 解得完整、也寫得回去。所以卡住的不是取樣的數學,是容器層還有分支

⚠️ 2026-08-30 補:那一支分支後來解開了。上面那張表是修好之前量的。 真正卡住的是讀取樣數時的位元組序(GSTR 容器裡的數字要用大端讀),不是編碼器。 同一支腳本現在對 cd\spch_pbp\pnamedat.big 裡的 7,092 段編碼器 3 解得出 6,674 段,見換掉遊戲的聲音

所以現在的說法是:編碼那一層解開了、容器那一支分支也解開了、都有教學了, 但要換掉播報員唸的球員名字還缺一件事:錄音本身 (新球員的名字沒有人唸過,那不是解格式能解決的)。 另外那個語音庫裡還有 418 段編碼器 3 目前解不出來。

整份名單的覆蓋率

我們改過這一段

這張表原本寫「三樣都沒有 62.8%」。那是錯的,而且差了兩倍以上。

原因是查表的時候沒有補零。這三個倉庫裡的檔名一律補零到四位數0216.fsh),而名單裡的號碼不補零216)。 直接拿號碼去查,1000 以下的球員全部會被判成「沒有」。

實測:216.fshportrait.big不存在0216.fsh 存在。那個倉庫裡 6,638 個純數字檔名,位數全部是 4,沒有例外。

這正好呼應換打擊姿勢那課講過的 %04d。同一個坑,本站自己又踩了一次。

補零之後重查。先講分母:audioid 不是 0 的有 3,204 位, 但其中 1,337 位共用 audioid = 2(上面已經證明那個號碼就是「不唸」), 另有 12 位共用 audioid = 1。 把這兩個哨兵值排除,真正指向一個具體號碼的是 1,855 位

有沒有人數佔 1,855
有大頭照1,58685.5%
有完整的三件套播報語音1,20064.7%
有另一組的語音93250.2%
三樣都有84745.7%
三樣都沒有22011.9%

「另一組」指的是 spch_pa 那個倉庫。 它跟播報那組不一樣:一個號碼只有一個檔0216.dat), 不是 acd 三件套。

換個角度看:號碼只有自己一個人用的球員有 1,813 位 (真的有專屬號碼的那群),其中 1,188 位(65.5%)有完整播報語音。 剩下三分之一的人,有專屬號碼但沒有對應的錄音。

本站訂正了自己一句話

原本寫「語音索引的資料結構還沒逆向出來」

什麼改得動那頁原本把球員專屬語音列為未解, 理由寫「語音索引的資料結構還沒逆向出來」。

那句話比實際情況悲觀。 「哪一位球員用哪一個號碼、那個號碼對到哪幾個檔案」這一層是解得開的, 上面整頁量到的都是這一層。

真正解不開的是更裡面一層 —— 那些 .dat本身的聲音編碼

⚠️ 這張卡寫的時候後面還接著一句「所以結論不變(做不出新語音),但理由必須改對」。 2026-08-29 之後那句也要改了:編碼那一層解開了(見上面那張綠卡與 換掉遊戲的聲音), 剩下的是容器的那一支分支與錄音來源。

這頁不能告訴你什麼

四件未解

一、acd 三者數量為什麼不一樣(4,091 / 4,121 / 4,313)。 (各是什麼已經解開了,見上面〈a / c / d 是什麼:解開了〉。)未解
二、audioid 的 0、1、2 三個「沒有語音」的值之間差在哪。未解
三、.dat 裡面的聲音編碼已經解開了(見換掉遊戲的聲音); 這頁講的 pnamedat.big 用的容器分支(編碼器 3)也在 2026-08-30 解開了, 7,092 段裡解得出 6,674 段,剩下 418 段解不出。已解開
四、把 audioid 改成別人的號碼,遊戲是不是真的會唸出那個人的名字 —— 本站沒有實機驗過,這是從檔名對應推論的。未驗

📌 重點整理

接下來