본문 바로가기
Dev/Try & Projects

[ChatGPT로 AI 여자친구 만들기] 따라해보기

by E.Clone 2023. 12. 9.

https://www.youtube.com/watch?v=XPXXpIx0LCE

본 프로젝트는 정말 감사하게 위 영상에서 제시해준 로드맵을 기반으로 진행되었다. 상시숭배 할 수 밖에 없어

전체적인 흐름

01:32 ▶ 나무위키를 pdf로 저장, GPTs에 첨부하여 참고 지식으로 사용
01:57 ▶ 게임에서 뜯어온 마키세 음성파일에 대해, OpenAI의 whisper을 사용하여 대본 작성
02:04 ▶ GPT store에서 검색한 prompty(GPT 세팅방법을 알려주는 GPT)에게 도움! 요청
02:23 ▶ prompty에게 받은 내용을 번역 후 그대로 마키세 GPTs Instructions에 투입. 추후 음성 지원도 위한 일본어 대답 옵션도 추가.
02:40 ▶ GPTs는 현재 api 지원을 하지 않기 때문에, Selenium(Chrome비슷한거)으로 직접 웹페이지에 접속해 채팅을 이어가는 설계.
02:45 ▶ 웹앱 환경에서, 크리스의 대답중엔 '보내기' 버튼이 비활성화 되는 것을 감지하는 로직 활용, GPT에게 물어보아 셀레니움 환경 완성.
02:55 ▶ 프로그램 UI 작성 시작. 초안을 GPT에게 던져 Python으로 UI 작성.
03:11 ▶ 상기 작성한 일본어 대본을 사용하여 VITS(TTS AI)학습
03:17 ▶ 셀레니움 환경에서 얻어낸 GPTs의 답변을 TTS와 결합

보면 생략된 내용도 있어보이는데, 셀레니움에 대한 내용이 많이 나오지 않았고, 일본어 대본이 아닌 한국어 대본을 어떻게 준비하였는지도 알 수 없으며, 실시간으로 UI에 텍스트가 자연스럽게 나오는 방법도 알 수 없다. 텍스트 갱신과 관련해서는 OpenAI API 다룰 때 보였던 설정과 비슷한건가 싶긴 한데 나중에 찾아봐야겠다.

초기 준비물 확인

나무위키 PDF / 크리스 음성파일 → 대본 파일

게임은 이미 구매했었고, ChatGPT도 지금 가입이 막혔다고 하는데 이미 유료 구독중이라 문제 없다.

슈타인즈 게이트 보이스 파일 준비

슈타인즈 게이트 언팩에 관해서는 https://github.com/rdavisau/sg-unpack 의 힘을 빌렸다. 스팀판 이전의 슈타인즈 게이트 정보와 스팀판의 슈타인즈 게이트 정보가 인터넷에 뒤섞여있는데, 예전의 Voice 리소스파일은 NPA 확장자를, 현재는 MPK 확장자를 사용하고 있다. 듣기로는 크게 다를건 없긴 하다는데 Unpack 같은 키워드의 부재로 깃허브 페이지를 찾지 못하면 인터넷에서 한참을 헤멘다.

스팀 라이브러리 우클릭해서 로컬 폴더를 찾아들어가 경로를 확인한 후, 깃허브 페이지에 친절하게 나와있듯이 명령어 한번으로 쉽게 보이스 파일을 얻을 수 있다. 아래는 cmd에서 입력 예시.

sg-unpack.exe -i F:\SteamLibrary\steamapps\common\STEINS;GATE\USRDIR\voice.mpk -o C:\Users\happy\Desktop\codes\Amadeus

sg-unpack.exe -i "F:\SteamLibrary\steamapps\common\STEINS;GATE 0\USRDIR\voice.mpk" -o C:\Users\happy\Desktop\codes\Amadeus\zero

친절하게도 파일 이름이 이름_번호 로 되어있어 원하는 사람만 빼오기 좋다.

슈타인즈 게이트 대본 준비

문제는 이제 Whisper를 사용하여 음성을 대본으로 바꾸어줘야 한다는 것인데, 좋은 모델을 쓰려면 컴퓨터 사양이 말도 안되게 높아야 한다.

그래서 구글 코랩의 힘을 빌리기로 했다. 이것도 유료 이용중이라 제한 걸리는 등의 문제는 없을 것.

여러 자료를 찾아보는데, 지금도 잘 작동하고 있는 https://maily.so/dailyprompt/posts/86dd50cc 이 가이드를 따라갔다.

일단 제대로 대본이 나온다는 것은 확인되었고, 야수의 심장으로 WebUI에 3천개 가량의 파일을 한번에 드래그 해 놓았다. 업로드를 기다리는 중이다. 업로드가 끝나면 Generate 버튼을 눌러 대본을 생성하는데, 코랩 노트북 페이지의 파일시스템 중 outputs 폴더에 대본이 생성된다. 왠지 전체선택 다운로드라는 선택지는 없어보였기 때문에 3천개의 대본을 압축 후, 다운로드 받을것이다.

WebUI에 너무 많은 파일을 업로드하면 잘 작동하지 않아, 파일을 600개씩 업로드하는 걸로 타협하였다. WebUI의 설정에서 Japanese 와 txt 출력을 제대로 선택하여, 약 3800개 정도의 대본을 생성했다. 2900개의 origin 대본을 생성한 후, Colab 에서의 코딩을 통해 압축을 하여 다운받아주고, 이어서 900개정도 되는 zero의 대본도 작성후 압축 및 다운로드 하였다.

