라이브 예나 (실시간 대화 + 립싱크)
한 줄: 브라우저에서 예나와 실시간으로 말을 주고받고, 예나 얼굴이 입모양을 맞춰 움직이는 웹. 09-15에 애니·실사·남자(예준) 세 팩을 Cloudflare Workers에 배포했다.
무엇을 만들었나
index.html한 장. 마이크 16kHz PCM16 → Gemini Live 웹소켓 → 24kHz 음성 재생 + 출력에 맞춘 입모양 전환 + 끼어들기 처리 + 자막.- 발단: 제이크가 tegnike의 AITuberKit + GPT-Live-1 게시물을 보고 「예나로 만들면 좋겠다」. AITuberKit은 상업 이용 유료 라이선스라 참고만 하고 코드는 쓰지 않았다. 표시·립싱크 규격은 MotionPNGTuber(MIT)에서 가져왔다.
- 설계를 가른 사실: 예나 목소리의 원본이 Google Flow 내장
Laomedeia라서, 로컬 클론(컷당 38~110초)을 거치지 않고 Gemini 프리빌트 보이스로 실시간 호출이 된다. - 세 팩 (주소 하나, 쿼리로 전환):
| 팩 | 이름 | 목소리 | 클립 | 한마디 |
|---|---|---|---|---|
기본 clips/ | 예나 | Laomedeia | idle4·talk3 | 12줄 |
?pack=real | 예나 | Laomedeia | idle8·talk6 | 12줄 |
?pack=male | 예준 | Orus | idle4·talk3 | 12줄 |
- 아이들 «한마디»: 미리 뽑은 음성을 제스처 한 번 뒤 11
22초, 이후 4590초마다 들려준다. 목소리는 라이브가 쓰는 그 목소리의 클론이어야 한다. - 자산 계보: 기준컷 = 로컬 ComfyUI Golden Hour 시드 77007(무료) · 아이들 클립 = fal MiniMax H3 Max I2V(0.036/장) · 모프 = 로컬 RIFE · 음성 = Gemini Live 무료 티어.
경과
- 09-11 — 배선부터 확인. 헤드리스 자동 검증으로 소켓 연결 → 오디오 215청크 10.44초 수신 → 입모양이 닫힘/반/열림 세 상태를 실제로 오감. 밤에 입 프레임을 로컬 Golden Hour로 옮겼다(제이크 선택) (2026-09-11)
- 09-12 — 기준 그림체·기준컷 레시피 확정(Golden Hour · 1024×1536 · seed 77007, 제이크 지목
yena_refstyle_1). 입 «모양»은 자막 텍스트(한글 중성 분해)가, 입 «크기»는 오디오 포락선이 맡도록 신호를 분리 (2026-09-12) - 09-13 — 영상 클립 재생, 실사판, 키를 페이지에 두지 않는 서버 중계까지. 7모양(음·으·어·오·에·이·아) + 21쌍 모프 (2026-09-13)
- 09-14 — 남자 팩 「예준」 기준컷 → 완성 → 배포. 말하기 클립 이음매·속도·나가기를 제이크 3연속 지적으로 고침. 아이들 한마디 두 팩 12줄씩 완성·배포, 「말은 안하는데?」 원인 셋 수정 (2026-09-14)
- 09-15 — 세 팩 모두 한마디까지 배포, 로컬 터널(cloudflared) 정리. PC와 무관하게 돈다 (2026-09-15)
결과물
배포: https://live-yena.pjake9401.workers.dev/ (?pack=real · ?pack=male)
- 옛
trycloudflare.com주소는 죽었다.
녹화 live_yena_video.mp4 (25초, 소리 있음, 09-13)
포스터 — 3초 지점
라이브가 쓰는 기준컷 fal_input.png (09-12)
입모양 프레임 시트 (09-13)
아이들 클립 비교 시트 (09-13)
남자 팩 「예준」 기준컷과 후보들 (09-13~14)
판정 · 배운 것
- 말하기 클립 = «끝 고정 + 10초»(5초면 입이 죽는다). 말하는 속도는 «횟수»로 지정한다(초당 두 음절·스무 번). 말이 끝나면 «입 다무는 다음 순간»까지 기다렸다 나간다(상한 600ms).
- 자동재생이 막히면 «멈춘 그림»이 된다 — 거절 이유를 로그에 남기고 제스처로 이어 튼다. 시간으로 도는 판정은 rAF가 아니라 setInterval에 둔다.
- 말할 때 깜빡이지 않는다(제이크). 깜빡임·고개·몸 움직임은 아이들에서만. 말하기는 아이들 프레임(235)에서 파생해 바뀌는 건 입뿐이다.
- 입모양 프레임을 자동 분류하지 말 것 — 분류기 세 개가 다 틀렸다. 대조 시트로 눈으로 고른다.
- 편집 모델은 «지정하지 않은 것»을 바꾼다 — 조명 유지를 안 적었더니 볼 광택이 한 장만 2.6배.
- 비교용 기준컷으로 유튜브 파이프라인 자산(그린백 「예나쌤」)을 잘못 쓴 적이 있다 — 라이브가 쓰는 건
fal_input.png다(제이크가 잡음). - 남은 것: 예준 팩 클론 통일(옛 Gemini TTS 판 보관), 중간 끊김 원인 미확정(계측·자동 재접속은 들어가 있다). 아이들 애니메이션 확장 ①(포즈 기반 여행) 적용 후 제이크 검수 대기.
링크
- 원본 폴더:
D:\claude\content\live-yena\(경위·판정·실측 전부_meta.txt, 시간순) ·ARCHITECTURE.md - 로컬 실행:
python server.py→ http://127.0.0.1:8799/index.html - 배포: https://live-yena.pjake9401.workers.dev/
- brain 기록:
Memory/resume/live-yena.md·Sessions/archived/hot-blocks-2026-09-08_17.md(09-11~15 블록) ·Decisions/2026-09-12-viseme-driving-signal-separation.md - refer 가이드:
refer/tts_guide.md(목소리 계보) ·refer/fal_h3max_video.md·refer/pixel_sprite_pipeline.md·refer/anime_model_bakeoff.md - 관련: 예나의 방 월페이퍼
