Convert-it/Controllers/TtsApiController.cs
Ricardo Carneiro 00804702e0
All checks were successful
Deploy ASP.NET MVC to OCI / build-and-deploy (push) Successful in 17m26s
fix: vozes
2026-01-26 13:10:01 -03:00

82 lines
2.6 KiB
C#

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<TtsApiController> _logger;
public TtsApiController(ITextToSpeechService ttsService, ILogger<TtsApiController> logger)
{
_ttsService = ttsService;
_logger = logger;
}
[HttpPost("generate")]
public async Task<IActionResult> 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; }
}
}