import { useState, useEffect } from "react"; import { ChatHeader } from "@/components/ChatHeader"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Input } from "@/components/ui/input"; import { Mic, Play, Download, Trash2, Search } from "lucide-react"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { useToast } from "@/hooks/use-toast"; import { audioGenerationService, VOICE_OPTIONS, VoiceType } from "@/services/audioGeneration"; interface GeneratedAudio { id: string; text: string; voice: string; voiceLabel: string; audioUrl: string; timestamp: Date; } export const GenerationView = () => { const [textToSpeech, setTextToSpeech] = useState(""); const [isProcessing, setIsProcessing] = useState(false); const [selectedVoice, setSelectedVoice] = useState("alloy"); const [generatedAudio, setGeneratedAudio] = useState(null); const [audioHistory, setAudioHistory] = useState([]); const [audioSearchQuery, setAudioSearchQuery] = useState(""); const { toast } = useToast(); useEffect(() => { const savedAudios = localStorage.getItem('audioHistory'); if (savedAudios) { setAudioHistory(JSON.parse(savedAudios)); } }, []); const handleGenerateAudio = async () => { // Valida o texto antes de enviar const validation = audioGenerationService.validateText(textToSpeech); if (!validation.valid) { toast({ title: "Texto inválido", description: validation.error, variant: "destructive", }); return; } setIsProcessing(true); try { // Chama o serviço de geração de áudio const response = await audioGenerationService.generateAudio({ message: textToSpeech, voice: selectedVoice, }); // Verifica se a geração foi bem-sucedida if (response.success) { console.log('URL do áudio gerado:', response.audio_url); const audio: GeneratedAudio = { id: response.audio_generation_id, text: response.message, voice: selectedVoice, voiceLabel: VOICE_OPTIONS[selectedVoice].label, audioUrl: response.audio_url, timestamp: new Date(), }; setGeneratedAudio(audio); const newHistory = [audio, ...audioHistory].slice(0, 10); setAudioHistory(newHistory); localStorage.setItem('audioHistory', JSON.stringify(newHistory)); toast({ title: "Áudio gerado com sucesso", description: `Voz: ${VOICE_OPTIONS[selectedVoice].label}`, }); // Limpa o campo de texto após sucesso setTextToSpeech(""); } else { throw new Error('Erro ao gerar áudio'); } } catch (error: any) { console.error('Erro na geração de áudio:', error); toast({ title: "Erro na geração", description: error.message || "Não foi possível gerar o áudio. Tente novamente.", variant: "destructive", }); } finally { setIsProcessing(false); } }; const handleDownloadAudio = (audio: GeneratedAudio) => { const a = document.createElement('a'); a.href = audio.audioUrl; a.download = `audio_${audio.voiceLabel}_${new Date(audio.timestamp).getTime()}.mp3`; document.body.appendChild(a); a.click(); document.body.removeChild(a); toast({ title: "Download iniciado", description: "O arquivo de áudio está sendo baixado.", }); }; const handleDeleteAudio = (audioId: string) => { if (generatedAudio?.id === audioId) { setGeneratedAudio(null); } const newHistory = audioHistory.filter(a => a.id !== audioId); setAudioHistory(newHistory); localStorage.setItem('audioHistory', JSON.stringify(newHistory)); toast({ title: "Áudio removido", description: "O áudio foi removido do histórico.", }); }; const filteredAudios = audioHistory.filter(item => item.voiceLabel.toLowerCase().includes(audioSearchQuery.toLowerCase()) || item.text.toLowerCase().includes(audioSearchQuery.toLowerCase()) ); return (
Geração Histórico

Converter Texto em Voz