速查 › 播報員為什麼不唸新球員的名字
播報員為什麼不唸新球員的名字
你把台灣球員加進名單,打擊、守備、大頭照都好了, 但播報員永遠不唸他的名字。這不是設定沒開,是那個名字根本不存在。 遊戲裡的球員名字是 2005 年錄好的音,不是合成出來的。
⚠️ 這頁的數字量自本站測試機,你的會不一樣
本站測試機的 attrib.dat 與 pitcher.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.dat 與 5826.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。把四個類別的編號集合抓出來,
跟實際的檔案後綴逐一比對集合:
| 後綴 | 類別名 | 意思 | 編號數 | 集合比對 |
|---|---|---|---|---|
| a | pnm_cc_sur | 球評唸姓氏 | 1,462 | 完全相同 |
| c | pnm_pbp_full | 主播唸全名 | 1,486 | 完全相同 |
| d | pnm_pbp_sur | 主播唸姓氏 | 1,632 | 完全相同 |
| (沒有) | pnm_cc_full | 球評唸全名 | 142 | 沒有自己的檔案,142 個編號全部落在 c 裡面 |
數字量自剛安裝好的英文版原版。 上面規模表那組(a 4,091 / c 4,121 / d 4,313)量的是本站測試機那份社群名冊,兩組不能混用。
為什麼這個對應可以寫成「解開了」而不是「推測」
一、是集合相同,不是數量吻合。三組各自兩個方向零落差 —— 類別裡的每個編號都有對應檔案,每個檔案的編號也都在類別裡。 數量剛好相等只能算巧合的溫床;集合完全相同不可能是巧合。
二、音檔長度獨立佐證。唸全名的 c 中位數 6,912 位元組,
唸姓氏的 a 與 d 都是 4,352 ——
c 比另外兩個長約 60%,而兩個唸姓氏的中位數完全相同(平均數也只差 1.3%)。
這是從完全不同的角度(檔案大小)得到同一個結論。
不要寫成「一個人有三段語音」
它其實是兩個人 × 兩種稱呼:主播與球評各自可以唸全名或姓氏, 造句時擇一。而且四格裡只有三格有檔案 —— 球評唸全名那一格共用主播的。
三種齊全的也只佔 75.0%:1,673 個有語音的編號裡, 1,255 個三種都有、397 個只有兩種、21 個只有一種。 所以「每位球員都有三段」是錯的。
⭐ 一份 2008 年的工作資料夾,從另一個方向印證了同一件事
上面那個答案是從遊戲自己的文字檔讀出來的。 本站後來在一批二十年前的舊資料裡,翻到一個台灣玩家做語音模組時留下的素材夾 —— 670 個切好的音檔。他當年並不知道 a / c / d 各代表什麼 (同一批資料裡的 2008 年教學明說「至於兩個誰是誰念的已記不清」), 但他把素材整理成這樣:
| 檔名形式 | 數量 | 內容是什麼 |
|---|---|---|
○○_a | 186 | 姓氏(Allen、Anderson、Beltran、Berkman…) |
○○_d | 186 | |
| 沒有後綴 | 296 | 名字(Aaron、Adam、Alan、Alberto…)與中文單字 |
○○_c | 2 | 全名 |
_a 與 _d 的字根有 185 個完全配對
(只有兩個落單)。也就是說:同一個姓,他一定收兩份;而名字只收一份。
上表的後綴是把底線與連字號兩種寫法一起算的:那 186 個 ○○_a
裡有 14 個其實寫成 ○○-a,186 個 ○○_d 裡有 13 個寫成 ○○-d。
只認底線的話會少算。
那正是 a 與 d 的意思 ——
同一個姓氏、兩位播報員各唸一次。
他沒有讀過格式文件,只是照著聽感把素材分類,
分出來的結構跟遊戲內部的編碼一模一樣。
另外兩個對得上的細節:那 670 個檔有 669 個是 48,000 Hz、 立體聲、16 位元的 PCM, 而同一批資料裡 2008 年那篇教學給的指令正好是「重混成立體聲、重取樣到 48000」—— 規格對得起來,證明這個資料夾就是照那套流程做的。 唯一的例外是一個 24,000 Hz 的 MP3,顯然是別的來源。 中文那 68 個是單字(張、強、彬、德、宗男…)—— 從英文播報員唸過的音裡剪出來,用來拼台灣球員的名字。
本站不重貼那批音檔,也不提供下載。這裡記的是 一個外部證據怎麼獨立支持了本站從檔案裡讀出來的結論。
⭐ 但輪到台灣球員,那兩位播報員是同一段錄音
上面說 a 與 d 是「兩位播報員各唸一次」。
那是格式的意思,也確實是英文姓氏的做法。
可是把實際出貨的台灣球員語音包逐位元組比對,結果是這樣:
| 組數 | a 與 d 內容完全相同 | |
|---|---|---|
| 當年的來源錄音(英文姓氏) | 185 | 0 組(0.0%) |
| 實際出貨的台灣球員語音包 | 159 | 155 組(97.5%) |
來源錄音那 185 組裡,184 組連檔案長度都不一樣
(anderson_a 是 99,004 個位元組、anderson_d 是 127,704)
—— 真的是兩段不同的錄音。唯一長度相同的是 Cruz,
兩個檔各 115,956 個位元組,但內容仍然不同,
所以「內容完全相同」那一欄還是 0 組。
但台灣球員那邊,兩個槽位放的是同一段。
為什麼(推論):英文姓氏播報員本人錄過,兩位各有現成的一份。 但「田」「陽」「林威助」英文播報員從來沒唸過 —— 做模組的人得從播報裡剪出中文單字一個一個拼。 拼一次就很費工,拼兩次沒有意義。
四個例外是 中村紀洋、陽建福、高政華、林威助, 其中高政華與陽建福那兩組長度一模一樣、內容卻不同。
名單這邊:3,247 個人,只用了 1,835 個號碼
| 量到的 | 數字 |
|---|---|
| 名單裡的球員 | 3,247 |
audioid 是 0 的 | 43 |
| 其餘用到的不重複號碼 | 1,835 |
| 被多人共用的號碼 | 22 個 |
| 其中一個號碼被幾個人共用 | 1,337 人 |
一個號碼被一千三百多人共用,這件事很奇怪 —— 除非那個號碼的意思是「沒有」。
我們改過這一段:這是名冊作者的做法,不是 EA 的設計
上面那張表量的是本站測試機那份台灣名冊。拿剛安裝好的原版重跑同一套統計,結果完全不一樣:
| 非零 audioid | 不重複 | 被共用的號碼 | |
|---|---|---|---|
| 本站測試機(台灣名冊) | 3,204 | 1,835 | 22 個 |
| 剛安裝好的原版 | 1,300 | 1,300 | 0 個 |
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.dat、0002c.dat、0002d.dat
(倉庫裡的檔名補零到四位):一個都不存在。
所以那 1,337 個人指向的是一個沒有錄音的號碼。
加上 audioid = 0 的 43 人,
至少 1,380 位球員從一開始就不會被唸名字。
audioid = 1(12 人)不是同樣情形:
0001a.dat、0001c.dat、0001d.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 改成一個已經有錄音的號碼 ——
但那樣播報員會唸出那個號碼原本的人的名字,不是你的球員。
難的那條:自己做一個語音檔放進去。當年有人做到了。
本站已經量出外層容器怎麼組成(檔名、號碼、a/c/d 三組、
16 位元組的檔頭)。
⚠️ 2026-08-29 訂正:這一段原本寫「所以本站不寫這個教學」
原本的理由是「最裡面那層聲音是怎麼編碼的,本站沒有解開,所以本站不寫這個教學」。 那一格後來解開了 —— 「15 個位元組怎麼變回 28 個取樣」的公式已經寫出來, 本站有一支純 Python、零相依的腳本可以把聲音匯出成 WAV、也把 WAV 編回去, 見換掉遊戲的聲音。
但先別把那一課直接套到這一頁講的檔案上。本站拿那支腳本對兩個語音庫實際跑過:
| 語音庫 | 檔頭報的編碼器 | 段數 | 隨機抽 200 段 |
|---|---|---|---|
| cd\spch_pbp\pnamedat.big | 3(GSTR 容器) | 12,572 | 完整解出 0 段、只解出一部分 9 段、解不出 191 段 |
| cd\spch_pa\pnamedat.big | 2 | 3,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.fsh 在 portrait.big 裡不存在,
0216.fsh 存在。那個倉庫裡 6,638 個純數字檔名,位數全部是 4,沒有例外。
這正好呼應換打擊姿勢那課講過的
%04d。同一個坑,本站自己又踩了一次。
補零之後重查。先講分母:audioid 不是 0 的有 3,204 位,
但其中 1,337 位共用 audioid = 2(上面已經證明那個號碼就是「不唸」),
另有 12 位共用 audioid = 1。
把這兩個哨兵值排除,真正指向一個具體號碼的是 1,855 位:
| 有沒有 | 人數 | 佔 1,855 |
|---|---|---|
| 有大頭照 | 1,586 | 85.5% |
| 有完整的三件套播報語音 | 1,200 | 64.7% |
| 有另一組的語音 | 932 | 50.2% |
| 三樣都有 | 847 | 45.7% |
| 三樣都沒有 | 220 | 11.9% |
「另一組」指的是 spch_pa 那個倉庫。
它跟播報那組不一樣:一個號碼只有一個檔(0216.dat),
不是 a/c/d 三件套。
換個角度看:號碼只有自己一個人用的球員有 1,813 位 (真的有專屬號碼的那群),其中 1,188 位(65.5%)有完整播報語音。 剩下三分之一的人,有專屬號碼但沒有對應的錄音。
本站訂正了自己一句話
原本寫「語音索引的資料結構還沒逆向出來」
什麼改得動那頁原本把球員專屬語音列為未解, 理由寫「語音索引的資料結構還沒逆向出來」。
那句話比實際情況悲觀。 「哪一位球員用哪一個號碼、那個號碼對到哪幾個檔案」這一層是解得開的, 上面整頁量到的都是這一層。
真正解不開的是更裡面一層 ——
那些 .dat 檔本身的聲音編碼。
⚠️ 這張卡寫的時候後面還接著一句「所以結論不變(做不出新語音),但理由必須改對」。 2026-08-29 之後那句也要改了:編碼那一層解開了(見上面那張綠卡與 換掉遊戲的聲音), 剩下的是容器的那一支分支與錄音來源。
這頁不能告訴你什麼
四件未解
一、a/c/d 三者數量為什麼不一樣(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 改成別人的號碼,遊戲是不是真的會唸出那個人的名字 ——
本站沒有實機驗過,這是從檔名對應推論的。未驗
📌 重點整理
- 一句話 播報員不唸你新加的球員,不是設定沒開,是那個名字根本不存在,遊戲裡的球員名字是 2005 年真人錄好的音、不是合成的,而 EA 原廠只錄了 1,673 個號碼份。
a/c/d解開了 答案寫在spch_pbp.txt裡,a是球評唸姓氏(1,462)、c是主播唸全名(1,486)、d是主播唸姓氏(1,632),三組集合完全相同而不只是數量吻合;音檔長度獨立佐證:唸全名的c中位數 6,912 個位元組,兩個唸姓氏的都是 4,352。不要寫成「一個人有三段語音」,它是兩個人 × 兩種稱呼,四格只有三格有檔(球評唸全名那 142 個共用主播的),而三種齊全的只佔 75.0%。- 但輪到台灣球員,那兩位播報員是同一段錄音 當年的來源錄音 185 組沒有一組
a與d相同(0.0%,其中 184 組連檔案長度都不一樣,唯一長度相同的Cruz內容也不同),實際出貨的台灣球員語音包 159 組卻有 155 組(97.5%)逐位元組完全一樣,例外只有中村紀洋、陽建福、高政華、林威助。這也替 2008 年那篇教學說的「至於兩個誰是誰念的已記不清」補上了答案。 - 訂正一:4,343 是這台機器的數字。EA 錄的是 1,673,多的 2,670 是淨值(模組加 2,681、拿掉 11)。順帶一提語音庫有一大半的名字沒人在用:這台 4,343 個號碼裡 3,097 個(71.3%)名單裡沒人指向,原版是 491 個(29.3%)。
- 訂正二:
audioid = 2是台灣名冊作者的慣例,不是 EA 的設計。這台有 1,337 人共用 2、22 個號碼被共用;剛安裝好的原版則是 1,300 個非零 audioid 全部獨一無二、零共用,而且 1 與 2 從頭到尾一次都沒出現過。沒有語音的球員 EA 直接填 0。但反過來不成立 原版那 1,300 個非零號碼裡有 118 個(9.1%)一個檔案都沒有,所以「填 0 = 沒語音」對,「非 0 = 有語音」錯。 - 訂正三:那個 62.8% 是本站沒補零算錯的。三個倉庫的檔名一律補零到四位(
0216.fsh),名單裡的號碼不補零(216),直接拿去查會讓 1000 以下的球員全部被判成「沒有」。補零重算,排掉 1 與 2 兩個哨兵值後真正指向具體號碼的是 1,855 位,三樣都沒有的是 220 位(11.9%),差了兩倍以上。 - 訂正四:兩句話講得太滿。原本寫「沒有人錄過他的名字,無論你怎麼設定都唸不出來」,EA 沒錄是對的,但 2008 到 2009 年台灣模組玩家自己做了 23 個人的語音;另一頁原本把這件事列為未解、理由寫「語音索引的資料結構還沒逆向出來」,那也太悲觀,「誰用哪個號碼、號碼對到哪幾個檔」這一層是解得開的,真正解不開的是更裡面一層。
- 本站沒驗的
.dat裡面聲音怎麼編碼已於 2026-08-29 解開(見換掉遊戲的聲音),但這頁講的pnamedat.big用的容器分支(編碼器 3)也已於 2026-08-30 解開(7,092 段裡解得出 6,674 段,那組「抽 200 段完整解出 0 段」是修好之前量的),所以「做自己的球員語音」現在只缺錄音來源;a/c/d三者數量為什麼不一樣沒答案;audioid的 0、1、2 差在哪、以及為什麼有 12 個人共用audioid = 1(那組檔案是存在的)都沒查出來;最重要的是把audioid改成別人的號碼、遊戲是不是真的會唸出那個人的名字,本站沒有實機驗過,那是從檔名對應推論的。還有,這頁的名單類數字量自測試機(attrib.dat被模組換過,跟原版不是同一份,內容自 2026-04-14 那份快照以來沒變、sha256 相同,但檔案日期被後來的操作換掉了),而且欄位順序會變,46 欄裡有 27 欄兩份名冊對不上,永遠不要記欄號。
接下來
- 語音檔頭的 16 個位元組 —— 那些
.hdr裡面到底寫了什麼 - 兩套球員編號 ——
audioid的另一半用途 - 播報音訊系統 —— 整個音訊區的結構
- 什麼改得動 —— 全站的可改/不可改總表
- 一個檔案裡的地層 —— 「不刪只是不指向」的另一個例子