using Microsoft.AspNetCore.Mvc; using Convert_It_Online.Services; namespace Convert_It_Online.Controllers { [ApiController] [Route("api/tts")] public class TtsApiController : ControllerBase { private readonly ITextToSpeechService _ttsService; private readonly ILogger _logger; public TtsApiController(ITextToSpeechService ttsService, ILogger logger) { _ttsService = ttsService; _logger = logger; } [HttpPost("generate")] public async Task Generate([FromBody] TtsRequest request) { if (string.IsNullOrWhiteSpace(request.Text)) { return BadRequest("Texto é obrigatório."); } // Limitar tamanho do texto para evitar abusos if (request.Text.Length > 5000) { return BadRequest("Texto muito longo. Máximo de 5000 caracteres."); } try { _logger.LogInformation("Gerando áudio TTS: {Length} caracteres, idioma: {Lang}, gênero: {Gender}", request.Text.Length, request.Language, request.Gender); var audioBytes = await _ttsService.GenerateAudioAsync( request.Text, request.Language ?? "pt-br", request.Rate ?? 1.0f, request.Gender ?? "f" ); // Retornar como JSON com base64 var base64Audio = Convert.ToBase64String(audioBytes); return Ok(new TtsResponse { Audio = base64Audio, Format = "ogg", Size = audioBytes.Length }); } catch (InvalidOperationException ex) { _logger.LogWarning(ex, "TTS não disponível"); return StatusCode(503, "Serviço de síntese de voz não disponível no momento."); } catch (Exception ex) { _logger.LogError(ex, "Erro ao gerar áudio TTS"); return StatusCode(500, "Erro ao gerar áudio."); } } } public class TtsRequest { public string Text { get; set; } = string.Empty; public string? Language { get; set; } public float? Rate { get; set; } public string? Gender { get; set; } } public class TtsResponse { public string Audio { get; set; } = string.Empty; public string Format { get; set; } = "ogg"; public int Size { get; set; } } }