因为在扒角色台词和语音的时候做了不少研究,为了避免以后忘记,写个笔记存一下。
这里面放的主要是一些跟随游戏一起分发(应该是)的JSON文件,比如有哪些卡、哪些活动这种最基础的信息。仓库位于Sekai-World/sekai-master-db-diff。下面提及几个(我)最常用的文件:
actionSets.json # 区域对话和一些场景小人
assetList.json # 资源文件列表 # 卧槽这个文件不更新了,别用
cards.json # 卡牌
cardEpisodes.json # 卡牌SideStory
events.json # 活动
eventStories.json # 活动剧情
mysekaiCharacterTalks.json # MySekai场景对话
specialStories.json # 特殊剧情(比如周年、愚人节之类的)
unitStories.json # 主线剧情
gameCharacters.json # 人物基础信息
character2ds.json # 似乎是live2d的模型信息,在对话中的人物id是用这个字段标识的,需要通过它映射到实际人物id
characterProfiles.json # 人物资料卡
对于剧情和对话文件,比较重要的是其中的 scenarioId 和 assetbundleName 字段,根据这两个字段可以查到这个剧情的详细 asset 文件。
可以使用 Sekai Viewer 提供的资产浏览器。文件的下载路径为 https://storage.sekai.best/sekai-jp-assets/{PATH}
这些文件基本上都是统一的 .asset 文件(实际内容为JSON格式),一个文件记录了一段剧情中的详细信息。
//scenario/unitstory 组合主线剧情
/{assetbundleName} 关联自 unitStories.json 文件中的 chapters[].assetbundleName/{scenarioId}.asset 关联自 unitStories.json 文件中的 chapters[].episodes[].scenarioId/profile 个人介绍剧情
/{scenarioId}.asset 关联自 characterProfiles.json 文件中的 scenarioId。似乎有多个版本/special 特殊剧情
/{assetbundleName} 关联自 specialStories.json 文件中的 assetbundleName,也有可能是 episodes[].assetbundleName,有点奇葩,可能只能两种都尝试一下
/{scenarioId}.asset 关联自 specialStories.json 文件中的 episodes[].scenarioId/tutorial_story 教程剧情,一般没有关注的必要,略过/actionset 区域对话剧情
/{groupId} 神秘分组编号,感觉类似分卷压缩的时候随机分配的,似乎无任何规律,只能一股脑全部下载了
/{scenarioId}.asset 关联自 actionSets.json 文件中的 scenarioId/event_story 活动剧情
/{assetbundleName} 关联自 eventStories.json 文件中的 assetbundleName/scenario/{scenarioId} 关联自 eventStories.json 文件中的 eventStoryEpisodes[].scenarioId/character/member 卡牌Side Story
/{assetbundleName} 关联自 cards.json 或 cardEpisodes.json 文件中的 assetbundleName/{scenarioId} 关联自 cardEpisodes.json 文件中的 scenarioId/card_normal.webp 和 /card_after_training.webp 卡面图片(也有 png 格式)对于每个 .asset 文件,主要关注的是其中的 TalkData 字段,以下择部分关键字段解释
{
  "TalkData": [
    {
      "TalkCharacters": [
        {
          "Character2dId": 8 // 关联 character2ds.json 中的 id,需要在其中查 characterId 确定角色
        }
      ],
      "WindowDisplayName": "雫", // 屏幕上显示的名字,不一定是角色真名
      "Body": "ミクちゃん、リンちゃん、それにカイトさんも。\n相談に乗ってくれて、ありがとうございました", // 文本
      "Voices": [ // 语音数据。如果是没有语音的角色这里是空数组
        {
          "Character2dId": 8, // 同上
          "VoiceId": "voice_card_ev_idol_07_08_4a_01_08", // 语音ID,下载语音文件的依据
        }
      ],
    },
    ...
  ]
}
语音文件需要根据 .asset 文件中的 scenarioId 和 VoiceId 查询。文件都有wav 和 mp3 两种格式
//sound/scenario/voice 活动、主线、自我介绍、特殊剧情语音/card_scenario/voice 卡牌Side Story语音/actionset/voice 场景对话语音/{scenarioId} 关联自上述 {scenarioId}.asset 的文件名部分
/{VoiceId}.wav 关联自{scenarioId}.asset 文件中的 TalkData[].Voices[].VoiceIdVoiceId 似乎有一定的命名规律:
voice_ev_shuffle_01_5_66_18  表示第 01 次混活第 5 话 第 66 句台词,是角色ID 18 说的voice_ev_night_10_08_49_20 中的 night 指的是25时的箱活,其他代号有 idol / street / band / wondervoice_ev_wl_night_01_05_98_20 中的 wl 指的是WL活动。虚拟歌手WL时组合代号为 piaprovoice_ms_idol4_33_05 指 idol (即MMJ)的主线剧情第 4 话voice_card_ev_street_08_09_4b_01_10 指street (VBS)第8次箱活的角色ID 9 的3星卡牌的b(后篇)剧情voice_card_bd_202410_06_4a_01_05 是生日卡,2024年10月的角色ID 6 的生日卡a(前篇)剧情(生日卡的星级似乎总是4)voice_card_fes_202206_04_4b_01_04 是fes卡,解释方式同上voice_card_ev_sanrio_02_4b_01_02 这种三丽鸥联动活动卡但是这一堆规律并不是严格遵守的,还有诸如前导零之类奇奇怪怪的问题,总之写在这里仅作记录,实际意义很有限。