암만 생각해도 방법이 있을 것 같아서 여기저기 찾아가지고 해결했는데
혹시나 원신 모델 직접 만들어보고 싶은 경우에 도움되라고 올려봄
-준비물-
원신 클라이언트
리버싱된 원신 데이터 (들어가서 Clone 옆에 다운로드->zip 아니면 git으로 받으셈)
Wwise-Unpacker (들어가서 Code 누르고 Download zip)
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 라고 나옴 와~~ 개쓸데없다!
필터까지 다 설정했으면 스크립트를 실행해주셈
그러면 해당 필터에 각각 몇 개의 대사가 검색됐는지 알려주고
필터 이름으로 된 폴더를 생성해서 보이스 파일들을 전부 모아줄거임
이제 들으면서 데이터로 쓸만한 것만 추려내면 됨