using System; using System.IO; using System.Linq; using Whisper.net; using System.Threading; using xAiModels.Models; using System.Threading.Tasks; using xAiApi.Interfaces.Extractors; using DocumentFormat.OpenXml.EMMA; namespace xAiApi.Providers.Extractors { /// /// Extracts text content from Audio files ... /// public class XAudioFileContentExtractor : IXAudioFileContentExtractor { /// /// Supported MIME Types ... /// private static readonly string[] SupportedMimeTypes = [ "audio/mpeg", "audio/mp3", "audio/wav", "audio/wave", "audio/ogg", "audio/m4a", "audio/mp4", "audio/webm" ]; private readonly string language; private readonly string whisperModelPath; public XAudioFileContentExtractor() : this( language: "fa", whisperModelPath: "Models/ggml-base.bin" ) { } public XAudioFileContentExtractor( string whisperModelPath = "Models/ggml-base.bin", string language = "fa" ) { // this.language = language; this.whisperModelPath = whisperModelPath; } /// /// Check if this extractor supports the specified MIME type ... /// public bool CanExtract(string mimeType) { // return SupportedMimeTypes.Contains( mimeType?.ToLowerInvariant() ?? string.Empty ); } /// /// Extract text content from file stream ... /// public async Task ExtractAsync( Stream fileStream, string mimeType, CancellationToken cancellationToken = default ) { // var result = await ExtractRichAsync( fileStream, "audio", mimeType, cancellationToken ); // return result.AudioTranscript; } /// /// Extract content from stream as Rich Result ... /// /// /// /// /// /// public async Task ExtractRichAsync( Stream fileStream, string fileName, string mimeType, CancellationToken cancellationToken = default ) { // var result = new XFileExtractionResult { FileName = fileName, MimeType = mimeType }; // try { // using var memoryStream = new MemoryStream(); await fileStream.CopyToAsync(memoryStream, cancellationToken); memoryStream.Position = 0; // using var wavStream = await ConvertToWavAsync( memoryStream, cancellationToken ); // using var factory = WhisperFactory.FromPath(whisperModelPath); using var processor = factory.CreateBuilder() .WithLanguage(language) .Build(); // var segments = new System.Text.StringBuilder(); await foreach (var segment in processor.ProcessAsync(wavStream, cancellationToken)) { segments.Append(segment.Text); } // result.AudioTranscript = segments.ToString().Trim(); result.Text = result.AudioTranscript; } catch (Exception ex) { result.ErrorMessage = $"Audio extraction failed: {ex.Message}"; } // return result; } /// /// Audio Format Converting ... /// private async Task ConvertToWavAsync( Stream inputStream, CancellationToken cancellationToken ) { // // TODO: Complete this ... return await Task.FromResult(inputStream); } } }