最近想做个新东西,需要内恰的声音。一个个录是不可能的,在这里简述一下怎么解包赛马娘声音资源,除了提取内恰的声音以外也可以扩展到其他声音上。
特别提醒:解包为违反游戏用户协议的行为,本文仅为技术交流,对于自行解包产生的一切后果由自己负责!
事前准备
- 赛马娘日服DMM版本,需要完整下载完游戏。
- 一个能打开sqlite数据库的软件,这里选用JetBrains全家桶的DataGrip。
- vgmstream,github传送门:https://github.com/vgmstream/vgmstream
你可能要问,要不要AssetStudio,答案是:完全不需要。
获取资源文件
马娘PC的默认资源文件路径是:C:\Users\<用户名>\AppData\LocalLow\Cygames\umamusume,使用数据库管理软件用Sqlite3格式打开这个路径底下的meta文件(无后缀名)
打开表“a”,使用数据库查询语句 SELECT * FROM a WHERE m = "sound" 即可列出马娘所有的音频文件。
其中,列”n“我理解为映射的原文件名,如”sound/b/snd_bgm_cs1001_gamesize.acb“,列“C” 则代表在马娘根目录下dat文件夹里的文件,如“sound/b/snd_bgm_cs1001_gamesize.acb“ 对应实际文件 “QKLL7SG5XSGVWMK7A5GTJSFRLUSVKIID” 文件, 该文件则在 /dat/QK 这个目录底下。
注:列l对应该文件的字节长度(length),m对应该文件的类型(sound就代表声音)。
根据解包PCR的经验,我们同时需要acb和awb才能完成音频提取,所以我们利用sql语句查询到”sound/b/snd_bgm_cs1001_gamesize.awb“对应的文件是”LKRTNKRPUC5DBTI7BTBQCALUBKT4YH3L“。
将这俩文件复制到一个目录里,然后分别重命名为”snd_bgm_cs1001_gamesize.acb“和”snd_bgm_cs1001_gamesize.awb“。
转变为音频文件
下载vgmstream,打开文件夹后,Shift+右键->打开PowerShell,输入.\test.exe <awb文件路径> -o <文件名>.wav
程序输出成功后,即可得到转换成wav文件的马娘声音资源。
补充:一个awb/acb文件可能对应多种游戏内的语音,比如说登陆语音就有四个,分别对应”cygames!” “umamusume pertty derby!” ”这是今日的登陆奖励哦~“ “明天的话应该会得到这个.”
这种情况是可以使用 .\test.exe -s 2 -F <文件名> 输出第二个声音,s后面的参数也可以改成3 4,就是导出第三个,第四个。
可以使用 .\test.exe -m <文件名> 查看该文件的信息,输出的信息中, stream count: 4 代表该文件有四组声音。
[EX] 提取指定角色相关的声音文件
打开马娘根目录底下的master文件夹,使用Sqlite3编辑器(我知道看着像Access能打开,实际上不行)打开master.mdb,打开chara_data表。
表里没有名字,但是却有对应的实际赛马的出生年月日,索引你心爱的角色的SQL语句便是:
SELECT * FROM chara_data WHERE birth_year = '出生年' AND birth_month = '出生月' AND birth_day = '出生日'
一般来说只有一个,有两个的话就自己想想办法呗(
顺便一提,骏川手纲(绿帽恶魔)的生日是1947年5月2日,和日本赛马”丰收时刻(傲视一切)“完全相同,也算是从游戏底层实锤了一波吧。
理事长的生日则为1971年3月15日,根据查询也确实是赛马北方风味的生日。
离谱的是游戏还有几个NPC(如记者,医生)似乎也都是1971年3月15日出生。
总之回到正题,最关键的哪一列是”id“,记录下你的爱马的id,比如说我的就是1060。切换到character_system_text这个表,使用数据库检索指令搜索有关于你爱马的一切语音。
SELECT * FROM character_system_text WHERE character_id = 1060
随后会得到许多数据,text这一列就是语句原文,cue_sheet则代表某种资源的代号,记住这个代号,回到获取资源文件 章节提到的那个数据库,使用数据库指令检索即可.
SELECT * FROM character_system_text WHERE m = "sound" and n like "%<资源代号>.%"
运用好,就能实现自动化提取对应角色所需的一切音声资源。
结语
花了点时间,但是感觉不错。