작년에 진행했던 연구 프로젝트를 오픈 소스로 방금 공개했습니다.
이것은 LLM NPC를 위한 완전한 로컬 음성 대 음성 (speech-to-speech) 백엔드입니다. 즉, 음성 인식 (speech-to-text), 로컬 LLM, 음성 합성 (text-to-speech) 과정에서 클라우드가 전혀 필요하지 않습니다. 주요 초점은 단순히 플레이어에게 대답하는 것이 아니라 NPC들이 서로 대화하는 것이었으며, 저의 연구는 플레이어가 이러한 NPC 간의 대화를 목격할 때 어떤 경험을 하는지, 그리고 그것이 몰입감 (immersion)에 어떤 영향을 미치는지 살펴보았습니다.
NPC들은 서로 대화할 수 있고, 자신이 말한 내용을 기억하며, 나중에 플레이어가 자신에게 말을 걸 때 그 문맥 (context)을 사용할 수 있습니다. 또한 이야기를 약간 유도하기 위해 NPC에게 숨겨진 행동 노트를 주입할 수 있는 백그라운드 게임 매니저 (Game Manager) AI도 있습니다.
지연 시간 (Latency)은 주요 기술적 과제 중 하나였습니다. VR을 위한 Llama 3.2 3B와 4070 Ti에서의 7B 모델을 사용하여 첫 오디오 도달 시간 (Time to First Audio, TTFA)을 약 400~600ms 정도로 구현했는데, 이는 NPC가 생각하기를 기다리는 것이 아니라 실제 대화처럼 느껴지기 시작하는 지점입니다. 또한 데모에서 볼 수 있듯이 Unity 씬과 함께 실행됩니다.
여러 명의 NPC를 위해 GPU에 과부하가 걸리지 않도록 공유 생성 잠금 (shared generation lock)을 사용했습니다. 각 NPC는 자신만의 LLM 문맥/성격 (context/personality) 및 TTS 설정을 갖지만, 한 번에 하나만 생성합니다. 이들은 차례를 지키며, 캐릭터 간의 전환은 기본적으로 즉각적이어서 자연스럽게 느껴집니다. 한계점은 두 명의 NPC가 정확히 같은 순간에 말로 겹칠 수는 없다는 것입니다.
WebSocket 기반이므로 Unity, Unreal 또는 WebSocket을 통해 통신할 수 있는 모든 것과 함께 작동할 것입니다. Unity 스크립트도 포함했습니다.
많은 분이 이것을 시도해보고, 이를 기반으로 발전시키거나 피드백을 주셨으면 좋겠습니다. 여러분의 게임에 맞게 조정하려면, 주요 작업은 3계층 NPC 프롬프트 (3-layer NPC prompt) 설정과 게임 매니저 프롬프트를 튜닝하는 것입니다. 약간의 작업이 필요하지만 AI의 도움을 받으면 충분히 가능하며, 나중에는 많은 부분이 자동화될 수 있다고 생각합니다.