프로젝트 둘기N: 뉴로-라이크 AI 컴패니언 엔진
데모 영상
비둘기 이야기
지난 1월, 뜬금없이 불어닥친 팰월드 열풍에 나와 친구들의 작은 서클에서도 몇 명이 휩쓸렸고, 휩쓸린 친구들 중 한 명이 자기 서버에서 24시간 팰월드 서버를 구동하여 거기서 다 같이 플레이하기로 했다.
문제는 당시 팰월드 서버가 최적화를 엿바꿔먹은 굉장히 무거운 프로그램이었다는 것으로, 다른 프로그램들도 같이 구동되고 있던 친구네 서버의 자원을 팰월드 서버가 너무 벅벅 긁어먹은 탓에, 팰월드 서버는 24시간 구동 말고 누군가가 게임을 할 때만 요청에 따라서 켜고 꺼가며 사용하기로 했다.
그리고 팰월드 서버가 현재 구동중인지를 어떻게 알리는가 하는 것으로는, 때마침 작은 ARM 서버가 생겼던 내가 “다른 것도 이것저것 해 볼 겸” 친구들과 있는 디스코드 서버에 작은 봇을 한 대 만들어보는 것으로 해결했다.
“(서버 상태)정보를 나르는 비둘기”랍시고 “둘기”라고 이름 지은 이 봇은 처음 한 달간은 팰월드 서버 구동 여부 표시, 겜팟 일정 관리와 알림 등 소소한 유틸리티로서 잘 활용돼왔고,
팰월드 열풍이 사그라들기 시작한 다음 달, OpenAI의 텍스트 생성 API에 관심이 생긴 나는 둘기에게 AI 챗봇 기능을 넣어보기로 했다.
이후로 둘기는 이런저런 온갖 잡기능들을 주렁주렁 매달아보는 실험적 프로젝트로서 무럭무럭 자라났고, 이젠 관리가 슬슬 버거워지는 정도의 크기가 되어있다.
프로젝트 둘기N
약 한 달쯤 전, 나는 둘기에게 디스코드 음성 채팅에 참가해 말하는 기능을 넣으려고 시도했었다. 지금도 둘기는 조촐한 ARM 서버에서 구동되고 있는데, 음성 채팅을 토나오지 않는 속도로 처리하기 위해서는 제법 무거운 뉴럴 네트워크를 빠르게 구동해야 했기에, 내 컴퓨터에서 음성 데이터를 처리하고 이를 둘기 서버로 보내는 게이트웨이 프로그램을 만든 뒤에 이를 둘기에 연결해서 써보려 했었다.
이 시도는 이런저런 이유로 인해 실패로 끝났다. 하지만 둘기와 말로 대화한다는 아이디어와, 만들어놓은 게이트웨이 프로그램을 그냥 폐기하기는 조금 아까웠기에 이를 어떻게 재활용할 방법이 없을까 생각하던 중, 종종 유튜브에 클립이 뜨면 재밌게 보고 있는 AI 버튜버 뉴로사마가 떠올랐다.
‘이거 잘 하면 나도 뉴로사마 같은거 만들어볼 수 있지 않을까?’
둘기N의 개발 목표
둘기N은 디스코드에서 구동되는 둘기와는 무관한 스탠드얼론 엔진으로, 뉴로사마의 수많은 기능들 중 내가 멋대로 “컴패니언 활동”이라고 분류한 기능들만 구현해보는 것을 목표로 해서 개발되었다.
목표로 잡은 기능들은 다음과 같다.
- 내가 하는 말 듣기
- 적절한 상황에 말하기
- 비전 등 추가 컨텍스트 처리
- OBS에 끼워 쓸 수 있는 그림/자막 오버레이 제공
둘기N의 구조
이 프로젝트에서 메인 프로그램은 백엔드 구구 게이트웨이와 프론트엔드 둘기N의 두 프로그램이다.
백엔드 구구 게이트웨이는 위에서 언급한 디스코드 음성채팅 기능에 쓰려고 만든 게이트웨이 프로그램으로, 음성 데이터를 받아 텍스트로 반환하는 음성인식 핸들러와 텍스트를 받아 음성합성 데이터를 반환하는 음성합성 핸들러를 외부 프로그램이 사용할 수 있도록 제공한다.
음성인식 핸들러는 faster-whisper에 faster-whisper-large-v3 모델을 사용한다.
음성합성 핸들러는 GPT-SoVITS에 기본 제공된 모델을 사용하며, 음성합성에 사용된 레퍼런스 음성은 ElevenLabs에서 클로닝이 아닌 패러미터로 생성한 음성을 Audacity로 살짝 후처리하여 사용했다.
프론트엔드 둘기N은 사용자 음성을 받아 구구 게이트웨이로 보내고, 사용자와의 대화 내역과 화면 캡처 등 기타 컨텍스트를 수집하여 GPT-4o에 적절한 대답을 요청하고, 받아온 대답을 구구 게이트웨이로 보낸 뒤 반환되는 음성합성 데이터를 사용자에게 재생한다. 그리고 예전에 만들다 관둔 게임 개발 프레임워크 플로라의 코드를 메챠쿠챠 뜯어와서 활용하여 OBS에서 사용할 수 있는 그림/자막 오버레이도 제공한다.
대부분의 작업은 AI 모델들이 처리하고, 직접 짠 코드는 얼마 되지 않는다. 프로토타입이랍시고 얼기설기 만든 것이기도 하고, 날림으로 쓴 코드가 부끄럽기도 해서 이 두 프로그램을 오픈소스할 생각은 없다.
아쉬운 점들
일단 작동하는 프로토타입을 만들긴 했는데, 지금 상태로는 여러모로 아쉬운 점이 많이 보이고 있다.
음성인식의 정확도
근본적으로는 내 발성이 좋지 않은 탓이겠지만, 음성인식의 정확도가 꽤 떨어진다. 개떡같이 보내줘도 GPT-4o가 찰떡같이 알아들어주니 아예 대화가 안 되는 그런 정도는 아닌데, 콘솔에 뜨는 음성인식 로그를 보면 처참한 정확도에 항상 미간이 찌푸려진다.
아마 파인튜닝으로 개선할 수 있겠지만, 12GB VRAM의 나약한 RTX 3060으로는 Whisper의 large-v3 모델을 파인튜닝할 수 없다.
다른 모델도 찾아보긴 했는데, 라이선스 문제가 없고 로컬에서 구동할 수 있는 모델 중에서는 그나마 Whisper만한 게 없는 것 같았다. 일단은 성능의 벽에 가로막혀 개선이 어려운 상황.
PTT로 인한 자연스러운 대화 불가능
원래는 VAD 같은 것도 넣어서 그냥 마이크에 대고 말만 하면 알아서 다 긁어가는 시스템을 만들려고 했는데, 둘기N의 개발 환경에서 쉽게 사용 가능한 VAD 솔루션을 찾지 못했고 구현이 어려워보여 일단 이 부분은 Push-to-Talk 방식으로 구현해놨다.
말할 때 지정된 키를 누르면 녹음을 시작하고, 키를 떼면 녹음된 데이터가 전송된다.
작동하긴 하는데, 번거롭다. 더 자연스러운 대화를 구현하려면 이 부분도 고쳐야 할 것이다.
음성합성의 성능
이것도 원래 음성합성 한 마디 하는데 20초씩 걸리던 걸 쓸데없는 오버헤드를 깎고 또 깎아서 최대한 줄인거긴 한데, 여전히 만족스럽지 않다. “리얼타임 대화”를 가로막고 있는 가장 큰 성능 보틀넥이 현재 이 녀석이라는 점에서 특히 모난 돌처럼 아픈 부분.
여기도 마찬가지로 성능을 끌어올릴 뾰족한 수가 더 이상 없는 상황이다. 그래픽카드가 더 좋았다면…
음성합성의 품질
간헐적으로 들리는 쇳소리라던가 종종 발음을 이상하게 하는 경우 등 나오는 결과도 그닥 만족스럽지 않다.
GPT-SoVITS의 모델 파인튜닝 기능을 대충 테스트해보니 훨씬 더 안정적인 한국어 발음을 만들 수 있는 것을 확인할 수 있었다.
다만 당장은 라이선스 문제 없이 훈련 가능한 데이터셋을 구하기 귀찮으므로 이 아이디어도 보류.
GPT-4o
개인적으론 이게 제일 아쉽다.
디스코드 챗봇으로도 오래 써왔다보니 뻔히 보인 문제긴 한데, 좀 툭 까놓고 말하자면 GPT-4o는 이런 용도로 쓰기엔 너무 샌님이다.
예를 들어 지금 ChatGPT에게 폭탄이나 마약 만드는 법 같이 위법적인 내용을 물어보면 “그런 건 도와줄 수 없다”고 딱 잘라 거절할 것이다. 나는 이런 검열은 당연히 필요하다고 생각하고, 이런 검열 자체에는 아무런 불만이 없다.
문제는 OpenAI 사의 GPT 모델들은 이 “안 된다고 딱 잘라 말해야 한다”의 범위가 좀 과하다 싶을 정도로 넓게 잡혀 있다는 것이다. 대화가 조금이라도 부적절하다 싶은 주제로 빠지면 못 들은 척 칼같이 말을 돌리고, 절대로 대화에 참여하려 하지 않는다. 인터넷 방송에서 종종 들을 수 있을법한 가벼운 욕설조차도 얘한테 해달라 하면 정색하며 말을 돌리려 한다.
GPT는 ChatGPT같은 친절한 어시스턴트를 만드는 데는 몰라도, 웃기는 인터넷 방송 같은 걸 하기에는 매우 부적절한 뇌라고 할 수 있겠다.
게다가 이 검열은 모델 훈련 단계에서 박히는 것이다 보니, 사용자 입장에서 어떻게 무력화하고 사용할 수도 없다. OpenAI는 파인튜닝의 데이터도 검열한다는 듯하니, GPT 모델이 험한 말을 하게 하는 것은 아마 아예 불가능하지 않을까 싶다.
뉴로사마처럼 자체적으로 훈련한 LLM을 굴리면 훨씬 더 재미있는 결과물을 얻을 수 있겠지만, RTX 3060으로 멀쩡한 한국어를 내뱉는 LLM을 굴리는 것은 그냥 불가능하다. 여기도 결과적으론 성능의 벽에 가로막혀 있는 상황.
결론
둘기N은 결국 성능 등의 여러가지 문제로 원하는 마일스톤에 도달하지 못한, 개인적으로는 실패작이다.
누가 4090 사줄 것도 아니고 H100 클러스터가 하늘(히히)에서 뚝 떨어질 것도 아니니 성능 문제가 해결될 일은 없어보이고, 지금 상태로는 어디 쓸만한 용도도 없어보이고.
아마 이 프로젝트는 이대로 폐기하게 되지 않을까 싶다.
그래도 만드는 동안 재미있었으니 그거면 된 거 아닐까?
마지막으로 AI 그림이 아닌 귀여운 판때기라도 하나 달아줄 수 있었으면 좋았을텐데…
댓글