using MeetingAssistant.Recording; using MeetingAssistant.Transcription; namespace MeetingAssistant.Tests; public sealed class AzureSpeechRecognitionPipelineTests { [Fact] public async Task FinishedTranscriptUsesLiveDiarizedAzureSegments() { await using var pipeline = new AzureSpeechRecognitionPipeline( new StaticTranscriptionProvider( [ new TranscriptionSegment(TimeSpan.Zero, TimeSpan.FromSeconds(1), "Guest-1", "hello"), new TranscriptionSegment(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), "Guest-2", "there") ])); await pipeline.InitializeAsync(CancellationToken.None); await pipeline.WriteAsync(new AudioChunk([1, 0], 16000, 1), CancellationToken.None); await pipeline.CompleteAsync(CancellationToken.None); var liveSegments = new List(); await foreach (var segment in pipeline.ReadLiveTranscriptAsync(CancellationToken.None)) { liveSegments.Add(segment); } var finishedSegments = await pipeline.ReadFinishedTranscriptAsync( "ignored.wav", new SpeechRecognitionPipelineOptions(5), CancellationToken.None); Assert.Equal(liveSegments, finishedSegments); Assert.Collection( finishedSegments, first => Assert.Equal("Guest-1", first.Speaker), second => Assert.Equal("Guest-2", second.Speaker)); } private sealed class StaticTranscriptionProvider : IStreamingTranscriptionProvider { private readonly IReadOnlyList segments; public StaticTranscriptionProvider(IReadOnlyList segments) { this.segments = segments; } public async IAsyncEnumerable TranscribeAsync( IAsyncEnumerable audio, SpeechRecognitionPipelineOptions options, [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken) { await foreach (var _ in audio.WithCancellation(cancellationToken)) { } foreach (var segment in segments) { yield return segment; } } } }