Convert-it/Areas/AudioTools/Controllers/SpeechToTextController.cs
Ricardo Carneiro 665d36d81c
All checks were successful
Deploy ASP.NET MVC to OCI / build-and-deploy (push) Successful in 17m22s
feat: ajuste ads
2026-01-26 08:06:48 -03:00

95 lines
3.5 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Convert_It_Online.Services;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Localization;
using System.IO;
namespace Convert_It_Online.Areas.AudioTools.Controllers
{
[Area("AudioTools")]
[Route("{culture}/[area]/[controller]")]
[Route("[area]/[controller]")]
public class SpeechToTextController : Controller
{
private readonly IAudioTranscriptionService _transcriptionService;
private readonly ILogger<SpeechToTextController> _logger;
private readonly IStringLocalizer<SharedResource> _localizer;
public SpeechToTextController(IAudioTranscriptionService transcriptionService,
ILogger<SpeechToTextController> logger,
IStringLocalizer<SharedResource> localizer)
{
_transcriptionService = transcriptionService;
_logger = logger;
_localizer = localizer;
}
private void SetViewBag()
{
ViewBag.HomeLink = _localizer["HomeLink"];
ViewBag.TextMenuTitle = _localizer["TextMenuTitle"];
ViewBag.DocumentMenuTitle = _localizer["DocumentMenuTitle"];
ViewBag.ImageMenuTitle = _localizer["ImageMenuTitle"];
ViewBag.CaseConverterTitle = _localizer["CaseConverterTitle"];
ViewBag.PdfToTextTitle = _localizer["PdfToTextTitle"];
ViewBag.PdfBarcodeTitle = _localizer["PdfBarcodeTitle"];
ViewBag.JpgToWebpTitle = _localizer["JpgToWebpTitle"];
ViewBag.HeicToJpgTitle = _localizer["HeicToJpgTitle"];
ViewBag.FooterText = _localizer["FooterText"];
ViewBag.About = _localizer["About"];
ViewBag.Contact = _localizer["Contact"];
ViewBag.Terms = _localizer["Terms"];
}
[HttpGet]
public IActionResult Index()
{
SetViewBag();
return View();
}
[HttpPost]
public async Task<IActionResult> Transcribe(IFormFile audioFile)
{
SetViewBag();
if (audioFile == null || audioFile.Length == 0)
{
ViewBag.Error = "Por favor, selecione um arquivo de áudio.";
return View("Index");
}
var culture = HttpContext.Features.Get<IRequestCultureFeature>()?.RequestCulture.UICulture.Name ?? "pt-BR";
var tempPath = Path.GetTempFileName();
try
{
using (var stream = new FileStream(tempPath, FileMode.Create))
{
await audioFile.CopyToAsync(stream);
}
var transcription = await _transcriptionService.TranscribeAsync(tempPath, culture);
ViewBag.Result = transcription;
}
catch (Exception ex)
{
_logger.LogError(ex, "Erro no controller ao transcrever.");
ViewBag.Error = "Erro ao processar o áudio. Verifique se o formato é suportado.";
}
finally
{
if (System.IO.File.Exists(tempPath)) System.IO.File.Delete(tempPath);
}
return View("Index");
}
[HttpPost("HandleShare")]
public async Task<IActionResult> HandleShare(IFormFile audio)
{
// O Android via Share Target costuma enviar como 'audio' ou 'file'
return await Transcribe(audio);
}
}
}