-- B-1: user_voices.register 컬럼 추가 (2026-04-27) -- -- 한 사용자가 같은 화자(display_name)로 두 개의 register 를 등록할 수 있게 한다. -- - casual: 자유 모드 대화용 (친근/일상 톤) -- - formal: Voice Moments 콘텐츠 낭독용 (차분/낭독 톤) -- -- 배경: ICL TTS 는 reference audio 의 prosody 분포에서 멀어진 텍스트를 -- 만나면 음색을 희생하고 prior 로 미끄러진다 (사용자 보고: "고요하고 아늑한 밤이 -- 당신을 감싸줄 거예요" → reference latent 밖 → 다른 목소리). LLM 프롬프트만으로는 -- 어휘 분포까지 잡기 어려워, 같은 화자에 대해 register 별 reference 를 분리. -- -- 라우팅: -- - 자유 모드 호출 → register='casual' voice 우선 -- - Voice Moment 콘텐츠 호출 → register='formal' 우선, 없으면 casual fallback ALTER TABLE public.user_voices ADD COLUMN IF NOT EXISTS register VARCHAR(16) NOT NULL DEFAULT 'casual' CHECK (register IN ('casual', 'formal')); -- 기존 row 는 모두 DEFAULT 'casual' 로 분류 (회귀 0). -- 사용자가 음성 설정에서 "차분한 톤 추가 등록" 으로 formal row 를 추가 가능. -- (user_id, display_name, register) 유니크 인덱스 — -- 같은 화자의 같은 register 중복 등록 방지. -- display_name 이 비어있는 옛 row 는 제약 대상 외 (partial index). CREATE UNIQUE INDEX IF NOT EXISTS user_voices_user_display_register_uniq ON public.user_voices (user_id, display_name, register) WHERE display_name IS NOT NULL AND display_name != ''; COMMENT ON COLUMN public.user_voices.register IS 'Voice register: casual (자유 모드 대화용) | formal (Voice Moments 콘텐츠용). 같은 display_name 으로 두 register 등록 가능.';