fakeshield-api / fakeshield /src /pages /VideoLab /AudioVisualSync.tsx
Akash4911's picture
Production Deploy: Improved robustness and logging
66b6851
import React from 'react';
interface AudioVisualSyncProps {
lipTimeline: number[];
audioSpeaking: number[];
}
const AudioVisualSync: React.FC<AudioVisualSyncProps> = ({ lipTimeline, audioSpeaking }) => {
return (
<div className="space-y-4 pt-4 border-t border-white/5">
<h4 className="text-[10px] font-black uppercase tracking-widest opacity-40">Audio-Visual Sync Audit</h4>
<div className="grid grid-cols-1 gap-2">
{/* Audio Speaking Track */}
<div className="flex items-center gap-2">
<span className="text-[10px] w-12 opacity-50 uppercase font-bold shrink-0">Audio</span>
<div className="flex-1 h-3 flex gap-0.5">
{audioSpeaking.slice(0, 40).map((v, i) => (
<div
key={i}
className={`flex-1 rounded-sm ${v > 0.5 ? 'bg-green-500/60 shadow-[0_0_8px_rgba(34,197,94,0.3)]' : 'bg-white/5'}`}
/>
))}
</div>
</div>
{/* Lip Movement Track */}
<div className="flex items-center gap-2">
<span className="text-[10px] w-12 opacity-50 uppercase font-bold shrink-0">Lips</span>
<div className="flex-1 h-3 flex gap-0.5">
{lipTimeline.slice(0, 40).map((v, i) => (
<div
key={i}
className={`flex-1 rounded-sm ${v > 0.02 ? 'bg-blue-500/60 shadow-[0_0_8px_rgba(59,130,246,0.3)]' : 'bg-white/5'}`}
/>
))}
</div>
</div>
{/* Sync Status */}
<div className="flex items-center gap-2">
<span className="text-[10px] w-12 opacity-50 uppercase font-bold shrink-0">Sync</span>
<div className="flex-1 h-3 flex gap-0.5">
{audioSpeaking.slice(0, 40).map((v, i) => {
const isSpeaking = v > 0.5;
const isMoving = lipTimeline[i] > 0.02;
const mismatched = isSpeaking !== isMoving;
return (
<div
key={i}
className={`flex-1 rounded-sm ${mismatched ? 'bg-red-500/60 shadow-[0_0_8px_rgba(239,68,68,0.3)]' : 'bg-white/5 opacity-20'}`}
/>
);
})}
</div>
</div>
</div>
<p className="text-[9px] opacity-40 leading-relaxed italic">
*Red indicators highlight asynchronous phoneme-to-viseme mapping often found in first-generation lip-sync deepfakes.
</p>
</div>
);
};
export default AudioVisualSync;