Public Access
Make meeting lifecycle stateful
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
using MeetingAssistant.LaunchProfiles;
|
||||
using MeetingAssistant.Recording;
|
||||
using MeetingAssistant.Transcription;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
@@ -24,11 +27,101 @@ public sealed class ConfiguredSpeechRecognitionPipelineFactoryTests
|
||||
services.AddTransient<AzureSpeechStreamingTranscriptionProvider>();
|
||||
var provider = services.BuildServiceProvider();
|
||||
var factory = new ConfiguredSpeechRecognitionPipelineFactory(
|
||||
provider,
|
||||
[new AzureSpeechRecognitionPipelineBuilder(provider)],
|
||||
provider.GetRequiredService<IOptions<MeetingAssistantOptions>>());
|
||||
|
||||
await using var pipeline = factory.Create();
|
||||
|
||||
Assert.IsType<AzureSpeechRecognitionPipeline>(pipeline);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task FactoryPassesResolvedLaunchProfileOptionsToSelectedBuilder()
|
||||
{
|
||||
var services = new ServiceCollection().BuildServiceProvider();
|
||||
var builder = new CapturingPipelineBuilder();
|
||||
var launchProfiles = new ConfigurationLaunchProfileOptionsProvider(
|
||||
new ConfigurationBuilder()
|
||||
.AddInMemoryCollection(new Dictionary<string, string?>
|
||||
{
|
||||
["MeetingAssistant:Recording:TranscriptionProvider"] = "capturing",
|
||||
["MeetingAssistant:Agent:Model"] = "default-model",
|
||||
["MeetingAssistant:LaunchProfiles:english:Hotkey:Toggle"] = "Ctrl+Alt+E",
|
||||
["MeetingAssistant:LaunchProfiles:english:Recording:TranscriptionProvider"] = "capturing",
|
||||
["MeetingAssistant:LaunchProfiles:english:Agent:Model"] = "english-model"
|
||||
})
|
||||
.Build());
|
||||
var factory = new ConfiguredSpeechRecognitionPipelineFactory(
|
||||
[builder],
|
||||
Options.Create(launchProfiles.GetRequiredProfile(null).Options),
|
||||
launchProfiles);
|
||||
|
||||
await using var pipeline = factory.Create("english");
|
||||
|
||||
Assert.IsType<CapturingPipeline>(pipeline);
|
||||
Assert.Equal("english-model", builder.Options?.Agent.Model);
|
||||
}
|
||||
|
||||
private sealed class CapturingPipelineBuilder : ISpeechRecognitionPipelineBuilder
|
||||
{
|
||||
public string ProviderName => "capturing";
|
||||
|
||||
public MeetingAssistantOptions? Options { get; private set; }
|
||||
|
||||
public ISpeechRecognitionPipeline Create(MeetingAssistantOptions options)
|
||||
{
|
||||
Options = options;
|
||||
return new CapturingPipeline();
|
||||
}
|
||||
}
|
||||
|
||||
private sealed class CapturingPipeline : ISpeechRecognitionPipeline
|
||||
{
|
||||
public Task InitializeAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task InitializeAsync(
|
||||
SpeechRecognitionPipelineOptions options,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task WaitUntilReadyAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public ValueTask WriteAsync(AudioChunk chunk, CancellationToken cancellationToken)
|
||||
{
|
||||
return ValueTask.CompletedTask;
|
||||
}
|
||||
|
||||
public Task CompleteAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public async IAsyncEnumerable<TranscriptionSegment> ReadLiveTranscriptAsync(
|
||||
[System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
yield break;
|
||||
}
|
||||
|
||||
public Task<IReadOnlyList<TranscriptionSegment>> ReadFinishedTranscriptAsync(
|
||||
string audioPath,
|
||||
SpeechRecognitionPipelineOptions options,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.FromResult<IReadOnlyList<TranscriptionSegment>>([]);
|
||||
}
|
||||
|
||||
public ValueTask DisposeAsync()
|
||||
{
|
||||
return ValueTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user