using MeetingAssistant.Recording; namespace MeetingAssistant.Transcription; public interface ISpeechRecognitionPipeline : IAsyncDisposable { Task InitializeAsync(CancellationToken cancellationToken); Task InitializeAsync( SpeechRecognitionPipelineOptions options, CancellationToken cancellationToken); Task WaitUntilReadyAsync(CancellationToken cancellationToken); ValueTask WriteAsync(AudioChunk chunk, CancellationToken cancellationToken); Task CompleteAsync(CancellationToken cancellationToken); IAsyncEnumerable ReadLiveTranscriptAsync(CancellationToken cancellationToken); Task> ReadFinishedTranscriptAsync( string audioPath, SpeechRecognitionPipelineOptions options, CancellationToken cancellationToken); } public interface ISpeechRecognitionPipelineFactory { ISpeechRecognitionPipeline Create(); ISpeechRecognitionPipeline Create(string? launchProfileName) { return Create(); } } public sealed record SpeechRecognitionPipelineOptions( int? NumSpeakers = null, IReadOnlyList? DictationWords = null) { public static SpeechRecognitionPipelineOptions Default { get; } = new(); }