단기 — MP4 전환 개선
talking 비디오를 미리 마운트하고 opacity만 바꾸며, 상태 변경마다 랜덤 재선택하지 않는다.
구현은 가볍지만 발화-입모양 일치 문제 자체는 해결되지 않는다.
마지막 업데이트 2026-07-22
TL;DR
현재 핑퐁이 아바타는 AI 발화 오디오와 입모양이 맞지 않아, 아동에게 "AI 같다 / 부자연스럽다"는 인상을 준다.
외부 서비스(sync.so, simli)는 각각 실시간 미지원·한국어 미지원으로 실시간 수업에는 부적합하다.
가장 현실적인 1차 개선안은 base MP4 위에 mouth overlay를 얹고, AI 출력 오디오의 RMS 값으로 입 모양을 바꾸는 자체 방식이다.
핑퐁이 AI 세션에서 AI의 발화 오디오와 아바타 영상의 입모양이 일치하지 않는다. 입모양이 실제 발화의 리듬·강세·무음 구간과 무관하게 움직이기 때문에, 사용자(특히 아동)는 "AI 같다", "부자연스럽다"고 느낀다.
이는 또래 대화 연습이라는 핑퐁이의 핵심 가치(실제와 같은 대화 경험)를 직접적으로 훼손한다.
이 문서는 발화에 맞춰 아바타 입모양이 자연스럽게 움직이도록 만들 수 있는 방법을 검토한다. 자체 구현과 외부 서비스 활용을 모두 비교하고, 핑퐁이의 실시간 대화 흐름에 적용 가능한 현실적 개선안을 도출한다.
output_audio_buffer.started → AI 발화 상태 trueoutput_audio_buffer.stopped / cleared → AI 발화 상태 falseisPeerTalking 값에 따라 idle / talking 상태 설정output_audio_buffer.* 이벤트는 립싱크 이벤트가 아니다. "AI가 말하는 중"이라는 거시 상태만 전달한다.
그 결과:
핵심. 입모양은 말한다/안 한다 라는 거시 상태가 아니라, 오디오의 미시 신호(음량·음소)에 따라 움직여야 한다.
| 파일 | 해상도 | FPS | 길이 | 크기 |
|---|---|---|---|---|
avatar_tiki09_taerin_idle_0.mp4 |
1920×1072 | 30 | 약 10.07초 | 약 16MB |
avatar_tiki09_taerin_talking_0.mp4 |
1920×1072 | 30 | 약 10.07초 | 약 18MB |
두 영상은 구도와 인물 위치가 거의 고정되어 있어, 입 영역만 따로 추출/합성하는 오프라인 전처리에 적합하다.
| 단계 | 방식 | 동기화 정확도 | 구현 난이도 | 실시간 적합 |
|---|---|---|---|---|
| 단기 | MP4 전환 최적화 | 낮음 | 매우 낮음 | O |
| 중기 (권장) | base MP4 + RMS 기반 mouth overlay | 중간 | 중간 | O |
| 장기 | viseme/phoneme 기반 정밀 립싱크 | 높음 | 높음 | △ |
| 외부 | 외부 립싱크 서비스 | 서비스별 | 낮음~중간 | 서비스별 |
talking 비디오를 미리 마운트하고 opacity만 바꾸며, 상태 변경마다 랜덤 재선택하지 않는다.
구현은 가볍지만 발화-입모양 일치 문제 자체는 해결되지 않는다.
base MP4 위에 입 레이어를 얹고, AI 출력 오디오의 RMS/volume에 따라 입 모양을 교체한다.
발화 음량 변화에 입이 반응하므로, 사용자가 인지하는 부조화를 가장 큰 폭으로 줄일 수 있다.
음소·viseme 타임라인을 생성해 입모양을 정확히 동기화한다.
품질은 최고지만 별도 파이프라인과 비용 부담이 크다.
전체 idle/talking MP4를 통째로 스위칭하는 대신, idle은 기본 영상으로 두고 talking에서 입 주변 변화만 추출해 별도 레이어로 사용한다.
idle_base.mp4
ㄴ 전체 아바타 배경/몸/얼굴 기본 움직임
mouth_overlay (.webm 또는 sprite .webp/.png)
ㄴ talking 영상에서 입 주변 변화만 추출한 레이어
runtime
1. idle_base.mp4 재생
2. AI audio RMS 분석 (AudioContext + AnalyserNode)
3. RMS 값에 따라 closed / small / medium / open 프레임 선택
4. 입 위치에 overlay
입 crop sprite — talking 영상에서 입 주변만 crop해 closed/small/medium/open 이미지로 분류.
구현·런타임 성능이 좋다. 다만 아바타별 입 좌표 설정이 필요하다.
difference mask — talking·idle 프레임 차이를 계산해 입 주변 변화만 alpha layer로 추출.
원본 영상 질감 유지에 유리하다. 다만 눈 깜빡임·머리 미세 움직임이 노이즈로 잡힐 수 있다.
landmark 기반 — 얼굴 랜드마크에서 입 좌표를 추적하고 별도 그래픽 입을 렌더링.
제어력이 가장 좋다. 다만 기존 MP4의 입 질감을 그대로 쓰지는 못한다.
idle_base.mp4 재생AudioContext + AnalyserNode로 받아 RMS 계산외부 서비스는 크게 두 가지로 나뉜다.
핑퐁이는 OpenAI Realtime 기반 실시간 대화이므로, 배치형은 실시간 수업 화면에 원천적으로 적용 불가다.
| 서비스 | 분류 | 상태 | 결론 |
|---|---|---|---|
| sync.so (Sync Labs) | 배치 생성형 | 검토 완료 | 실시간 부적합 → 탈락 |
| simli.com | 실시간 스트리밍형 | 검토 완료 | 품질·언어 제약으로 부적합 |
| NavTalk | 실시간 스트리밍형 | 검토 완료 | Simli보다 자연스러우나 여전히 부자연 |
| (추가 후보) | — | 예정 | — |
https://console.navtalk.ai/realtime-talk
realtime-talk 콘솔에서 실시간 대화 데모 확인.이전 조사 후보군 중 추가 PoC 또는 정보 확인 대상이다.
fal.ai LatentSync — video_url + audio_url 입력. 개발자 친화 API. 사람형 얼굴 최적화 여부 검증 필요. 실시간보다는 비동기.
DomoAI — video/image + audio 또는 TTS. anime/cartoon/CGI 캐릭터 지원 명시. 자동화·API 운영성 별도 확인 필요.
Kling Avatar / Kling Lip Sync — portrait/image/video + audio. 캐릭터 이미지 기반 talking video 생성에 강점. 기존 MP4 편집보다는 신규 생성에 적합.
AKOOL — talking photo image + audio. 정면 얼굴 캐릭터 기반. 결과 URL 보존 등 운영 제약 확인 필요.
Runway — image/video + audio/text. 일반 Lip Sync는 human face 제약 강함. 우선순위 낮음.
/main/meet, /guest)결론. 자체 base MP4 + mouth overlay + AudioContext RMS 분석 방식이 발화-입모양 불일치 문제를 해결하는 가장 현실적인 1차 개선안이다.
아동 음성, 식별 가능한 인물 이미지, 내부 캐릭터 자산을 외부 API에 전송할 경우 개인정보·동의·보관기간·학습 사용 여부를 사전 검토해야 한다.
avatar_tiki09_taerin_talking_0.mp4 기준 입 crop 좌표 산출AudioContext + AnalyserNode로 OpenAI Realtime 출력 RMS 측정 → 임계값 매핑검증 지표