또한 바로 다음과정인 Prompty에 첨부하기 위해, 파이썬 프로그램을 작성하여 모든 텍스트 파일을 한 개의 텍스트파일 '대본.txt'로 병합하였다.

 Prompty를 통한 GPT봇(마키세 크리스) 세팅 

Prompty는 GPT를 세팅하거나 질문하는 법에 대해 알려주는 GPT이다.

GPT Store 에서 prompty를 검색하고, Try Prompty를 눌러 사용을 시작한다. 영상과 같이 두 개의 파일을 첨부하여 질문하였다.

GPT의 답변은 복사하는 버튼이 있어 그 버튼을 통해 내용을 복사해도 되지만, 영상에서는, Prompty의 답변을 직접 드래그로 긁어 DeepL 번역기로 한글 번역을 하여 크리스 봇에 세팅하였다.

두 복붙 방법의 장단점이 있는데 아래와 같다.

위 내용은 복사버튼을 통해 내용을 가져온 경우이다. 빨간색 테두리를 친 부분은 답변 내용에 보이지 않았던 필요없는 부분인데, 같이 복사가 된다.

반면에 답변을 전체 드래그해서 복사를 하게 되면 빨간색 테두리를 친 부분은 보이지 않지만, 파란색 테두리로 표시한 제목을 의미하는 ### 나 OL과 UL을 나타내는 숫자나 기호도 모두 누락이 되기 때문에 문제가 되었다.

내 경우에는 복사버튼을 통해 내용을 가져와 필요없는 부분을 모두 지워주는 방향을 택했다. 사실 이렇게 세세하게 하지 않아도 잘 작동할 것 같긴 하다. 그리고 '쿠리수'는 '크리스'로, '스타인즈' 는 '슈타인즈' 로 바꿔주던가 하는 세세한 작업도 하였다.

영상에서 언급한, 일본어와 한국어 양쪽으로 답할 수 있도록 재현해 보았다. 사실 Prompty의 답변이 갈린 시점부터 영상과 유사하게 진행하는것은 어려워졌는데, 어설프게 따라했더니 챗봇에게 아래와 같은 답변을 받았다.

첫 답변만 제외하고는 나름 괜찮게 되었다.

참고로 영상에서의 챗봇은 아래와 같았다.

추후에 대화창 UI에 띄우는 내용은 아마 한글 번역쪽이 되는 듯 하다.

Selenium(셀레니움)을 통한 연결

영상에 언급되기를

'GPTs는 api가 따로 없기 때문에(assistance : 기존 GPT 커스텀 기능 - 어려움, 유료) Selenium으로 api(물리)를 구현 할 예정' 

라는 내용이 있어, Selenium을 사용한다고 한다.

지금까지 사용 해 온 GPT의 API는 이전 대화를 기억하지 못하는 일회성 API였기 때문에 매번 호출을 할 때마다 챗봇의 세팅과 과거 로그를 모두 추합하여 요청을 보내야하는 문제점이 있고 비용문제도 확실히 커지게 된다.

과거 Selenium을 사용하여 ChatGPT 페이지를 사용하기 위해 긴 시간을 들여 구글로 로그인하는 문제를 어느정도 완화는 했었다. 기본적으로 봇이 가동중인 웹브라우저는 구글로그인에서 막히기 때문에 외부라이브러리를 사용하여 셀레니움에 약간의 조작을 할 필요가 있었다. 그리고 아이디/패스워드만으로는 구글로그인을 시켜주지 않기 때문에 직접 휴대폰에서 확인을 한번 해주어야 로그인이 되는 것이 그 때의 최종 문제였다.

현재 커스텀 GPTs를 공개 공유링크로 접속해보면, ChatGPT Plus 구독이 필요하며 로그인 버튼이 뜨기 때문에, 위의 로그인 과정은 필요한 것으로 보인다. 아마 영상에서의 셀레니움은 Visual Novel UI 구동과 함께 셀레니움이 동시에 실행되며 그 시점에 최초로 로그인을 한번만 하면 이후 계속 켜져있는 상태로 보인다. 일단 영상에 보이는 상태로는 그렇게 예상되는데, 내 경험에는 셀레니움과 Visual Novel UI(QT인가 싶었는데 코드를 보면 아닌가 싶기도)에서 스레드 점유 문제가 있지 않나 생각되어서 지금 시점에서는 어떻게 될지 모르겠다. 지금껏 그래왔던 것처럼 시간을 갈아넣으면 어떻게든 되지 않을까.

영상을 살펴보는데 파일구조는 아래와 같다.

?????NT.py
ChatWaifu.py
ChatWaifu_Modified.py // 위 파일을 개선한듯
chromedriver.exe
CombinedChatGPTScript.py
CombinedChatGPTScript_Full.py // Full과 아닌 코드의 차이점은 모르겠다. 230라인으로 이루어짐. GPT의 대답을 가져옴.

ChatWaifu_WithInputHandling.py // 가장 마지막 단계에 커스텀UI와 셀레니움을 결합하는데에 사용

(단계 완료 후 이어서 작성)

남은과제 : 셀레니움 환경 갖추기 / TTS 변환 모델 작성하기 / UI구성(간단하게는 만들었지만 위 영상처럼은 어떻게 만들었는지 신기함 텍스트 표시 방식 등)

반응형