
페퍼스 고스트로 실물 크기 AI 홀로그램을 만든 이야기 - SORA // NEXUS 개발기
요약
페퍼스 고스트 기법을 활용하여 실물 크기의 AI 홀로그램 캐릭터 'SORA'를 제작한 개발기입니다. Gemini와 Ollama를 결합한 하이브리드 LLM 구조, MediaPipe를 이용한 제스처 인식, RAG 기반 지식 베이스 등 다양한 기술 스택을 통해 상설형 AI 에이전트를 구현했습니다.
핵심 포인트
- 페퍼스 고스트 기법을 이용한 저비용 고효율 홀로그램 구현
- Gemini API 할당량 초과 시 Ollama로 자동 전환하는 폴백 설계
- MediaPipe와 insightface를 활용한 제스처 및 얼굴 인식 기능
- RAG를 적용하여 전시 관련 지식 기반의 정확한 답변 제공
- 감정 태그를 통한 아바타의 실시간 표정 변화 구현
서론
VRM 아바타를 실시간으로 투영하는 「실물 크기 AI 홀로그램 캐릭터」를 직접 제작했습니다.
이름은 SORA(소라). 이벤트 및 전시장에서 방문객에게 자발적으로 말을 걸고, 얼굴을 인식하여 대화하며, 음성으로 응답하는 상설형 AI 에이전트입니다.
투영 방법은 고전적인 무대 기법인 페퍼스 고스트 (Pepper's Ghost). 45도로 기울인 하프 미러(Half-mirror)에 영상을 반사시킴으로써, 공중에 입체적인 영상이 떠 있는 것처럼 보이게 합니다. 특수한 장비는 필요하지 않으며, 모니터, 아크릴판, 암실만으로 구현할 수 있습니다.
기술 스택
| 레이어 | 기술 |
|---|---|
| 백엔드 | Python / FastAPI / WebSocket |
| ... |
시스템 구성
[카메라] → MediaPipe 얼굴 검출 → insightface 방문객 인식
↓
Gemini 2.5 Flash ← FastAPI WebSocket ← 브라우저(Three.js)
...
백엔드는 FastAPI의 WebSocket을 통해 하나의 영구 연결을 유지하며, 카메라 프레임, 텍스트, 음성, 커맨드를 모두 이 연결을 통해 주고받습니다.
최근 구현한 5가지 신기능
1. Ollama 폴백 (Fallback)
Gemini API가 429(RESOURCE_EXHAUSTED)를 반환했을 때, 자동으로 로컬 LLM으로 전환합니다.
async def call_ollama(messages: list) -> str:
async with httpx.AsyncClient(timeout=60) as client:
response = await client.post(
...
이벤트 도중 API 할당량(Quota)이 소진되어도 멈추지 않는 설계입니다.
2. 리모트 컨트롤 (Remote Control)
스태프가 스마트폰에서 조작할 수 있는 전용 오퍼레이터 화면을 추가했습니다. WebSocket으로 본체와 연결하여 인사 발화, 음량 제어, 대화 리셋 등을 원터치로 실행할 수 있습니다.
3. 제스처 인식 (MediaPipe Hands)
카메라에 비친 손의 제스처를 MediaPipe로 검출합니다.
- wave (손을 흔듦) → 소라가 알아차리고 인사
- thumbs_up (엄지를 치켜세움) → 긍정적인 반응
MediaPipe 버전에 따라 Solutions API의 유무가 다르기 때문에, 임포트 실패 시에는 그레이스풀 디그레이데이션 (Graceful Degradation) 처리를 합니다.
4. 타임테이블 자동 안내
data/timetable.json에 시각과 대사를 등록해 두면, 해당 시각이 되었을 때 자동으로 발화합니다.
{
"entries": [
{"time": "10:00", "message": "안녕하세요. 오늘도 잘 부탁드립니다."},
...
전시회의 개장, 휴식, 폐장 안내를 자동화할 수 있습니다.
5. 지식 베이스 (간이 RAG)
data/knowledge/ 폴더에 txt, md, pdf 파일을 넣어두면 소라가 대화 중에 참조합니다. 전시 내용에 대한 설명 문서를 넣어두면, 방문객의 "이것은 무엇인가요?"라는 질문에 정확하게 답변할 수 있게 됩니다.
고안한 점
미러 모드
페퍼스 고스트에서는 영상이 좌우 반전되어 보이기 때문에, body { transform: scaleX(-1) }를 사용하여 전체를 반전시켰습니다. 이를 통해 투영 시 올바르게 보이도록 했습니다.
감정 태그
AI의 답변 텍스트 중에 [emotion:happy]와 같은 태그를 삽입함으로써, 아바타의 표정을 실시간으로 변화시키고 있습니다.
얼굴 인식을 통한 방문객 식별
insightface의 ArcFace(512차원)를 사용하여 방문객의 얼굴 임베딩(Embedding)을 DB에 저장합니다. 재방문자를 인식하여 "또 와주셨네요"라고 말을 거는 경험을 구현했습니다.
리포지토리
FastAPI + WebSocket + Gemini + Three.js VRM의 조합에 관심이 있는 분, 페퍼스 고스트를 시도해 보고 싶은 분들은 꼭 확인해 보세요.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기