using System.Net.Http.Headers; using System.Text; using System.Text.Json; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using SaasMediaWorker.Configuration; using SaasMediaWorker.Models; namespace SaasMediaWorker.Services; /// /// OpenAI TTS API Client — Metin → Ses dönüşümü. /// public class OpenAiTtsService { private readonly HttpClient _httpClient; private readonly ILogger _logger; private readonly ApiSettings _settings; public OpenAiTtsService( HttpClient httpClient, ILogger logger, IOptions settings) { _httpClient = httpClient; _logger = logger; _settings = settings.Value; _httpClient.BaseAddress = new Uri("https://api.openai.com/v1/"); _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _settings.OpenAiApiKey); _httpClient.Timeout = TimeSpan.FromMinutes(2); } /// /// Bir sahnenin narration metnini sese çevirir ve dosyaya kaydeder. /// public async Task GenerateNarrationAsync( ScenePayload scene, string outputDirectory, string voiceStyle, CancellationToken ct) { _logger.LogInformation( "🎙️ OpenAI TTS üretimi — Sahne {Order}: \"{Text}\"", scene.Order, scene.NarrationText[..Math.Min(60, scene.NarrationText.Length)]); // Varsayılan voiceStyle kullan veya fallback var voiceId = string.IsNullOrWhiteSpace(voiceStyle) ? _settings.OpenAiTtsVoiceId : voiceStyle; var requestBody = new { model = "tts-1", input = scene.NarrationText, voice = voiceId, response_format = "mp3" }; var content = new StringContent( JsonSerializer.Serialize(requestBody), Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync("audio/speech", content, ct); response.EnsureSuccessStatusCode(); // Ses dosyasını kaydet var outputPath = Path.Combine(outputDirectory, $"scene_{scene.Order:D2}_narration.mp3"); await using var fileStream = File.Create(outputPath); await response.Content.CopyToAsync(fileStream, ct); var fileInfo = new FileInfo(outputPath); _logger.LogInformation( "OpenAI TTS tamamlandı — Sahne {Order}: {Size} bytes", scene.Order, fileInfo.Length); return new GeneratedMediaFile { SceneId = scene.Id, SceneOrder = scene.Order, Type = MediaFileType.AudioNarration, LocalPath = outputPath, FileSizeBytes = fileInfo.Length, DurationSeconds = scene.Duration, MimeType = "audio/mpeg", AiProvider = "openai" }; } }