总之花了1个几个晚上 很快乐
(不会提到该游戏是什么,只会提到无关的游戏。但如果你碰巧也干了,你就肯定会知道是哪个游戏,iykyk.)
原因是有首翻唱曲只有游戏里有。
路径依赖
(说到路径依赖,我最近 Typst 用多了,刚才打出了 ==
而不是 ##
。哈哈。)
- 我有个 Root 过的 Android, 这不易如反掌,如入无人之境,盛必击而破之!
- 下载 安装 启动 点两下 下载要听的歌 退出
- 搜索游戏名称+解包。
- 一篇前人写的文章为我指路,我发现所有的文件其实都在 Android 文件夹下,不需要 Root.
- 总之拷贝到电脑上。
- 用 AssetStudio 打开,找到了许多好玩的图片,和室友一起看了半小时图。
- 发觉里面没有视频,放弃之。删了所有文件。
- 指路文指出,有些文件并不是 Unity 的文件,AssetStudio 是打不开的。于是重新从手机拷贝了一遍。
- 找了个 Hex Editor, 然后让 GPT-4o (via duck.ai) 写了个分类的脚本。
- 按文件大小排序(我真是个天才)然后一个一个拖进 VGMToolbox 看看能不能打开。
- 找到了好多
.usm
抽卡动画!不过提取的音频文件没有声音,不知道为什么。 - 放弃之。痛定思痛,文件留在手机里没删。
总结:路径依赖。不好。
开源
这里的开源是指“感谢马斯克开源”和“扔 GitHub 上”的某种混合,并不是指真的开源精神啥的。
- 找到了有人在 GitHub 上写的资讯站!然而点进去发现没有任何音频相关的东西。
- 看 commit 记录有个自动化脚本,是 GitHub Actions?
- 点进 profile 发现作者写了个全自动的程序!喜出望外。
- 定睛一看没有填密钥的地方,而
.gitignore
似乎包含了常见的密钥储存位置。山穷水尽? - 总之跑一下吧!发现原来是模拟第一次安装游戏的,所以不需要密钥 bootstrap。还去 Google Play 查最新版本。太狠了。
- 跑到一半,把 GitHub Codespaces 的 20GB 空间占满了。放弃之,删了 Codespace.
- 犹豫要不要挂个 S3 Bucket 或者开个 VPS.
- 其实有下载和解密两步,而下载的文件解密完了才会删。
- 粗略确认下载完的加密文件是不需要的,那可不可以一边解密一边删原来的?
- 虽然不会写那个语言,但加两三行代码就行了。感谢 Copilot.
- 怕不保险,又把 Codespaces 里自带的 Python, nvm, Java 啥的删了。也不知道有没有起作用,反正最后控制在了 19GB.
- 又跑了一次,成了!居然还把该解密的都解密了,感恩。
好像一共有7位数还是8位数个文件?总之太多了。写了个脚本根据后缀分类。仔细想了想,反应过来ls
显示的是大小。虽然文件很多,但其实 VSCode 是能处理得过来的。分类只是为了方便找。- 然后用 GPT-4o-mini 教我怎么用
find
, 然后把文件移出来。 - 根据文件列表下载了需要的文件。
Codespaces 的套餐给的是每个月 20 GB, 算上别的肯定超了。所以得删掉一些东西。或许应该删视频?
总结:Codespaces 还是好用的。
逮虾户
(是 Déjà vu 的意思。)
- 下载了需要的
.acb
文件。 - 等等,怎么感觉似曾相识?原来是以前捣鼓过 libcgss. 忘记具体捣鼓啥了,反正读过音频那一部分。
- 坏消息——即使游戏的其他部分都解密了,音频仍然被 CriWare 提供的软件加密了。没有密钥。
- 用 libcgss 运行,
.acb
文件变成了.hca
文件。但是仍然是加密的。 - 搜游戏名+“acb”, 游戏名+密钥等,结果是理所当然地没有。
- 倒是找到了这篇文章,里面提到了有人逆向MLTD提取 HCA 密钥。方法是 MITM CriWare 的库。
- 这可难办了——我不想装 Android Studio, 我也没有 Android 8. 也不知道这几年有没有更新。
- 搜 “HCA デコードキー”, 找到了这个文件, 列举了一些已知的 key.
- 虽然这些 key 有2个参数,但 libcgss (还是另外一个随便找到库?) 需要3个参数。2显然不等于3.
- 抱着死马当活马医的心态,下载,运行。
- 好了。文件夹里出现了一个
.wav
文件。就是这么突然。
总结:柳暗花明。
月(半夜)锅
题外话——月锅是指一首叫做《MOON NIGHTのせいにして》的歌曲。翻译成月锅真是信达雅。
所以按大小排序其实没有用——因为 .acb
文件其实非常小。3MB. 连我最后产生的 .flac
都有 14MB.
音频为什么那么小呢?打开软件看了一眼波形和频谱,好像没什么特别的。就当是是 CriWare 黑科技了。
以及为什么 vgmstream
能用?不是需要密钥吗?vgmstream 说 .acb
文件 “may” (可能) 加密了,所以也许是我多虑了。
写到这里,我想起来《指路文》里说,音频是没加密的。也许是我潜意识里没觉得 CriWare 能有不加密的文件。
写到这里,我又想起来看到的这篇文章说:
假如我的手上有两份最终波形完全相同的hca,但是其中一个是ciph 0(无加密),另一个是ciph 56(密钥加密),如何处理这个ciph 56的版本呢?
首先,这个研究的起源就是chunithm。21年的大型leak之后,chuni new最终还是给自己的cri套件加上了密码。
那应该就是 ciph 0 了,vgmstream
的输出也没提到有加密。
总结:也许说明不应该半夜干活,导致看见的东西没进脑子。
不过音乐是拿到了,可喜可贺。
老办法
拿到音乐了,封面图怎么办?
- 根据歌曲 ID 查找对应的 Unity asset.
- 找到了,下载之。顺便下回了
AssetStudio
, 虽然下回来的好像不太一样。 - 提取之,结果发现像素不够,好糊。
- 那字幕组是这么拿到图片的?声音可以内录,总不至于截(有边框的)图然后修图吧。
- 想起来了有推特这个东西,于是打开推特,熟练地把 URL 改成
4096x4096
. 一气呵成。
总结:还是路径依赖?
版本悲伤
最后下载的的软件如下:
- AssetStudio, 虽然最后没用上。以后也许有用。
- VGMToolbox, 虽然已经不维护了。虽然叫 VGM 但其实最大的用处是提取
.usm
视频。 - vgmstream. 好用,爱用。甚至有 Scoop 收录。(虽然我知道收录门槛也没那么高。)
以及这篇文章里的链接可能以后会有用。
总结:今天有好多次从 GitHub releases 下载 .exe
然后运行,甚至包括一次没源码的仓库。(作者说源码在另一个仓库,但是没点进去看。)
除了被 Windows 的 UAC 保护了意外,还有就是我运气好吧。下次一定搞个沙盒。
还有高手
原来 .acb
是分 subsong 的,一个文件可以塞好多句话。
而年少无知的我因为空间不够把文件全删了,导致第二天重新来过。
解决方法是在 vgmstream-cli
加上 -S 0
表示你想要所有的 subsongs.
然后跑到这里又爆 20GB 了,思来想去还是转向 WSL2 (不是很想留着 Go 的碎文件,希望用内存缓冲一下).
评论:早干嘛去了?
WSL2
(后文以 WSL 指代。)
- 之前有个设置好的 WSL, 甚至能用 Windows Hello 验证 sudo, 打算复制一份用。
- 先导出,命令是
wsl --export Debian debian.tar
. 还挺小,只有 569 MB. - 然后找个文件夹放
.vhdx
磁盘文件 - 然后导入:
wsl --import debian-new C:\example\debian-new debian.tar
- 最后发现登录进去默认是
root
用户, 更改方法是修改/etc/wsl.conf
.
然后就是 VSCode 时间:
- 去扩展商店下载 WSL 插件.
- Command Palette… 里点 WSL: Connect to WSL using Distro…
- 然后就好了。真神奇。
本来不打算用 Git, 因为懒得在新机器上设置 Git; 但是 VSCode 其实做了一些魔法,自动帮你登陆 GitHub, 我也不知道是怎么做到的。
总之如果你已经在目录里了,那么如何挽救:
git init
- 如果 branch 和 remote 不一致,比如叫 master, 就改掉:
git branch -m main
git remote add origin https://github.com/example/example
git fetch origin
git reset --hard origin/main
(别怕,如果和 remote 一样那么文件不会变动)git branch --set-upstream-to=origin/main main
git pull
确认 Already up to date.
至于代码,因为遇到了网络问题(难免),于是让 Copilot 改了改需要改的地方,四舍五入我也会 Go 了。
要是有时间就把代码改成模块化的吧。
(不是指围棋。)
(也不是指 BanG Dream! MyGO!!!!! ——例句:“还在go”)
鞠躬尽瘁
某个网站列举了角色卡面的所有语音文本。
- 先是搜索引擎搜索,没有别的结果。
- 然后在解包的文件里找了半天,连 UnityFS 里的各种 script 都不放过。结果是找不到。
- 那这个文本到底是哪里来的呢?GitHub 上其他的查卡器上也没有语音文本,只有技能说明。
- 去看了一眼其他角色的页面,果然——有空缺的卡。
- 果然是自己听写的,真是鞠躬尽瘁。仔细看了看也感觉没有任何差错。
所以呢
总结一下我获得的许多东西:
- 剧本(以及少量的舞台指示)。
- 用 Edit with Copilot 写了个查看器。
- 其实有人写过了,见到过截图。但网上就是找不到。
- 一些游戏里才有的音乐,比如翻唱。
- 卡面,虽然懒得提取。
- 视频,虽然嫌空间占用大而删掉了。
- 一些关于 Go 和 WSL 和 CriWare 的大概再也用不到的知识。
- 音频,可以用来活字印刷?虽然没有点子。
- 我不太能接受 “AI配音”,因为没什么用,效果不好,影响也不好。输输输。
- 活字印刷 (人力/音MAD) 倒还在接受范围内。
- 这篇文章。本来就是想记录一下踩的坑,结果越写越长。
以及失去的许多东西:
- 两三个下午,晚上和深夜。
- 大概 10GB 的硬盘空间。
不过总体还是挺开心的,成就感满满。