-- Phase 1 (laugh register): 관리자가 등록한 대표 웃음 wav 템플릿. -- -- 사용 흐름: -- 1. admin 화면에서 대표 여성 웃음 wav 업로드 (e.g. "푸하하 short", "깔깔 medium") -- 2. 사용자가 음성 등록 시 (apply_dual 직후), 모든 active 템플릿에 대해 -- stylevoice-vc 로 source=template, target=user_ref VC 실행 -- 3. 결과 wav 를 user 별 캐싱 경로에 저장 → 채팅 chunker 가 웃음 토큰 -- 감지 시 캐싱된 변환 wav 재생 (TTS skip) -- -- 파일은 'voice-clones' 버킷의 'admin/laugh/{uuid}.wav' 경로에 저장. -- service_role 만 접근 (admin endpoint 통해서만 수정). CREATE TABLE IF NOT EXISTS public.admin_laugh_templates ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, storage_path TEXT NOT NULL UNIQUE, duration_sec REAL, length_class TEXT NOT NULL DEFAULT 'medium' CHECK (length_class IN ('short', 'medium', 'long')), is_active BOOLEAN NOT NULL DEFAULT TRUE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS admin_laugh_templates_active_idx ON public.admin_laugh_templates (is_active, length_class) WHERE is_active = TRUE; ALTER TABLE public.admin_laugh_templates ENABLE ROW LEVEL SECURITY; -- 정책 없음: service_role 만 접근. COMMENT ON TABLE public.admin_laugh_templates IS 'Phase 1 (laugh register): admin 이 등록하는 대표 웃음 템플릿. user 음성 등록 시 VC 변환의 source 로 사용.'; COMMENT ON COLUMN public.admin_laugh_templates.length_class IS '텍스트 길이 매칭용: short (~1.5s, "푸하"), medium (~2-3s, "푸하하하"), long (~4-5s, "으하하하하 너무 웃겨")';