Files
meeting-assistant/MeetingAssistant/Speakers/WavSpeakerSnippetExtractor.cs
T

50 lines
1.6 KiB
C#

using MeetingAssistant.Transcription;
using NAudio.Wave;
namespace MeetingAssistant.Speakers;
public sealed class WavSpeakerSnippetExtractor : ISpeakerSnippetExtractor
{
public Task<byte[]> ExtractSnippetAsync(
string audioPath,
IReadOnlyList<TranscriptionSegment> speakerSegments,
CancellationToken cancellationToken)
{
if (speakerSegments.Count == 0 || !File.Exists(audioPath))
{
return Task.FromResult<byte[]>([]);
}
var start = speakerSegments.Min(segment => segment.Start);
var end = speakerSegments.Max(segment => segment.End);
if (end <= start)
{
return Task.FromResult<byte[]>([]);
}
using var reader = new WaveFileReader(audioPath);
using var output = new MemoryStream();
using (var writer = new WaveFileWriter(output, reader.WaveFormat))
{
reader.CurrentTime = start;
var bytesRemaining = reader.WaveFormat.AverageBytesPerSecond * (end - start).TotalSeconds;
var buffer = new byte[reader.WaveFormat.AverageBytesPerSecond];
while (bytesRemaining > 0)
{
cancellationToken.ThrowIfCancellationRequested();
var bytesToRead = (int)Math.Min(buffer.Length, bytesRemaining);
var bytesRead = reader.Read(buffer, 0, bytesToRead);
if (bytesRead == 0)
{
break;
}
writer.Write(buffer, 0, bytesRead);
bytesRemaining -= bytesRead;
}
}
return Task.FromResult(output.ToArray());
}
}