암만 생각해도 방법이 있을 것 같아서 여기저기 찾아가지고 해결했는데


혹시나 원신 모델 직접 만들어보고 싶은 경우에 도움되라고 올려봄


-준비물-  

원신 클라이언트

리버싱된 원신 데이터 (들어가서 Clone 옆에 다운로드->zip 아니면 git으로 받으셈)

Wwise-Unpacker (들어가서 Code 누르고 Download zip)

파이썬 3.11

fnvhash (파이썬 설치 후 pip install fnvhash 명령어로 설치)

여유 용량 약 2~30GB



1. 원신 보이스 파일 wav로 변환하기


일단 원신 설치폴더로 가서 Genshin Impact game\GenshinImpact_Data\StreamingAssets\AudioAssets 로 들어가면


다운받은 음성 언어 폴더들이 있음 나는 예시로 한국어 (Korean)을 뜯을거임



파일들이 이렇게 막 있을텐데 여기서 원하는 캐릭터 보이스가 어딨는지는 절대 못찾음


얘네가 일부러 찾아라 드래곤볼 해놔가지고 싹다 뜯는게 속편함


준비물에서 Wwise-Unpacker 압축을 해제해주고 pck 파일들을 전부 Game_Files 폴더에 집어넣음



그 다음 unpack_wav.bat을 실행하셈



이런식으로 창이 뜨면서 막 변환하고 있다고 뜰거임


변환이 완료되면 dest_wav 폴더에 wav 파일들이 몇만개 쌓여있음



이름부터 졸라 어지러운데 이제 우리는 파이썬 스크립트를 이용해서 이걸 분류해줄거임


그걸 위해서 이 dest_wav 폴더의 이름을 wav로 변경해줌


이건 전적으로 스크립트 때문에 그런거고 dest_wav는 저 프로그램을 돌릴때마다 초기화되는 폴더여서 편의를 위해 변경함



나는 깔끔하게 경로도 옮겨줬음


2. 파이썬 스크립트로 분류하기


빈 텍스트 문서를 하나 만들고 이름은 대충 filter_files_by_original_name.py 라고 해주셈


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from fnvhash import fnv1_64
import json
import os
 
lang = "korean"
 
if __name__ == "__main__":
    data_path = "E:\\Assets\Genshin\\AnimeGameData-master\\BinOutput\\Voice\\Items"
    filters = ["vo_furina"]
 
    hash_list = {}
    for root, dirs, files in os.walk(data_path):
        for file in files:
            f = open(os.path.join(root, file))
            j = json.load(f)
            f.close()
 
            for item in j:
                src_name = "SourceNames"
                src_filename = "sourceFileName"
                if src_name not in j[item]:
                    src_name = "EDNNCHGNMHO"
                    src_filename = "EEFLLCGNDCG"
                if src_name not in j[item]:
                    continue
                original_path = lang + '\\' + j[item][src_name][0][src_filename].lower()
                for fil in filters:
                    if fil in original_path:
                        if fil not in hash_list:
                            hash_list[fil] = []
                        hash_name = f"{fnv1_64(bytes(original_path, 'utf-8')):x}"
                        hash_list[fil].append(hash_name)
    print("Found files in data:")
    for fil in filters:
        print(f"{fil}: {len(hash_list[fil])}")
        fil_path = os.path.join(os.path.dirname(__file__), fil)
        if not os.path.exists(fil_path):
            os.mkdir(fil_path)
    wav_path = os.path.join(os.path.dirname(__file__), 'wav')
    wavs = os.listdir(wav_path)
    for fil in filters:
        fil_path = os.path.join(os.path.dirname(__file__), fil)
        for wav in wavs:
            for hash_name in hash_list[fil]:
                if hash_name in wav:
                    orig_path = os.path.join(wav_path, wav)
                    os.rename(orig_path, os.path.join(fil_path, wav))
 
 
 
cs


메모장으로 열든 IDE로 열든 암튼 그 파일을 열어서 위 내용을 넣어주셈


코드 발로짜서 ㅈㅅ ㅎ 돌아가기만 하면 된거아니노? 세계 최고의 게임회사 베데스다 게임즈가 그러랬음

 


각설하고 코드에서 lang = "korean" 이라 돼있는데 일본어면 japanese 딴건 모르겠음 머 chinese english겠지


그리고 data_path 도 니 컴에 리버싱한 원신 데이터 압축푼거 경로로 해주셈 다만 \\BinOutput\\Voice\\Items 이건 유지해야함


그리고 filters = ["vo_furina"] 이거는 경로 안에 이 텍스트가 들어있는 wav만 따로 분류한다는거임


여러개를 한 번에 분류하고 싶으면 filters = ["vo_furina", "vo_hutao"] 이런식으로 하면 됨


웬만해선 vo_캐릭 중국어이름 이런식으로 넣으면 되는데 정 뭔지 모르겠다 싶으면 방법이 있음 (쓸데없이 복잡함)


2-1 필요한 음성 파일 찾기 


이 글에서 가장 난해하고 영양가없는 파트일거라고 생각함 솔직히 중국어로 때려맞춰보는게 제일 편할거임


리버싱된 데이터에는 각국 언어의 텍스트들도 다 같이 들어있는데


TextMap 폴더에 들어가면 TextMapKR.json 이런게 있을거임 이걸 메모장으로 열어주셈


나는 종려 보이스 경로가 뭔지 알고싶으니까 "돌을 먹는 형벌" 로 검색할거임



2362169514 라는 숫자가 잡혔음


이제 이걸 ExcelBinOutput 폴더 안에 DialogExcelConfigData.json 또는 ReminderExcelConfigData.json에 검색해봄



딴건 상관없고 "GFLDJMJKIKE": 110230519, 이게 해당 대사의 id임


이제 BinOutput\Voice\Lut\Lut.json을 열고 110230519 를 검색함



여기선 파일 ID가 663797853 라고 나와있음


BinOutput\Voice\Items\663797853.json 을 열어주고 다시 아까 대사 id인 110230519 를 검색해줌



그럼 파일 경로가 vo_zhongli 라고 나옴 와~~ 개쓸데없다!





필터까지 다 설정했으면 스크립트를 실행해주셈


그러면 해당 필터에 각각 몇 개의 대사가 검색됐는지 알려주고



필터 이름으로 된 폴더를 생성해서 보이스 파일들을 전부 모아줄거임


이제 들으면서 데이터로 쓸만한 것만 추려내면 됨