赛马娘语音数据集制作教程 (一键提取)
chinosk
编辑于 2023年02月07日 13:33

本文仅提供数据集制作教程,炼丹相关请自行寻找其它教程

     之前总是看到群友在问马娘的音频数据集怎么弄,目前已有的提取方式都过于繁琐,于是自己尝试写了个一键提取脚本,希望对各位有用。

    您只需要修改示例代码内的角色ID提取方式, 然后运行脚本即可。脚本会自动帮您下载缺失的语音文件、解密加密的文件、提取文本内容,然后输出到您指定的目录。

    注: 若下载缺失文件时报错 HTTP 403,请自行使用魔法。


项目地址: https://github.com/chinosk114514/umamusume-voice-text-extractor


环境要求

赛马娘DMM版: https://dmg.umamusume.jp

python 3.8或更高版本: https://www.python.org/downloads

.Net 6.0: https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0


使用方法

1. 将本项目克隆到你的计算机

2. 安装python包:

代码块
Shell
自动换行
复制代码
pip install -r requirements.txt
复制成功

3. 已更新GUI,不需要手动修改代码了。

GUI操作的详细说明可以查看项目内的 README

单角色提取

多角色提取

提取LIVE音频

混合LIVE音频

3. 编辑 "main.py&#​34;, 然后运行即可, 以下是代码说明

代码块
Python
自动换行
复制代码
import voiceex # 设置保存路径、当缺失文件时是否直接下载、从所有角色个人剧情中获取音频(耗时很长) ex = voiceex.VoiceEx(save_path="save", download_missing_voice_files=True, get_voice_from_all_stories=False) # 设置wav采样率, 位数, 声道数 (可选, 若不设置, 则以源文件参数输出) ex.set_wav_format(22050, 16, 1) # 设置下载代理 (可选, 若不需要, 直接注释掉即可) ex.set_proxies("http://127.0.0.1:10087")
复制成功

单角色提取方式

代码块
Python
自动换行
复制代码
# 单角色模式
# 开始提取角色 No.1024 (摩耶重炮) 的语音/文本
ex.extract_all_char_text_single(1024)
复制成功

多角色提取方式

代码块
Python
自动换行
复制代码
# 多角色模式
# 设置各角色的输出ID (Union[int, str])
ex.set_multi_char_out_ids([
    (1024, "0"), (1046, 1)
])
# 开始提取角色 No.1024 (摩耶重炮) 和 No.1046 (醒目飞鹰) 的语音
ex.extract_all_char_text_multi([1024, 1046])
复制成功

修改完成后直接运行 "main.py&#​34; 即可

代码块
Shell
自动换行
复制代码
python main.py
复制成功


关于不同的提取模式

不同的提取方式会生成不同格式的文件,请根据自己的需求选择~

单角色提取方式会生成如下格式的文件

代码块
JavaScript
自动换行
复制代码
xxx/xxx.wav|这是语音文本
xxx/xxx2.wav|这是语音文本2
xxx/xxx3.wav|这是语音文本3
复制成功

多角色提取提取方式会生成如下格式的文件

代码块
JavaScript
自动换行
复制代码
xxx/xxx.wav|0|这是角色0的语音文本
xxx/xxx2.wav|0|这是角色0的语音文本2
xxx/xxx3.wav|1|这是角色1的语音文本
xxx/xxx3.wav|2|这是角色2的语音文本
复制成功


生成效果

提取的语音文件

单角色模式提取文本

多角色模式提取文本


数据相关

下面简单分享一下提取数据的思路

数据库位置

代码块
Python
自动换行
复制代码
%UserProfile%/AppData/LocalLow/Cygames/umamusume/meta
%UserProfile%/AppData/LocalLow/Cygames/umamusume/master/master.mdb
复制成功

故事文本

    打开 "meta&#​34; 数据库,可以看到所有的文件以及对应的 bundle,执行查询语句即可获取所有故事语音文本的文件名

代码块
Python
自动换行
复制代码
story/data/{base}/{chara_id}/storytimeline_{base}{chara_id}%
复制成功

base 值:

    02:主线故事;04:角色个人剧情;09:额外故事;10:周年庆故事

    使用此文件名可在 "meta&#​34; 数据库内查询到对应包的 hash,通过hash即可获取文件在本地的位置

代码块
Python
自动换行
复制代码
%UserProfile%/AppData/LocalLow/Cygames/umamusume/dat/{hash[:2]}/{hash}
复制成功

    知道包的位置后,读取对应包内 "StoryTimelineTextClipData&#​34; 的语音数据即可

故事语音文件结构

    之后根据语音ID即可得到对应语音文件名

代码块
Shell
自动换行
复制代码
sound/c/snd_voi_story_{语音ID}.acb sound/c/snd_voi_story_{语音ID}.awb
复制成功

    .awb 为加密的语音文件

    .acb 文件内存放了各段语音的序号

角色系统文本

    系统文本存放于 "master&#​34; 数据库 "character_system_text&#​34; 表内。系统文本语音包含了 标题、主页、抽卡、队伍、比赛、训练、情人节 等语音

    根据上文获取到的语音文件名,可以在 "meta&#​34; 数据库中查询到对应的 hash 值,若此hash对应的文件不存在,则下载。

    之后根据上文得到的语音序号,即可提取出本段语音文件。

    语音解密、提取相关实现,请自行查看:https://github.com/chinosk114514/umamusume-voice-text-extractor/tree/main/voice%20extractor

    至此,我们已经成功获取到对应的语音文本和解密后的文件。