From 93d62fc627bfd763ab4ef5757dd1fdfc3f6b3945 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 19:35:38 +0000 Subject: [PATCH] feat: Add audio transcription --- src/components/audio/AudioView.tsx | 211 +++++++++++++++++++++++------ 1 file changed, 173 insertions(+), 38 deletions(-) diff --git a/src/components/audio/AudioView.tsx b/src/components/audio/AudioView.tsx index 4a4ba2c..0df3f3e 100644 --- a/src/components/audio/AudioView.tsx +++ b/src/components/audio/AudioView.tsx @@ -2,7 +2,7 @@ import { useState } from "react"; import { ChatHeader } from "@/components/ChatHeader"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; -import { Upload, Mic, Play, Download, Copy, Trash2 } from "lucide-react"; +import { Upload, Mic, Play, Download, Trash2, FileAudio } from "lucide-react"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { @@ -12,16 +12,111 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import { useToast } from "@/hooks/use-toast"; + +const SUPPORTED_FORMATS = ['flac', 'm4a', 'mp3', 'mp4', 'mpeg', 'mpga', 'oga', 'ogg', 'wav', 'webm']; +const MAX_FILE_SIZE = 25 * 1024 * 1024; // 25 MB + +interface TranscriptionResult { + id: string; + fileName: string; + text: string; + timestamp: Date; +} export const AudioView = () => { const [textToSpeech, setTextToSpeech] = useState(""); const [isProcessing, setIsProcessing] = useState(false); + const [isTranscribing, setIsTranscribing] = useState(false); + const [transcriptionResult, setTranscriptionResult] = useState(null); + const [selectedFile, setSelectedFile] = useState(null); + const { toast } = useToast(); const handleGenerateAudio = () => { setIsProcessing(true); setTimeout(() => setIsProcessing(false), 2000); }; + const handleFileSelect = (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (!file) return; + + // Validate file size + if (file.size > MAX_FILE_SIZE) { + toast({ + title: "Arquivo muito grande", + description: "O arquivo deve ter no máximo 25 MB", + variant: "destructive", + }); + return; + } + + // Validate file format + const fileExtension = file.name.split('.').pop()?.toLowerCase(); + if (!fileExtension || !SUPPORTED_FORMATS.includes(fileExtension)) { + toast({ + title: "Formato não suportado", + description: `Formatos suportados: ${SUPPORTED_FORMATS.join(', ')}`, + variant: "destructive", + }); + return; + } + + setSelectedFile(file); + handleTranscription(file); + }; + + const handleTranscription = async (file: File) => { + setIsTranscribing(true); + + // Simulate transcription - replace with actual API call + setTimeout(() => { + const result: TranscriptionResult = { + id: Date.now().toString(), + fileName: file.name, + text: "Esta é uma transcrição de exemplo do áudio enviado. O sistema utilizará modelos de IA avançados para converter sua fala em texto com alta precisão. O áudio foi processado com sucesso e convertido para texto.", + timestamp: new Date(), + }; + + setTranscriptionResult(result); + setIsTranscribing(false); + + toast({ + title: "Transcrição concluída", + description: "Seu áudio foi transcrito com sucesso!", + }); + }, 2000); + }; + + const handleDeleteTranscription = () => { + setTranscriptionResult(null); + setSelectedFile(null); + }; + + const handleCopyTranscription = () => { + if (transcriptionResult) { + navigator.clipboard.writeText(transcriptionResult.text); + toast({ + title: "Texto copiado", + description: "A transcrição foi copiada para a área de transferência", + }); + } + }; + + const handleDownloadTranscription = () => { + if (transcriptionResult) { + const blob = new Blob([transcriptionResult.text], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `transcricao_${transcriptionResult.fileName}.txt`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + } + }; + return (
@@ -43,58 +138,98 @@ export const AudioView = () => { Converter Áudio em Texto

- Envie um arquivo de áudio (.mp3, .wav) para transcrição + Envie um arquivo de áudio para transcrição (máx. 25MB) +

+

+ Formatos: {SUPPORTED_FORMATS.join(', ')}

-
+ `.${f}`).join(',')} + onChange={handleFileSelect} + /> + +
+ {!selectedFile && ( + + )} + + + {isTranscribing && ( +
+
+

+ Transcrevendo áudio... +

+
+ )}
- {/* Sample Transcription Result */} -
-
-
-

audio_sample.mp3

-

- Transcrito há 5 minutos + {/* Transcription Result */} + {transcriptionResult && ( +

+
+
+

{transcriptionResult.fileName}

+

+ Transcrito {new Date(transcriptionResult.timestamp).toLocaleTimeString('pt-BR')} +

+
+
+ + +
+
+
+

+ {transcriptionResult.text}

-
- - - -
-
-

- Esta é uma transcrição de exemplo do áudio enviado. O - sistema utilizará modelos de IA avançados para converter - sua fala em texto com alta precisão. -

-
-
+ )} {/* Generation Tab */}