Add resilient Azure offline transcription backlog
PR and Push Build/Test / build-and-test (push) Successful in 18m41s

This commit is contained in:
2026-06-15 17:26:34 +02:00
parent b22754ce5d
commit b774ccc375
35 changed files with 2456 additions and 198 deletions
@@ -7,13 +7,16 @@ public sealed class TemporaryRecordedAudioStore : IRecordedAudioStore
{
private readonly MeetingAssistantOptions options;
private readonly ILogger<TemporaryRecordedAudioStore> logger;
private readonly IOfflineTranscriptionBacklog offlineTranscriptionBacklog;
public TemporaryRecordedAudioStore(
IOptions<MeetingAssistantOptions> options,
ILogger<TemporaryRecordedAudioStore> logger)
ILogger<TemporaryRecordedAudioStore> logger,
IOfflineTranscriptionBacklog? offlineTranscriptionBacklog = null)
{
this.options = options.Value;
this.logger = logger;
this.offlineTranscriptionBacklog = offlineTranscriptionBacklog ?? NoopOfflineTranscriptionBacklog.Instance;
}
public Task<IRecordedAudioSink> CreateSessionAsync(CancellationToken cancellationToken)
@@ -35,21 +38,28 @@ public sealed class TemporaryRecordedAudioStore : IRecordedAudioStore
return Task.FromResult<IRecordedAudioSink>(new TemporaryRecordedAudioSink(path, format, logger));
}
public Task DeleteStaleRecordingsAsync(CancellationToken cancellationToken)
public async Task DeleteStaleRecordingsAsync(CancellationToken cancellationToken)
{
var folder = GetTemporaryRecordingsFolder(options);
if (!Directory.Exists(folder))
{
return Task.CompletedTask;
return;
}
var queuedAudioPaths = (await offlineTranscriptionBacklog.ListAsync(cancellationToken))
.Select(item => item.AudioPath)
.ToHashSet(StringComparer.OrdinalIgnoreCase);
foreach (var path in Directory.EnumerateFiles(folder, "*.wav", SearchOption.TopDirectoryOnly))
{
cancellationToken.ThrowIfCancellationRequested();
if (queuedAudioPaths.Contains(path))
{
logger.LogInformation("Keeping queued offline transcription recording file {RecordingPath}", path);
continue;
}
DeleteFile(path);
}
return Task.CompletedTask;
}
private static string GetTemporaryRecordingsFolder(MeetingAssistantOptions options)