Archive summary refinements and profile switching
PR and Push Build/Test / build-and-test (push) Successful in 6m37s

This commit is contained in:
2026-05-27 23:11:21 +02:00
parent c12febe029
commit 7777b349a5
37 changed files with 3190 additions and 121 deletions
@@ -220,6 +220,74 @@ public sealed class SpeakerIdentityServiceTests
Assert.Equal(0, fixture.SnippetExtractor.ExtractCalls);
}
[Fact]
public async Task SpeakerOverrideAttachesCurrentSampleToExistingNamedIdentity()
{
await using var fixture = await SpeakerIdentityFixture.CreateAsync();
var sabrina = await fixture.AddIdentityAsync([], [1, 2, 3], "Sabrina", referenceCount: 1);
var service = fixture.CreateService();
var segment = new TranscriptionSegment(TimeSpan.Zero, TimeSpan.FromSeconds(5), "Guest-01", "hello from Sabrina");
var request = fixture.CreateRequest(
["Sabrina"],
[segment],
[new SpeakerAudioSample("Guest-01", segment, [9, 9, 9], 95)]);
await service.ApplySpeakerOverrideAsync(request, "Guest-01", "Sabrina", CancellationToken.None);
await service.ProcessFinishedTranscriptAsync(
fixture.CreateRequest(
["Sabrina"],
[segment with { Speaker = "Sabrina" }],
knownSpeakerMappings: new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
["Guest-01"] = "Sabrina"
}),
CancellationToken.None);
var saved = await fixture.LoadIdentityAsync(sabrina.Id);
Assert.Equal("Sabrina", saved.CanonicalName);
Assert.Equal(2, saved.References.Count);
Assert.Contains(saved.Snippets, snippet => snippet.WavBytes.SequenceEqual(new byte[] { 9, 9, 9 }));
var allIdentities = await fixture.Context.SpeakerIdentities.ToListAsync();
Assert.Single(allIdentities);
}
[Fact]
public async Task SpeakerOverrideCreatesNamedIdentityWhenNoAcceptedNameExists()
{
await using var fixture = await SpeakerIdentityFixture.CreateAsync();
var service = fixture.CreateService();
var segment = new TranscriptionSegment(TimeSpan.Zero, TimeSpan.FromSeconds(5), "Guest-01", "hello from Sabrina");
var request = fixture.CreateRequest(
["Sabrina"],
[segment],
[new SpeakerAudioSample("Guest-01", segment, [8, 8, 8], 95)]);
await service.ApplySpeakerOverrideAsync(request, "Guest-01", "Sabrina", CancellationToken.None);
var saved = await fixture.Context.SpeakerIdentities
.Include(identity => identity.References)
.Include(identity => identity.Snippets)
.SingleAsync();
Assert.Equal("Sabrina", saved.CanonicalName);
Assert.Single(saved.References);
Assert.Contains(saved.Snippets, snippet => snippet.WavBytes.SequenceEqual(new byte[] { 8, 8, 8 }));
}
[Fact]
public async Task SpeakerIdentityDeletionRemovesAcceptedNameFromDatabase()
{
await using var fixture = await SpeakerIdentityFixture.CreateAsync();
var sabrina = await fixture.AddIdentityAsync([], [1, 2, 3], "Sabrina", referenceCount: 1, aliases: ["Sabi"]);
await fixture.AddIdentityAsync([], [4, 5, 6], "Manuel", referenceCount: 1);
var service = fixture.CreateService();
await service.DeleteSpeakerIdentityAsync("Sabi", CancellationToken.None);
var identities = await fixture.Context.SpeakerIdentities.ToListAsync();
Assert.DoesNotContain(identities, identity => identity.Id == sabrina.Id);
Assert.Contains(identities, identity => identity.CanonicalName == "Manuel");
}
[Fact]
public async Task LiveKnownSpeakerIdentificationDoesNotMutateIdentityDatabase()
{