Chuttamalle 댄스 AI: 단일 인물 사진을 활용한 생성형 세로 클립에 대한 Stripe 크레딧
요약
이 글은 단일 인물 사진을 활용하여 생성형 세로 댄스 클립(9:16)을 제작하는 팬 스타일 도구의 상업적 구현 과정을 다룹니다. 특히, 서비스가 Stripe 크레딧 시스템을 중심으로 결제 모델을 구축하고 있음을 강조하며, 사용자에게 신뢰감을 주는 비즈니스 흐름에 초점을 맞추고 있습니다.
핵심 포인트
- 단일 성인 인물 사진을 활용하여 15초 분량의 세로(9:16) 생성형 클립 제작이 가능합니다.
- 서비스는 Stripe 크레딧 루프를 통해 상업적 결제 모델을 구축했습니다.
- 성공적인 사용자 경험을 위해 생성 실패 시 크레딧 복원 로직 구현이 중요합니다.
Seedance가 실패했다고 말할 때 환불되는 Stripe 크레딧을 사용하여 Cloudflare Workers에서 승인된 인물 사진 기반의 세로 생성 댄스 제품을 출시한 방법.
trychuttamalle.app은 Chuttamalle/Devara 노래 댄스 편집 트렌드를 중심으로 한 팬 스타일 도구입니다: 승인된 성인 인물 사진을 업로드하면 ~15초 분량의 9:16 생성형 댄스 MP4(720p 경로)를 얻을 수 있습니다. 비공식적이며 영화나 스튜디오와는 관련이 없습니다. AI가 라벨링한 결과입니다; 원본/AI 또는 라이선스 음원만 사용 가능합니다; NSFW 콘텐츠는 불가합니다.
이 글은 단일 사진으로 댄스 제품을 만들 때 신뢰감을 느끼게 하는 Stripe 크레딧 루프에 초점을 맞춥니다. 가격과 모델 ID는 변경될 수 있으니, 라이브 사이트/콘솔을 진실의 원천(source of truth)으로 간주하십시오.

사용자가 구매하는 것 (실시간 검증)
작성 시점의 홈페이지 출시 가격:
- 단일 $8.88 — 클립 경로 1개.
- 듀오 $16.99 — 팬 런칭 문구에 따른 클립 메시지 3개.
- 크레딧을 사용하기 전에 로컬에서 미리 보기 프레이밍 (UI가 제공하는 경우).
생성 실패 시 크레딧이 복원되어야 합니다 — 이 문장은 ToS PDF에 숨겨져 있기보다 가격 옆에 위치해야 합니다. 게스트 Stripe 결제는 “세로 클립 하나만 원한다”는 경로를 유지합니다.

왜 한 인물 사진인가 (두 개가 아닌)
이 분야는 좌/우 좌석이 있는 전용 페이스 스왑 부스가 아니라, 단일의 선명한 얼굴/신체 레퍼런스를 사용한 생성형 댄스 편집입니다. UX 문구는 다음과 같이 강조합니다: 빛은 은은하게, 얼굴은 카메라를 향하고, 승인된 성인만 가능해야 합니다. 이는 역할 혼란과 지원 부하를 줄여줍니다.
제품은 자신이 무엇이 아닌지에 대해서도 솔직합니다: 거대한 템플릿 라이브러리가 아니며, 공식 스튜디오 앱도 아닙니다. 진실성이 기능 과잉(feature inflation)보다 더 나은 전환율을 가져옵니다.
크레딧 장부 설계 (Credit ledger design)
다음 세 가지 영역으로 생각하십시오:
- Stripe Checkout Session (게스트 허용): 웹훅(webhook)을 통해 사이트 크레딧이 지급됩니다.
- '생성(Create)' 버튼을 누를 때 크레딧을 선 차감(Pre-debit)하거나 잠급니다(lock).
- TryAllAPI에서 발생하는 상위(Upstream) 지출: Seedance (귀하의 미국 달러 원가 상품비용, USD COGS).
(1)과 (3)을 하나의 정신적 스프레드시트에서 결코 합치지 마십시오. 저가 책정(Underpricing)은 보통 재시도(retries) + 환불(refunds) + Stripe 수수료를 무시하는 데서 발생합니다.
portrait → generative dance template
→ if credits low → Stripe 결제 유도
→ lock credits → create task
...

