private static List<Segment> AssignSpeakers(List<DiarizationModel> diarization, List<Segment> segments)
{
string previousSpeaker = null;
foreach (var segment in segments)
{
string assignedSpeaker = null;
double bestScore = 0.0;
foreach (var entry in diarization)
{
double overlapStart = Math.Max(segment.StartTime, entry.Start);
double overlapEnd = Math.Min(segment.EndTime, entry.End);
double overlap = Math.Max(0, overlapEnd - overlapStart);
if (overlap <= 0)
continue;
double score = overlap;
double entryDuration = entry.End - entry.Start;
double ratio = overlap / entryDuration;
score += ratio;
if (Math.Abs(segment.StartTime - entry.Start) < 1.0)
score += 0.5;
if (Math.Abs(segment.EndTime - entry.End) < 1.0)
score += 0.5;
if (score > bestScore)
{
bestScore = score;
assignedSpeaker = entry.Speaker;
}
}
if (assignedSpeaker == null)
{
double closestDistance = double.MaxValue;
foreach (var entry in diarization)
{
double distance = Math.Min(Math.Abs(segment.StartTime - entry.End), Math.Abs(segment.EndTime - entry.Start));
if (distance < closestDistance)
{
closestDistance = distance;
assignedSpeaker = entry.Speaker;
}
}
}
segment.Speaker = assignedSpeaker;
previousSpeaker = assignedSpeaker;
}
return segments;
}