-- Migration: 008_person_identity_binding.sql -- Purpose: 建立聲紋 (Speaker ID)、人臉 (Face ID) 與真實身份 (Identity) 的綁定系統 -- Date: 2026-04-10 -- 1. 擴展 chunks 表,增加聲音與面孔的觀測值陣列 ALTER TABLE chunks ADD COLUMN IF NOT EXISTS speaker_ids TEXT[] DEFAULT '{}', -- e.g. ['speaker_3', 'speaker_5'] ADD COLUMN IF NOT EXISTS face_ids TEXT[] DEFAULT '{}'; -- e.g. ['face_1'] -- 2. 建立真實身份表 (Talents / Persons) -- 存儲現實世界中的人員資訊 (演員、配音員、真實人物) CREATE TABLE IF NOT EXISTS talents ( id BIGSERIAL PRIMARY KEY, real_name TEXT NOT NULL, -- 真實姓名 (e.g. "Tom Cruise") actor_name TEXT, -- 藝名/別名 voice_embedding VECTOR(192), -- 聲紋參考向量 (ECAPA-TDNN) face_embedding VECTOR(512), -- 人臉參考向量 (ArcFace) metadata JSONB DEFAULT '{}', -- 其他屬性 (性別、年齡等) created_at TIMESTAMPTZ DEFAULT NOW(), UNIQUE(real_name) ); -- 建立向量索引 CREATE INDEX IF NOT EXISTS idx_talent_voice ON talents USING hnsw (voice_embedding vector_cosine_ops); CREATE INDEX IF NOT EXISTS idx_talent_face ON talents USING hnsw (face_embedding vector_cosine_ops); -- 3. 建立身份綁定映射表 (Identity Bindings) -- 負責將機器生成的 ID (face_x, speaker_y) 映射到 talent_id CREATE TABLE IF NOT EXISTS identity_bindings ( id BIGSERIAL PRIMARY KEY, talent_id BIGINT REFERENCES talents(id) ON DELETE CASCADE, -- 綁定類型與機器 ID binding_type VARCHAR(32) NOT NULL, -- 'face' 或 'speaker' binding_value VARCHAR(64) NOT NULL, -- e.g. "face_1", "speaker_3" -- 綁定來源與狀態 source TEXT DEFAULT 'auto', -- 'auto' (自動聚類) 或 'manual' (人工綁定) confidence FLOAT DEFAULT 0.0, is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMPTZ DEFAULT NOW(), -- 每個機器 ID 只能綁定一個 Talent UNIQUE(binding_type, binding_value) ); -- 索引優化:加速由機器 ID 查找 Talent CREATE INDEX IF NOT EXISTS idx_bindings_lookup ON identity_bindings(binding_type, binding_value); CREATE INDEX IF NOT EXISTS idx_bindings_talent ON identity_bindings(talent_id); -- 4. (選填) 建立角色表 (Characters) - 用於動畫/多語系場景 CREATE TABLE IF NOT EXISTS characters ( id BIGSERIAL PRIMARY KEY, video_uuid TEXT NOT NULL, name TEXT NOT NULL, -- 角色名 (e.g. "Batman") language_track TEXT DEFAULT 'original', -- 語言軌道 (original, dub_zh_tw) is_voice_only BOOLEAN DEFAULT FALSE, -- 是否為無臉角色 (旁白/AI) metadata JSONB DEFAULT '{}', UNIQUE(video_uuid, name, language_track) ); -- 5. (選填) 建立飾演關係表 (Castings) -- 定義 Talent 在特定視頻中飾演哪個 Character CREATE TABLE IF NOT EXISTS castings ( id BIGSERIAL PRIMARY KEY, character_id BIGINT REFERENCES characters(id) ON DELETE CASCADE, talent_id BIGINT REFERENCES talents(id) ON DELETE CASCADE, track_type VARCHAR(32) DEFAULT 'original', -- 對應音軌版本 role_type VARCHAR(32) DEFAULT 'both', -- 'voice', 'face', 'both' UNIQUE(character_id, talent_id, track_type) ); COMMENT ON TABLE talents IS '真實人物/演員/配音員資訊庫'; COMMENT ON TABLE identity_bindings IS '機器 ID (Face/Speaker) 與真實 Talent 的映射關係'; COMMENT ON TABLE characters IS '視頻中的劇中角色'; COMMENT ON TABLE castings is 'Talent 與 Character 的飾演關係';