SSR 친화적인 아바타 구축: 브라우저 내 AI로 Python 모델을 훈련하고 TensorFlow.js로 포팅하기

발행: (2025년 12월 9일 오후 09:02 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

Building SSR-Friendly Avatars with In-Browser AI: How I Trained Python Models and Ported Them to TensorFlow.js의 커버 이미지

문제

아바타 라이브러리는 보통 두 가지 유형으로 나뉩니다:

  • Canvas 기반 – 빠르지만 SSR과 접근성을 깨뜨림
  • SVG‑이미지 – SSR 친화적이지만 동적 테마 적용이나 컴포넌트 조합이 어려움

저는 두 가지를 모두 원했습니다: 진정한 SSR 호환성 사용자 사진을 이용한 지능형 아바타 생성.

Native SVG = 일류 SSR

Avatune의 모든 아바타는 캔버스나 base64 이미지가 아니라 실제 SVG 요소로 렌더링됩니다. 이는 다음을 의미합니다:

  • 수분 불일치 제로 – 서버가 클라이언트와 동일한 마크업을 렌더링
  • 접근성 내장 – 스크린 리더가 SVG 의미론에 접근 가능
  • CSS 스타일링 작동 – 선택자로 요소를 타깃하고 CSS 변수를 사용
  • DevTools에서 검사 가능 – 일반 DOM 요소처럼 디버깅
import { Avatar } from '@avatune/react';
import theme from '@avatune/pacovqzz-theme/react';

// This SSR renders as clean SVG markup
function UserCard({ seed }: { seed: string }) {
  return ;
}

실험적인 인‑브라우저 ML 예측기

저는 CelebAFairFace 데이터셋을 사용해 Python에서 TensorFlow/Keras로 여러 CNN 모델을 학습한 뒤, 브라우저 추론을 위해 TensorFlow.js로 변환했습니다:

  • 머리카락 색 예측기 – 검정, 갈색, 금발, 회색
  • 머리 길이 예측기 – 짧음, 중간, 길음
  • 피부 톤 예측기 – 밝음, 중간, 어두움
  • 수염 예측기 – 면도된 상태 vs 수염

학습 파이프라인은 Marimo 노트북(reactive Jupyter)을 사용합니다. 모델은 uint8 로 양자화되어 CDN을 통해 제공됩니다. 예측기당 전체 번들 크기는 최대 약 2 MB입니다.

타입‑안전 테마

각 테마는 강력히 타입이 지정된 색상 열거형과 레이어 구성을 내보냅니다:

import type { ReactAvatarItem } from '@avatune/types';
import { createTheme, fromHead } from '@avatune/theme-builder';

const theme = createTheme()
  .withStyle({ size: 500, borderRadius: '100%' })
  .addColors('hair', [HairColors.Black, HairColors.Brown, HairColors.Blond])
  .addColors('skin', [SkinTones.Light, SkinTones.Medium, SkinTones.Dark])
  .connectColors('head', ['ears', 'nose']) // ears + nose inherit head's skin color
  .setOptional('glasses')
  .mapPrediction('hairColor', 'brown', [HairColors.Brown, HairColors.Auburn])
  .toFramework()
  .build();

TypeScript는 각 테마에 대해 어떤 색상과 아이템이 유효한지 정확히 알기 때문에 런타임에서의 놀라움이 없습니다.

SVG → 컴포넌트를 위한 맞춤 Rsbuild 플러그인

500개 이상의 SVG 파일을 여러 프레임워크에서 다룰 때 ID와 마스크 충돌이 문제가 됩니다. 두 개의 Rsbuild 플러그인이 이를 해결합니다:

이들은 SVG 파일을 적절한 프레임워크 컴포넌트로 변환하며:

  • SVGO를 통한 자동 접두사 ID 적용(충돌 방지)
  • 반응형 스케일링을 위한 viewBox 보존
  • 유연성을 위한 쿼리 기반 임포트
import Icon from './icon.svg?svelte';
import Icon from './icon.svg?vue';

스택

  • Turborepo – 캐시가 포함된 모노레포 오케스트레이션
  • Bun – 패키지 매니저(≈2배 빠른 설치)
  • Rspack / Rslib – 빌드 도구(≈10배 빠른 webpack 대비)
  • Biome – Lint + 포맷(ESLint + Prettier 대체)
  • uv – Python 패키지 매니저(10–100배 빠른 pip 대비)

이 모노레포에는 10개의 테마, 5개의 프레임워크 렌더러(React, Vue, Svelte, Vanilla, React Native), 그리고 5개의 ML 예측기가 포함되어 있습니다.

사용해 보기

  • 웹사이트 + 문서:
  • GitHub:
  • 플레이그라운드:
npm install @avatune/react @avatune/pacovqzz-theme

ML 모델은 실험 단계이므로 정확도와 성능에 대한 피드백을 환영합니다. 더 나은 속성 예측기 학습에 관심이 있다면 PR을 통해 기여해 주세요.

Back to Blog

관련 글

더 보기 »