Sekai Viewer对话文本资料笔记

2025/6/14
1249 字
# 技术# 世界计划

因为在扒角色台词和语音的时候做了不少研究,为了避免以后忘记,写个笔记存一下。

Master DB

这里面放的主要是一些跟随游戏一起分发(应该是)的JSON文件,比如有哪些卡、哪些活动这种最基础的信息。仓库位于Sekai-World/sekai-master-db-diff。下面提及几个(我)最常用的文件:

actionSets.json # 区域对话和一些场景小人
assetList.json # 资源文件列表 # 卧槽这个文件不更新了,别用

cards.json # 卡牌
cardEpisodes.json # 卡牌SideStory
events.json # 活动
eventStories.json # 活动剧情
mysekaiCharacterTalks.json # MySeikai场景对话
specialStories.json # 特殊剧情(比如周年、愚人节之类的)
unitStories.json # 主线剧情

gameCharacters.json # 人物基础信息
character2ds.json # 似乎是live2d的模型信息,在对话中的人物id是用这个字段标识的,需要通过它映射到实际人物id
characterProfiles.json # 人物资料卡

对于剧情和对话文件,比较重要的是其中的 scenarioIdassetbundleName 字段,根据这两个字段可以查到这个剧情的详细 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.jsoncardEpisodes.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 文件中的 scenarioIdVoiceId 查询。文件都有wavmp3 两种格式

  • /
    • /sound
      • /scenario/voice 活动、主线、自我介绍、特殊剧情语音
      • /card_scenario/voice 卡牌Side Story语音
      • /actionset/voice 场景对话语音
      • 以上三个文件夹的内容都符合以下格式
        • /{scenarioId} 关联自上述 {scenarioId}.asset 的文件名部分
          • /{VoiceId}.wav 关联自{scenarioId}.asset 文件中的 TalkData[].Voices[].VoiceId
        • (还有一些不完整的虚拟歌手语音,在此略过)

VoiceId 似乎有一定的命名规律:

  • voice_ev_shuffle_01_5_66_18 表示第 01混活5 话 第 66 句台词,是角色ID 18 说的
  • voice_ev_night_10_08_49_20 中的 night 指的是25时的箱活,其他代号有 idol / street / band / wonder
  • voice_ev_wl_night_01_05_98_20 中的 wl 指的是WL活动。虚拟歌手WL时组合代号为 piapro
  • voice_ms_idol4_33_05idol (即MMJ)的主线剧情第 4
  • voice_card_ev_street_08_09_4b_01_10street (VBS)第8次箱活的角色ID 93星卡牌的b(后篇)剧情
  • voice_card_bd_202410_06_4a_01_05 是生日卡,202410月的角色ID 6 的生日卡a(前篇)剧情(生日卡的星级似乎总是4)
  • voice_card_fes_202206_04_4b_01_04 是fes卡,解释方式同上
  • 顺便还有 voice_card_ev_sanrio_02_4b_01_02 这种三丽鸥联动活动卡

但是这一堆规律并不是严格遵守的,还有诸如前导零之类奇奇怪怪的问题,总之写在这里仅作记录,实际意义很有限。