스택 개요 (Stack overview)
| Layer | Choice | Role |
|---|---|---|
| Front / SSR | TanStack Start (Vite) | 랜딩 페이지, 업로드 패널, 생성 상태 표시 |
| ... |
비디오 API 애그리게이터(aggregator)가 필요한 이유
등록/충전 후 운영 체크리스트:
- 콘솔에서 **사용 가능한 미국 달러 잔액(available USD balance)**을 확인합니다 (체크아웃 성공 페이지뿐만 아니라).
- 종량제(pay-as-you-go) 방식 청구로 토큰을 생성합니다.
- 해당 토큰에 **비디오/Seedance 관련 채널 그룹(channel group)**을 활성화합니다. 잘못된 그룹은 모델 ID가 올바르게 보여도 “사용 가능한 채널 없음” 오류를 발생시킵니다.
- 제품별로 별도의 키(key)를 사용하는 것이 좋습니다 (
chuttamalle-prod대 sandbox). - 키는 워커스 시크릿(Workers Secrets)에만 넣습니다 (예:
TRYALLAPI_API_KEY). 프론트엔드 번들이나 블로그 게시물에는 절대 넣지 마십시오.
개념적으로 호출 형태는 다음과 같습니다 (필드 이름은 애그리게이터의 v3 contents API를 따르며, 항상 최신 문서를 재확인하십시오):
POST /api/v3/contents/generations/tasks
Authorization: Bearer <TRYALLAPI_API_KEY>
Content-Type: application/json
...
워커(Worker)에서 Accept-Encoding: identity를 전송하는 이유는 일부 게이트웨이가 투명한 압축 해제 과정에서 오작동하기 때문입니다. 프로덕션 환경에서 사용되는 Model ID는 Seedance 2.x 계열 문자열처럼 보이지만, 이 단락이 아닌 콘솔 ID를 신뢰의 출처로 간주하십시오.
원포트레이트 댄스용 Seedance 매개변수(parameters)
이 사이트군 전체에서 제가 발견한 몇 가지 세부 사항들입니다:
duration을 명시적인 정수형으로 전달하세요. 일부 모델은 기본적으로 “스마트 길이”를 사용합니다.duration을 생략하면 클립과 비용 모두가 조용히 길어질 수 있습니다.resolution(해상도) 및ratio(비율). 비용은 인물 사진 대 풍경 사진의 비율보다는 해상도 등급과 지속 시간에 더 민감하게 반응합니다. 생성 UI에서 제공하는 것(종종 Shorts를 위한 480p/720p 및 9:16)을 일치시키세요.generate_audio(오디오 생성). 제품이 “완료된” 다운로드를 전송할 때는 오디오를 활성화 상태로 두고, 트렌디한 사운드를 원하는 크리에이터가 나중에 음소거(mute)할 수 있도록 하십시오.- 상태 머신(Status machine).
queued→running→succeeded(성공) /failed(실패)와 같은 흐름을 예상하십시오. 성공 URL은 종종 **수명이 짧은 서명된 링크(short-lived signed links)**이므로, 사용자에게 파일을 전달하기 전에 자체적으로 다운로드하거나 재호스팅해야 합니다. - 적절한 실패 처리(Decent failure).
supply_unavailable또는 심각한 오류가 발생하면: 크레딧을 환불하고, 짧은 안내 메시지를 표시하며, 상세한 상위(upstream) 오류를 서버 측에 기록하고, 선택적으로 다른 Seedance 등급으로 폴백(fallback)하는 것을 고려하십시오.
상위 비용에 대한 대략적인 정신 모델 (예시일 뿐이며 — 자체 usage 필드 및 인보이스를 사용하세요):
tokens ≈ duration_sec × width × height × fps / 1024
cost ≈ tokens × price_per_million_tokens
사이트 가격은 실패율이 0%라는 스프레드시트의 환상에 의존하여 책정하는 것이 아니라, 재시도 마진(retry margin), Stripe 수수료, 그리고 작업 실패로 인한 환불까지 측정한 몇 번의 실제 실행을 거친 후에 책정해야 합니다.
참고 사항: 잠금된 댄스 템플릿은 안정적으로 유지하고; Shorts용으로는 9:16 비율을 사용하며; 서명된 URL은 재호스팅하고; 안전성 거부(safety refusal) 시에는 환불과 짧은 메시지를 제공하십시오.
크레딧, Stripe, 그리고 “돈을 받을 수 있는” 경계선
데모 UI는 만들기 쉽습니다. 장난감과 제품 사이의 경계는 다음과 같습니다:
- 사용자가 '생성'을 누름 → 크레딧 잔액 확인.
- 부족할 경우 → Stripe Checkout Session (게스트 허용).
- 웹훅(Webhook) (반환 URL 동기화 확인 포함)이 크레딧을 부여함.
- 사전 차감/크레딧 잠금, 상위 작업(upstream task) 생성, D1에
task_id영속화. - 완료될 때까지 폴링(Poll)합니다; 성공 시 → MP4 표시; 실패 시 → 크레딧 환불.
두 개의 계정 장부는 분리되어야 합니다: TryAllAPI의 USD 잔액(비용) 대 사이트 크레딧(판매한 금액). 이 둘을 하나의 정신적 원장(mental ledger)에 섞는 것이 낮은 가격 책정이나 '미스터리' 손실을 발생시키는 방법입니다.
여러 제품이 하나의 Stripe 계정을 공유할 때, 엔드포인트별 또는 메타데이터(site / product)별로 웹훅을 격리해야 합니다. 잘못된 최고 도메인(apex domain)으로 지정된 콜백은 전형적인 다중 사이트 실수입니다.
비밀 정보는 Workers에 보관되어야 합니다: TRYALLAPI_API_KEY, STRIPE_SECRET_KEY, 웹훅 비밀, 인증 비밀. 브라우저는 필요할 때만 게시 가능한 Stripe 키를 볼 수 있습니다.
배포 참고 사항 (Workers + D1)
이 템플릿군에서 일반적인 루프:
pnpm install
# wrangler에 D1 데이터베이스_ID, 프로덕션 환경, 사용자 지정 도메인 연결
pnpm cf:deploy
'완료(done)'라고 배포를 부르기 전에 확인해야 할 사항:
- D1 바인딩이 올바른지 확인; 공유 DB는 마이크로 아이디어마다 새 데이터베이스를 사용하기보다 **테이블 접두사(table prefixes)**를 사용합니다 (무료 등급 DB 개수는 제한적입니다).
AUTH_TRUSTED_ORIGINS와 Stripe 반환/웹훅 URL이 프로덕션 HTTPS 오리진과 일치하는지 확인.- 광범위한 퍼널(funnel)을 위해 GA ID가 설정되어야 합니다 (랜딩 → 업로드 → 결제 → 대기 → 다운로드).
- 프로덕션 또는 스테이징 Workers에 실제 종단 간(end-to-end) 경로가 하나 있어야 합니다: 업로드 → 결제 → 렌더링 → 다운로드.
프로덕션 오리진: https://trychuttamalle.app (대체 호스트 이름이 존재할 수 있으므로, 체크아웃 반환 URL을 일치시키세요).
선택 사항이 아닌 제품 규칙
얼굴 기반 생성은 '단순한 다른 SaaS CRUD 앱'이 아닙니다:
- 업로드 시 명시적인 만 18세 이상/사용 권한(rights-to-use) 확인을 요구해야 합니다.
- 미성년자를 차단하고, 정책 및 문구에서 유명인/타인의 오용을 거부해야 합니다.
- 상위(upstream) 안전성 거부를 예상하고, 환불 처리와 설명을 제공해야 합니다.
- 개인정보 보호정책에서 보존(retention)에 대해 정직하게 명시하고, 기본적으로 사용자 미디어를 학습시키지 않아야 합니다.
- 공식 제휴가 없는 한, 트렌드 형식의 독립적인 팬 스타일 도구로 마케팅해야 합니다.
- 마케팅에 자체 샘플 렌더링 결과물을 사용하세요.
이러한 제약 사항들은 제품 내부에 포함되어야 하며, 첫 분쟁 이메일 이후에 추가하는 각주가 아닙니다.
다음 원포트레이트 댄스 사이트에 재사용할 것들
- 가격 옆에 크레딧 환불(credit refund) 문구를 배치하세요.
- 가능한 경우, 차감 전에 프레이밍 미리보기를 제공하세요.
- 게스트 싱글 패키지(Guest Single pack) (~$8.88)는 충동 구매형 수직 콘텐츠에 적합합니다.
- 애그리게이터(Aggregator)가 워커(Worker)를 간결하게 유지하도록 합니다.
- 출시 가격을 확정하기 전에 실제 720p 원가(COGS)를 측정하세요.
크리에이터: 권한이 있는 사진으로 trychuttamalle.app를 사용해 보세요. 빌더: create/poll을 위해 TryAllAPI를 사용한 다음, 자동 환불 기능과 함께 Stripe 크레딧을 묶으세요. 실제 720p COGS를 측정한 후에 패키지 가격을 책정하고 — 실패가 지루하게 만드세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기