Кадр 11: Радужный макро-взгляд (Prismatic Macro Eye) Prompt: Extreme macro close-up of a young woman's eye looking directly at the camera. A sharp, narrow rainbow light spectrum from a prism projector cuts vertically across her pupil and cheek. 100% facial feature retention of Aisha Dosma, dark wavy hair, brown eyes. Hyper-realistic skin texture with visible pores and slight moisture. Sharp focus on eyelashes and iris. High-contrast lighting (chiaroscuro), deep shadows. Film grain, 85mm f/1.4 lens aesthetics. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 12: Макро-диалог с тенью (Macro Shadow Dialogue) Prompt: Extreme close-up profile of the lower face (nose, lips, chin) of a woman with 100% likeness to Aisha Dosma. Strong side lighting from a projector creating a dramatic chiaroscuro effect. On the concrete wall behind her, a large, sharp shadow of her profile is projected, overlapping with abstract light patterns. Wet lip gloss texture, satin skin finish. Dark cinematic atmosphere, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 13: Призматический макро-взгляд (Prismatic Macro Gaze) Prompt: Extreme macro shot of one eye of Aisha Dosma. Prismatic refraction creates a vibrant, detailed rainbow spectrum across the iris and eyelashes. Reflective catchlight from the projector in the pupil. Hyper-realistic wet skin texture with micro-droplets of makeup. Perfect 1:1 similarity of eye shape and eyebrow. Moody, dark background, intense cinematic lighting. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 14: Влажный блеск и проекция на губах (Macro Luminescent Lips) Prompt: Extreme macro close-up of the lips and chin of Aisha Dosma. The lips are covered in heavy, ultra-glossy clear lip gloss resembling liquid glass. Small, brilliant light specks and glints from a projector reflect on the glossy surface. An abstract geometric light pattern is projected onto the surrounding matte skin. Extreme detail, visible skin relief. Cinematic noir lighting, grainy film texture. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 15: Текстура волос и преломленная проекция (Macro Hair Bun) Prompt: Medium close-up of the back of the head and neck of Aisha Dosma. A messy high bun with curly strands. A projector shines through a prism directly onto the hair, creating a complex, kaleidoscopic rainbow refraction pattern on the hair texture and the concrete wall behind. Sharp focus on individual hair strands and light catchers in the curls. Dark, mysterious atmosphere. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 16: Сдвиг фокуса и проекция на коже (Patterned Reflection) Prompt: Medium shot of Aisha Dosma from behind, looking over her shoulder. Shallow depth of field. The focus is sharp on a concrete wall where a large, clear projection of her own face is displayed. Aisha herself is in the foreground, blurred (deep bokeh). On her blurred back and shoulder, an abstract light pattern from the projector is visible. Dark dress, cinematic lighting, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 17: Макро-взгляд (The Prismatic Double Gaze) Prompt: Extreme macro close-up of both eyes of Aisha Dosma, looking straight into the lens. 100% facial similarity. A complex prismatic light pattern scatters multiple spectral spots and rainbow flares across her forehead, eyes, and bridge of the nose. Sharp focus on the moist texture of the eyes and long eyelashes. Dark, moody background, intense cinematic chiaroscuro. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA".
A front view 3d macro detailed illustration gaming WITH realistic colour logo with chrome, metal gold, steal, silver WHICH LOOKS REAL with front face texture photorealistic style with colour with a shooter, featuring the BIG AND BOLD text of SAM.D.COSTA and clear text of GAMING in bold letters. SIMILAR TO CALL OF DUTY THEME AND WAR BACKGROUND
Image Type: Photorealistic Setting: A modern gym or dojo with clean, polished floors and minimal background distractions, conveying a professional and focused training environment. Main Subjects: A Brazilian Jiu-Jitsu athlete in a custom-designed gi. The athlete is in motion, executing a technique on the mat, showing off the vibrant and unique design of the gi. The design should be intricate and personalized, with bold colors. Text Placement & Style: Place the text "Customize Your Gear" in bold, clear white or bright color at the bottom or top of the thumbnail. Make sure the text stands out against the background with high contrast for readability. Overall Mood: Motivational and focused, emphasizing the performance-enhancing effect of personalized gear.
vintage patriotic t-shirt design, centered layout, Puerto Rican flag in the middle with blue triangle and white star on the left and red and white horizontal stripes, distressed vintage texture, bold retro typography, top text "MY GIRLFRIEND IS" in Bebas Neue style condensed font, large center text "PUERTO RICAN" in heavy Anton style bold font, bottom text "NOTHING SCARES ME" in Oswald bold style font, clean centered composition, patriotic humor design, slightly grunge worn effect, screen print vector style, high contrast, professional t-shirt graphic, transparent background, no mockup, no model
Main "World's Best Prompt Master" ke roop mein, maine Instagram, Facebook aur Websites par top performing diesel engine aur generator posts ka deep analysis kiya hai. Analysis of Top Performers (The Generator Wale Niche): Color Psychology: Top brands (jaise Cummins, Caterpillar, Sudhir Power) hamesha Safety Yellow, Black, aur White use karte hain. Ye colors "Caution," "Power," aur "Trust" signify karte hain. Imagery: "Action shots" (mechanic repairing) aur "Product Hero shots" (chamakta hua generator) sabse zyada convert hote hain. Text Strategy: Text hamesha BOLD aur Clean hota hai. Curly fonts ya fancy likhai is industry mein "weak" maani jaati hai. Aapko Editable Post chahiye. Isliye main aapko 2 alag-alag prompts de raha hoon. Pehla prompt Design/Layout ke liye (Canva Search Bar ke liye), aur doosra High-Quality Background Image ke liye (Canva Magic Media ke liye). 🟢 OPTION 1: The "All-in-One" Template Prompt (Is prompt ko Canva ke Home Page Search Bar mein copy-paste karein. Magic Media mein nahi.) "Create a professional Instagram Post Template for a Diesel Engine Sales & Service brand. Theme: Industrial, Heavy-Duty, and Trustworthy. Color Palette: Use High-Contrast Safety Yellow (#FFD700), Dark Charcoal (#1A1A1A), and White. Layout: Split screen or clean overlay. Visuals: Include a placeholder for a heavy diesel generator or a technician in safety gear. Text Structure: Create distinct, editable text boxes for a bold Headline ('POWER WHEN YOU NEED IT'), a Sub-headline ('Sales | Service | AMC'), and a CTA Button ('Call Now'). Font Style: Use strong, sans-serif fonts like 'Anton' or 'Roboto Condensed' to convey strength. Ensure the text is not flattened into the image.
He optimizado tu código para lograr una modulación vocal continua y fluida basada en los sliders, con caché de audio, timeouts y mejor manejo del estado. Ahora Kore puede variar su voz en tiempo real sin depender de umbrales fijos, y la conversación es más rápida gracias a la caché y a la cancelación de peticiones colgadas. ```javascript import React, { useState, useRef, useEffect, useCallback } from 'react'; import { Play, Square, Mic, MicOff, Settings2, Activity, Loader2, X, GripHorizontal, LayoutGrid, Zap, AlertCircle } from 'lucide-react'; // --- CONSTANTES --- const SILENT_WAV = "data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"; const TTS_TIMEOUT = 5000; // 5 segundos máximo para la síntesis const DEFAULT_API_KEY = 'AIzaSyBlkvy_Op-XlzSMSDDl9ip42dMFZX28MAA'; // ⚠️ Cámbiala por tu propia clave // --- UTILIDADES --- const base64ToWavBlob = (base64Data, sampleRate = 24000) => { const binaryString = window.atob(base64Data); const pcmData = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) pcmData[i] = binaryString.charCodeAt(i); const numChannels = 1; const bitsPerSample = 16; const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmData.length; const buffer = new ArrayBuffer(44 + dataSize); const view = new DataView(buffer); const writeString = (view, offset, string) => { for (let i = 0; i < string.length; i++) view.setUint8(offset + i, string.charCodeAt(i)); }; writeString(view, 0, 'RIFF'); view.setUint32(4, 36 + dataSize, true); writeString(view, 8, 'WAVE'); writeString(view, 12, 'fmt '); view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, numChannels, true); view.setUint32(24, sampleRate, true); view.setUint32(28, byteRate, true); view.setUint16(32, blockAlign, true); view.setUint16(34, bitsPerSample, true); writeString(view, 36, 'data'); view.setUint32(40, dataSize, true); for (let i = 0; i < dataSize; i++) view.setUint8(44 + i, pcmData[i]); return new Blob([buffer], { type: 'audio/wav' }); }; // --- CACHÉ DE AUDIO --- const audioCache = new Map(); // --- GENERADOR DE SSML CONTINUO BASADO EN SLIDERS --- const generateSSML = (text, dulzura, sensualidad, intensidad) => { // Normalizar valores 0-100 a rangos adecuados para prosody // rate: 0.5 a 2.0 (1.0 es normal) const rate = 0.8 + (intensidad / 100) * 1.2; // 0.8 (lento) a 2.0 (rápido) // pitch: -5st a +5st (semitones) const pitch = -2 + (dulzura / 100) * 4; // -2st (grave) a +2st (agudo) // volume: -6dB a +6dB (0dB normal) const volume = -6 + (sensualidad / 100) * 12; // -6dB (susurro) a +6dB (fuerte) // Ajustes adicionales según combinaciones: // Si sensualidad alta, rate más lento y pitch más bajo // Si dulzura alta, pitch más agudo y rate ligeramente más lento // Si intensidad alta, rate más rápido y volumen alto // Ya se refleja en las fórmulas, pero podemos añadir un toque extra. const ssml = `<speak> <prosody rate="${rate.toFixed(2)}" pitch="${pitch.toFixed(0)}st" volume="${volume.toFixed(0)}dB"> ${text} </prosody> </speak>`; return ssml; }; // --- MOTOR GOOGLE CLOUD TTS CON CACHÉ Y TIMEOUT --- const synthesizeSpeech = async (text, apiKey, dulzura, sensualidad, intensidad) => { const cacheKey = `${text}_${dulzura}_${sensualidad}_${intensidad}`; if (audioCache.has(cacheKey)) { console.log('🎯 Usando audio cacheado'); return audioCache.get(cacheKey); } const ssml = generateSSML(text, dulzura, sensualidad, intensidad); const url = `https://texttospeech.googleapis.com/v1/text:synthesize?key=${apiKey}`; const body = { input: { ssml }, voice: { languageCode: 'es-ES', name: 'es-ES-Neural2-F', ssmlGender: 'FEMALE' }, audioConfig: { audioEncoding: 'LINEAR16', sampleRateHertz: 24000 } }; const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), TTS_TIMEOUT); try { const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal: controller.signal }); clearTimeout(timeoutId); if (!res.ok) throw new Error(`TTS error: ${res.status}`); const data = await res.json(); audioCache.set(cacheKey, data.audioContent); return data.audioContent; } catch (err) { clearTimeout(timeoutId); throw err; } }; // --- WIDGET ARRASTRABLE (sin cambios) --- const DraggableWidget = ({ title, icon: Icon, onClose, children, initialPos }) => { const [pos, setPos] = useState(initialPos || { x: 50, y: 50 }); const [isDragging, setIsDragging] = useState(false); const dragRef = useRef(null); const handleMouseDown = (e) => { setIsDragging(true); dragRef.current = { startX: e.clientX, startY: e.clientY, initialX: pos.x, initialY: pos.y }; }; const handleMouseMove = (e) => { if (!isDragging) return; setPos({ x: Math.max(0, dragRef.current.initialX + (e.clientX - dragRef.current.startX)), y: Math.max(0, dragRef.current.initialY + (e.clientY - dragRef.current.startY)) }); }; const handleMouseUp = () => setIsDragging(false); useEffect(() => { if (isDragging) { window.addEventListener('mousemove', handleMouseMove); window.addEventListener('mouseup', handleMouseUp); } return () => { window.removeEventListener('mousemove', handleMouseMove); window.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging]); return ( <div style={{ left: `${pos.x}px`, top: `${pos.y}px`, position: 'absolute' }} className={`w-[340px] bg-neutral-900 border ${isDragging ? 'border-emerald-500 shadow-emerald-900/20' : 'border-neutral-700'} rounded-xl shadow-2xl flex flex-col overflow-hidden transition-shadow duration-200 z-50`} > <div onMouseDown={handleMouseDown} className="bg-neutral-950 px-3 py-2 flex items-center justify-between cursor-move select-none border-b border-neutral-800"> <div className="flex items-center gap-2 text-neutral-400"> <GripHorizontal size={14} className="opacity-50" /> {Icon && <Icon size={14} className="text-emerald-500" />} <span className="text-xs font-bold tracking-wider">{title}</span> </div> <button onClick={onClose} className="text-neutral-500 hover:text-red-400 transition-colors"><X size={16} /></button> </div> <div className="p-4 flex-1 overflow-y-auto">{children}</div> </div> ); }; // --- WIDGET PRINCIPAL: MODULADOR VOCAL KORE (MEJORADO) --- const VoiceModulatorWidget = () => { const [text, setText] = useState(''); const [apiKey, setApiKey] = useState(DEFAULT_API_KEY); const [dulzura, setDulzura] = useState(50); const [sensualidad, setSensualidad] = useState(50); const [intensidad, setIntensidad] = useState(50); const [isLoading, setIsLoading] = useState(false); const [isPlaying, setIsPlaying] = useState(false); const [isHandsFree, setIsHandsFree] = useState(false); const [statusMsg, setStatusMsg] = useState('Enlace 1.5 Flash + GCP TTS Establecido.'); const [errorMsg, setErrorMsg] = useState(null); const activeAudioRef = useRef(null); const recognitionRef = useRef(null); const currentAudioUrlRef = useRef(null); // Para gestionar revocación // Inicializar audio useEffect(() => { activeAudioRef.current = new Audio(); activeAudioRef.current.preload = "auto"; return () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } } if (recognitionRef.current) recognitionRef.current.stop(); }; }, []); // Configurar reconocimiento de voz useEffect(() => { if (!('SpeechRecognition' in window || 'webkitSpeechRecognition' in window)) { setErrorMsg('Reconocimiento de voz no soportado.'); return; } const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; recognitionRef.current = new SpeechRecognition(); recognitionRef.current.lang = 'es-ES'; recognitionRef.current.interimResults = false; recognitionRef.current.continuous = false; recognitionRef.current.onresult = async (event) => { const transcript = event.results[0][0].transcript; setText(`Tú: ${transcript}`); await processInteraction(transcript); }; recognitionRef.current.onerror = (event) => { if (event.error !== 'no-speech') { setErrorMsg(`Micrófono: ${event.error}`); setIsHandsFree(false); } }; recognitionRef.current.onend = () => { if (isHandsFree && !isPlaying && !isLoading) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; // Limpiar al desmontar return () => { if (recognitionRef.current) recognitionRef.current.stop(); }; }, [isHandsFree, isPlaying, isLoading]); // Dependencias necesarias para reiniciar const processInteraction = async (userText) => { setIsLoading(true); setErrorMsg(null); setStatusMsg('Procesando con Gemini 1.5 Flash...'); const key = apiKey.trim(); try { // 1. Llamada a Gemini con timeout const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 5000); const payloadText = { contents: [{ parts: [{ text: userText }] }], systemInstruction: { parts: [{ text: `Eres Kore, 28 años, Huesca. Labia, directa, sensual, disruptiva. Responde en español, máx 20 palabras. REGLA INNEGOCIABLE: CERO PREGUNTAS.` }] } }; const resText = await fetch( `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${key}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payloadText), signal: controller.signal } ); clearTimeout(timeoutId); if (!resText.ok) throw new Error(`Gemini error: ${resText.status}`); const dataText = await resText.json(); const aiText = dataText.candidates?.[0]?.content?.parts?.[0]?.text || "Mmm... vale."; setText(`Kore: ${aiText}`); // 2. Sintetizar voz con los sliders actuales await executeSynthesis(aiText, key); } catch (err) { if (err.name === 'AbortError') { setErrorMsg('Gemini timeout (5s)'); } else { setErrorMsg(err.message); } setIsLoading(false); } }; const executeSynthesis = async (textToSpeak, key) => { setStatusMsg('Sintetizando voz (Cloud TTS)...'); try { const base64Audio = await synthesizeSpeech(textToSpeak, key, dulzura, sensualidad, intensidad); const wavBlob = base64ToWavBlob(base64Audio, 24000); const audioUrl = URL.createObjectURL(wavBlob); // Revocar URL anterior si existe if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } currentAudioUrlRef.current = audioUrl; activeAudioRef.current.src = audioUrl; activeAudioRef.current.onended = () => { setIsPlaying(false); setStatusMsg('Transmisión completada.'); if (isHandsFree) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; setStatusMsg('Transmitiendo...'); setIsPlaying(true); setIsLoading(false); await activeAudioRef.current.play().catch(err => { throw new Error(`Autoplay bloqueado: ${err.message}`); }); } catch (error) { throw new Error(`Fallo TTS: ${error.message}`); } }; const handleManualPlay = async () => { if (!text.trim()) return setErrorMsg('Escribe algo primero.'); // Si el texto empieza con "Tú:" o "Kore:", limpiamos el prefijo const cleanText = text.replace(/^(Tú:|Kore:)\s*/, ''); if (!cleanText.trim()) return setErrorMsg('Texto vacío después de limpiar.'); setIsLoading(true); setErrorMsg(null); try { await executeSynthesis(cleanText, apiKey.trim()); } catch (err) { setErrorMsg(err.message); setIsLoading(false); } }; const toggleHandsFree = () => { if (!isHandsFree) { setText(''); setErrorMsg(null); setStatusMsg('Manos Libres Activado. Habla...'); // Desbloquear audio en algunos navegadores if (activeAudioRef.current) { activeAudioRef.current.src = SILENT_WAV; activeAudioRef.current.play().catch(() => {}); } try { recognitionRef.current.start(); } catch (e) {} } else { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Sistemas en pausa.'); if (recognitionRef.current) recognitionRef.current.stop(); } setIsHandsFree(!isHandsFree); }; const stopAudio = () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Señal interrumpida.'); }; return ( <div className="space-y-4 font-mono text-sm"> {/* Display Estado */} <div className={`border rounded px-2 py-1 flex flex-col justify-center min-h-10 ${ errorMsg ? 'bg-red-950/50 border-red-900' : isHandsFree ? 'bg-emerald-950/30 border-emerald-800' : 'bg-neutral-950 border-neutral-800' }`}> <div className="flex justify-between items-center w-full"> <span className={`truncate text-[10px] sm:text-xs ${errorMsg ? 'text-red-500' : 'text-emerald-500'}`}> > {errorMsg || statusMsg} </span> {isPlaying && !errorMsg && <Activity size={14} className="text-emerald-500 animate-pulse ml-2 flex-shrink-0" />} {isLoading && !errorMsg && <Zap size={14} className="text-amber-500 animate-pulse ml-2 flex-shrink-0" />} {isHandsFree && !isPlaying && !isLoading && !errorMsg && <Mic size={14} className="text-red-500 animate-pulse ml-2 flex-shrink-0" />} </div> </div> {/* Input Texto / Log */} <textarea value={text} onChange={(e) => setText(e.target.value)} className="w-full bg-neutral-950/50 border border-neutral-700 rounded p-2 text-xs text-neutral-300 focus:outline-none focus:border-emerald-500 resize-none h-20" placeholder={isHandsFree ? "Escuchando transcripción en tiempo real..." : "Escribe texto directo o activa Manos Libres..."} readOnly={isHandsFree || isLoading} /> {/* Sliders continuos (controlan SSML en tiempo real) */} <div className="space-y-3 bg-neutral-950/30 p-3 rounded border border-neutral-800"> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Agresiva</span><span className="text-emerald-400">Dulzura [{dulzura}]</span><span>Dulce</span> </div> <input type="range" min="0" max="100" value={dulzura} onChange={(e)=>setDulzura(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-emerald-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Robótica</span><span className="text-pink-400">Aura [{sensualidad}]</span><span>Sensual</span> </div> <input type="range" min="0" max="100" value={sensualidad} onChange={(e)=>setSensualidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-pink-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Atenuada</span><span className="text-amber-400">Intensidad [{intensidad}]</span><span>Fuerte</span> </div> <input type="range" min="0" max="100" value={intensidad} onChange={(e)=>setIntensidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-amber-500 cursor-pointer" /> </div> </div> {/* Botones de Control */} <div className="flex flex-col sm:flex-row gap-2"> <button onClick={toggleHandsFree} disabled={isLoading} className={`flex-1 py-2 rounded text-xs font-bold flex items-center justify-center gap-2 transition-colors border ${ isHandsFree ? 'bg-red-900/20 text-red-400 border-red-900/50 hover:bg-red-900/40 shadow-[0_0_10px_rgba(239,68,68,0.2)]' : 'bg-indigo-900/20 text-indigo-400 border-indigo-900/50 hover:bg-indigo-900/40' }`} > {isHandsFree ? <MicOff size={14} /> : <Mic size={14} />} {isHandsFree ? 'Detener Escucha' : 'Manos Libres'} </button> <div className="flex gap-2 flex-1"> <button onClick={handleManualPlay} disabled={isLoading || isPlaying || isHandsFree} className="flex-1 bg-emerald-600/20 hover:bg-emerald-600/40 text-emerald-400 border border-emerald-600/50 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center gap-1 transition-colors" > {isLoading ? <Loader2 size={14} className="animate-spin" /> : <Play size={14} />} Sintetizar </button> <button onClick={stopAudio} disabled={!isPlaying && !isHandsFree} className="px-4 bg-neutral-800 hover:bg-neutral-700 text-neutral-400 border border-neutral-700 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center transition-colors" > <Square size={14} /> </button> </div> </div> {/* Botón para limpiar caché (opcional) */} <div className="text-right"> <button onClick={() => audioCache.clear()} className="text-[8px] text-neutral-600 hover:text-neutral-400 underline" > limpiar caché de audio </button> </div> </div> ); }; // --- ENTORNO ESCRITORIO (sin cambios) --- export default function App() { const [widgets, setWidgets] = useState({ voice: { isOpen: true, pos: { x: window.innerWidth > 768 ? window.innerWidth / 2 - 170 : 20, y: 40 } } }); const toggleWidget = (id) => { setWidgets(prev => ({ ...prev, [id]: { ...prev[id], isOpen: !prev[id].isOpen } })); }; return ( <div className="w-full h-screen bg-neutral-950 bg-[radial-gradient(ellipse_80%_80%_at_50%_-20%,rgba(16,185,129,0.1),rgba(0,0,0,1))] overflow-hidden relative font-sans text-neutral-200"> <div className="absolute inset-0 flex items-center justify-center opacity-[0.02] pointer-events-none"><Settings2 size={500} /></div> {widgets.voice.isOpen && ( <DraggableWidget title="MODULADOR VOCAL KORE" icon={Zap} initialPos={widgets.voice.pos} onClose={() => toggleWidget('voice')}> <VoiceModulatorWidget /> </DraggableWidget> )} <div className="absolute bottom-6 left-1/2 transform -translate-x-1/2 bg-neutral-900/80 backdrop-blur-md border border-neutral-700/50 p-2 rounded-2xl shadow-2xl flex gap-2 z-[100]"> <div className="px-3 flex items-center border-r border-neutral-700/50 text-neutral-500"><LayoutGrid size={20} /></div> <button onClick={() => toggleWidget('voice')} className={`px-4 py-2 rounded-xl flex items-center gap-2 text-sm font-medium transition-all ${
"A bold text-only design for a t-shirt. The text says 'Dream Big, Work Hard' in a dynamic, modern font. The design uses a clean layout with high contrast colors, such as white text on a black background or vibrant neon text on a dark base. The font is a mix of bold and cursive styles, with emphasis on 'Dream' and 'Hard' in a larger, more decorative style. The text is centered, well-spaced, and visually striking, optimized for t-shirt printing with no graphics or additional elements, just the words." ar 4500:5400
Cartoon illustration, comic book cover featuring a handsome Caucasian man with burst-taper grey hair, wearing a white t-shirt and blue jeans, texting with his blue iPhone, a bold heading text in the background reads "PHONE" in huge bold sharp IMPACT white letters, in the top of the frame, occupying the whole frame, gta art style, gta 5 comics art, gta cover 2d game art, gta cover 2d game art, gta iv art style, rotoscoping, gta art style, gta v artwork style, gangsta rap
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details, align correctly, text in the middle and straight to the pov,
Create a group image featuring multiple digital cartoon characters. Each character should have a high-quality semi-3D polished cartoon style with stylized but realistic facial feature exaggeration. Keep each face clearly recognizable, with varied expressions, hairstyles, and skin tones. Smooth surfaces, soft lighting, subtle depth, and a premium cartoon finish. Arrange the characters in a clean, balanced grid or collage composition. Use a clean, simple background with enough empty space for text. Add large, bold, highly readable text that says: "AI Cartoon Maker tool". Place the text in a clear area (top or center) with strong contrast against the background. Use a modern sans-serif font style, solid color, no distortion, no effects that reduce readability. Ensure the text is clearly legible at small thumbnail sizes. No hand-drawn textures. No pencil or sketch effects. No logos, no watermarks. Dont repeat faces
Style: Printed T-Shirt Design The design should be highly realistic and captivating, focusing on showcasing a Print on Demand store specializing in movie-themed apparel. At the center of the scene, prominently feature a premium T-shirt laid out naturally on a minimalist chair. The T-shirt should display the text “watchfreemovies247 SHOP” in bold, clean, and clear typography, with sharp lines to give a professional, eye-catching effect. The text should immediately communicate a sense of quality and clarity, emphasizing the store’s movie-themed focus. Key Elements: Main T-Shirt Display: Place the central T-shirt on a modern, sleek chair, positioned naturally and without a person wearing it. The text “watchfreemovies247 SHOP” should be the focal point, printed clearly on the front of the T-shirt. The font must be easy to read, bold, and sharp, standing out against the fabric. The design should have a cinematic feel, subtly tying into the theme of movies and film culture. Additional T-Shirts and Graphic Elements: Surround the main T-shirt with several other shirts featuring creative, eye-catching cinematic graphic designs. These designs can include movie-related imagery such as film reels, directors’ clapperboards, iconic movie quotes, and other recognizable film visuals. The shirts should be displayed in a professional and organized manner, whether folded neatly, hanging, or draped across nearby props. Each shirt should have a different movie-themed graphic design to show the variety and creative possibilities offered by the store. Film-Themed Props and Background: Incorporate film-related props into the scene to enhance the cinematic atmosphere. These could include vintage film cameras, popcorn tubs, film reels, and director’s chairs. The props should be subtly placed around the scene, contributing to the overall theme without overshadowing the main T-shirt. The background should evoke a movie theater or film studio ambiance, with soft lighting and a cinematic glow that highlights the shirts and props. Professional Presentation: Ensure that the scene feels polished, well-organized, and professional. The design should communicate clearly that this is a Print on Demand store catering to film and movie enthusiasts. Arrange the shirts and props in a way that feels cohesive, yet dynamic, giving the viewer the impression that they are browsing a curated selection of unique, movie-themed apparel. Lighting and Color Scheme: Use warm, cinematic lighting to create depth and draw attention to the T-shirts. Incorporate a palette of rich, dark neutrals, with accents of golds, reds, and subtle lighting highlights to evoke the ambiance of a classic movie scene. The lighting should add a sense of dimension and make the central T-shirt the focal point while maintaining a balanced and inviting atmosphere. Final Vision: The completed design should instantly communicate that this is a professional Print on Demand store for movie lovers. The main T-shirt should stand out clearly with its sharp, bold text, while the surrounding shirts and cinematic props reinforce the theme. The scene should feel inviting, creative, and expertly arranged, capturing the essence of a store dedicated to passionate movie fans looking for unique, high-quality apparel. The overall layout must be realistic, visually striking, and professional, creating a sense of excitement and engagement with the viewer.
Create a 30-second promotional video in a professional marketing style for a mobile phone repair training course. Language & Voiceover: Voiceover in Egyptian Arabic dialect Clear, confident male voice Add on-screen captions (Arabic) synced with the voiceover 🎥 Scene Breakdown Scene 1 (0:00 - 0:05) – Hook Visual: Quick shot of a broken smartphone or a device not working. A frustrated person trying to turn it on. Voiceover: "عارف إن فيه ناس بتدفع آلاف عشان تصليح أعطال تافهة في موبايلاتها؟" Captions: Same text appears bold in center Scene 2 (0:05 - 0:15) – Problem & Solution Visual: Professional close-up shots of opening a phone using repair tools (screwdrivers, multimeter, hot air gun). Fast montage of fixing screen or charging port. Voiceover: "لو معندكش شغل أو عايز تزود دخلك، الفيديو ده ليك.. مجال صيانة الموبايلات مش محتاج منك شهادة ولا سنين خبرة، محتاج بس تتعلم الصح." Captions: Highlight key phrases dynamically Scene 3 (0:15 - 0:25) – Course Offer Visual: Clean shots of tools, workspace, or learning environment On-screen text (center, bold): "30 يوم بس – من الصفر للاحتراف" Voiceover: "أنا بقدم لك كورس صيانة موبايل شامل، هعلمك فيه من الصفر خطوة بخطوة إزاي تشخص العطل وتصلحه بإيدك.. وفي خلال 30 يوم بس، هتكون جاهز تبدأ وتكسب فلوس." Add subtle motion graphics Scene 4 (0:25 - 0:30) – Call to Action Visual: Confident person looking at camera, pointing down Voiceover: "مستني إيه؟ ابعت كلمة (ابدأ) دلوقتي في الكومنتات أو الرسائل وهبعتلك كل التفاصيل." Captions: Emphasize "ابدأ" ⚙️ Video Settings Style: Social media ad (TikTok / Reels / Shorts) Lighting: Bright (ring light or natural light) Music: Light motivational business background music Text: Large, bold, centered captions Quality: HD or 4K Camera: Multiple angles + fast-paced editing Transitions: Smooth, quick, engaging cuts 💡 AI Notes Emphasize professional repair tools (screwdrivers, multimeter, hot air gun) Keep pacing fast and attention-grabbing Make visuals feel modern and clean Optimize for vertical video (9:16) If you want, I can also turn this into: Script for ElevenLabs voiceover CapCut editing template Shot list + exact camera angles
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details
Make a mafia boss with the face of input image 1 with mafia hat holding with two hands a doner kebab wrapped in his hands and he has a smile. Display text for the mascot logo should be like Godfather text style similar bold text. Color scheme. Black, Red, white. Logo text should say: KEBABOSS
Cartoon brain character relaxing in a hammock between large daisies, text "TRUST IN THE LORD" in a bold, bubble-lettered style, text "with all your heart" underneath, retro style, soft pastel colors, bold outlines, whimsical design, simple graphic elements, daisies with detailed white petals, light beige background, detailed illustration of the brain character with large, expressive eyes, light pink brain with simple arms and legs, character wearing boots, hammock in a light teal or blue color, simple, clear lines, flat design, cute and inspirational, illustration style.
Кадр 11: Радужный макро-взгляд (Prismatic Macro Eye) Prompt: Extreme macro close-up of a young woman's eye looking directly at the camera. A sharp, narrow rainbow light spectrum from a prism projector cuts vertically across her pupil and cheek. 100% facial feature retention of Aisha Dosma, dark wavy hair, brown eyes. Hyper-realistic skin texture with visible pores and slight moisture. Sharp focus on eyelashes and iris. High-contrast lighting (chiaroscuro), deep shadows. Film grain, 85mm f/1.4 lens aesthetics. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 12: Макро-диалог с тенью (Macro Shadow Dialogue) Prompt: Extreme close-up profile of the lower face (nose, lips, chin) of a woman with 100% likeness to Aisha Dosma. Strong side lighting from a projector creating a dramatic chiaroscuro effect. On the concrete wall behind her, a large, sharp shadow of her profile is projected, overlapping with abstract light patterns. Wet lip gloss texture, satin skin finish. Dark cinematic atmosphere, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 13: Призматический макро-взгляд (Prismatic Macro Gaze) Prompt: Extreme macro shot of one eye of Aisha Dosma. Prismatic refraction creates a vibrant, detailed rainbow spectrum across the iris and eyelashes. Reflective catchlight from the projector in the pupil. Hyper-realistic wet skin texture with micro-droplets of makeup. Perfect 1:1 similarity of eye shape and eyebrow. Moody, dark background, intense cinematic lighting. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 14: Влажный блеск и проекция на губах (Macro Luminescent Lips) Prompt: Extreme macro close-up of the lips and chin of Aisha Dosma. The lips are covered in heavy, ultra-glossy clear lip gloss resembling liquid glass. Small, brilliant light specks and glints from a projector reflect on the glossy surface. An abstract geometric light pattern is projected onto the surrounding matte skin. Extreme detail, visible skin relief. Cinematic noir lighting, grainy film texture. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 15: Текстура волос и преломленная проекция (Macro Hair Bun) Prompt: Medium close-up of the back of the head and neck of Aisha Dosma. A messy high bun with curly strands. A projector shines through a prism directly onto the hair, creating a complex, kaleidoscopic rainbow refraction pattern on the hair texture and the concrete wall behind. Sharp focus on individual hair strands and light catchers in the curls. Dark, mysterious atmosphere. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 16: Сдвиг фокуса и проекция на коже (Patterned Reflection) Prompt: Medium shot of Aisha Dosma from behind, looking over her shoulder. Shallow depth of field. The focus is sharp on a concrete wall where a large, clear projection of her own face is displayed. Aisha herself is in the foreground, blurred (deep bokeh). On her blurred back and shoulder, an abstract light pattern from the projector is visible. Dark dress, cinematic lighting, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 17: Макро-взгляд (The Prismatic Double Gaze) Prompt: Extreme macro close-up of both eyes of Aisha Dosma, looking straight into the lens. 100% facial similarity. A complex prismatic light pattern scatters multiple spectral spots and rainbow flares across her forehead, eyes, and bridge of the nose. Sharp focus on the moist texture of the eyes and long eyelashes. Dark, moody background, intense cinematic chiaroscuro. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA".
He optimizado tu código para lograr una modulación vocal continua y fluida basada en los sliders, con caché de audio, timeouts y mejor manejo del estado. Ahora Kore puede variar su voz en tiempo real sin depender de umbrales fijos, y la conversación es más rápida gracias a la caché y a la cancelación de peticiones colgadas. ```javascript import React, { useState, useRef, useEffect, useCallback } from 'react'; import { Play, Square, Mic, MicOff, Settings2, Activity, Loader2, X, GripHorizontal, LayoutGrid, Zap, AlertCircle } from 'lucide-react'; // --- CONSTANTES --- const SILENT_WAV = "data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"; const TTS_TIMEOUT = 5000; // 5 segundos máximo para la síntesis const DEFAULT_API_KEY = 'AIzaSyBlkvy_Op-XlzSMSDDl9ip42dMFZX28MAA'; // ⚠️ Cámbiala por tu propia clave // --- UTILIDADES --- const base64ToWavBlob = (base64Data, sampleRate = 24000) => { const binaryString = window.atob(base64Data); const pcmData = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) pcmData[i] = binaryString.charCodeAt(i); const numChannels = 1; const bitsPerSample = 16; const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmData.length; const buffer = new ArrayBuffer(44 + dataSize); const view = new DataView(buffer); const writeString = (view, offset, string) => { for (let i = 0; i < string.length; i++) view.setUint8(offset + i, string.charCodeAt(i)); }; writeString(view, 0, 'RIFF'); view.setUint32(4, 36 + dataSize, true); writeString(view, 8, 'WAVE'); writeString(view, 12, 'fmt '); view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, numChannels, true); view.setUint32(24, sampleRate, true); view.setUint32(28, byteRate, true); view.setUint16(32, blockAlign, true); view.setUint16(34, bitsPerSample, true); writeString(view, 36, 'data'); view.setUint32(40, dataSize, true); for (let i = 0; i < dataSize; i++) view.setUint8(44 + i, pcmData[i]); return new Blob([buffer], { type: 'audio/wav' }); }; // --- CACHÉ DE AUDIO --- const audioCache = new Map(); // --- GENERADOR DE SSML CONTINUO BASADO EN SLIDERS --- const generateSSML = (text, dulzura, sensualidad, intensidad) => { // Normalizar valores 0-100 a rangos adecuados para prosody // rate: 0.5 a 2.0 (1.0 es normal) const rate = 0.8 + (intensidad / 100) * 1.2; // 0.8 (lento) a 2.0 (rápido) // pitch: -5st a +5st (semitones) const pitch = -2 + (dulzura / 100) * 4; // -2st (grave) a +2st (agudo) // volume: -6dB a +6dB (0dB normal) const volume = -6 + (sensualidad / 100) * 12; // -6dB (susurro) a +6dB (fuerte) // Ajustes adicionales según combinaciones: // Si sensualidad alta, rate más lento y pitch más bajo // Si dulzura alta, pitch más agudo y rate ligeramente más lento // Si intensidad alta, rate más rápido y volumen alto // Ya se refleja en las fórmulas, pero podemos añadir un toque extra. const ssml = `<speak> <prosody rate="${rate.toFixed(2)}" pitch="${pitch.toFixed(0)}st" volume="${volume.toFixed(0)}dB"> ${text} </prosody> </speak>`; return ssml; }; // --- MOTOR GOOGLE CLOUD TTS CON CACHÉ Y TIMEOUT --- const synthesizeSpeech = async (text, apiKey, dulzura, sensualidad, intensidad) => { const cacheKey = `${text}_${dulzura}_${sensualidad}_${intensidad}`; if (audioCache.has(cacheKey)) { console.log('🎯 Usando audio cacheado'); return audioCache.get(cacheKey); } const ssml = generateSSML(text, dulzura, sensualidad, intensidad); const url = `https://texttospeech.googleapis.com/v1/text:synthesize?key=${apiKey}`; const body = { input: { ssml }, voice: { languageCode: 'es-ES', name: 'es-ES-Neural2-F', ssmlGender: 'FEMALE' }, audioConfig: { audioEncoding: 'LINEAR16', sampleRateHertz: 24000 } }; const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), TTS_TIMEOUT); try { const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal: controller.signal }); clearTimeout(timeoutId); if (!res.ok) throw new Error(`TTS error: ${res.status}`); const data = await res.json(); audioCache.set(cacheKey, data.audioContent); return data.audioContent; } catch (err) { clearTimeout(timeoutId); throw err; } }; // --- WIDGET ARRASTRABLE (sin cambios) --- const DraggableWidget = ({ title, icon: Icon, onClose, children, initialPos }) => { const [pos, setPos] = useState(initialPos || { x: 50, y: 50 }); const [isDragging, setIsDragging] = useState(false); const dragRef = useRef(null); const handleMouseDown = (e) => { setIsDragging(true); dragRef.current = { startX: e.clientX, startY: e.clientY, initialX: pos.x, initialY: pos.y }; }; const handleMouseMove = (e) => { if (!isDragging) return; setPos({ x: Math.max(0, dragRef.current.initialX + (e.clientX - dragRef.current.startX)), y: Math.max(0, dragRef.current.initialY + (e.clientY - dragRef.current.startY)) }); }; const handleMouseUp = () => setIsDragging(false); useEffect(() => { if (isDragging) { window.addEventListener('mousemove', handleMouseMove); window.addEventListener('mouseup', handleMouseUp); } return () => { window.removeEventListener('mousemove', handleMouseMove); window.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging]); return ( <div style={{ left: `${pos.x}px`, top: `${pos.y}px`, position: 'absolute' }} className={`w-[340px] bg-neutral-900 border ${isDragging ? 'border-emerald-500 shadow-emerald-900/20' : 'border-neutral-700'} rounded-xl shadow-2xl flex flex-col overflow-hidden transition-shadow duration-200 z-50`} > <div onMouseDown={handleMouseDown} className="bg-neutral-950 px-3 py-2 flex items-center justify-between cursor-move select-none border-b border-neutral-800"> <div className="flex items-center gap-2 text-neutral-400"> <GripHorizontal size={14} className="opacity-50" /> {Icon && <Icon size={14} className="text-emerald-500" />} <span className="text-xs font-bold tracking-wider">{title}</span> </div> <button onClick={onClose} className="text-neutral-500 hover:text-red-400 transition-colors"><X size={16} /></button> </div> <div className="p-4 flex-1 overflow-y-auto">{children}</div> </div> ); }; // --- WIDGET PRINCIPAL: MODULADOR VOCAL KORE (MEJORADO) --- const VoiceModulatorWidget = () => { const [text, setText] = useState(''); const [apiKey, setApiKey] = useState(DEFAULT_API_KEY); const [dulzura, setDulzura] = useState(50); const [sensualidad, setSensualidad] = useState(50); const [intensidad, setIntensidad] = useState(50); const [isLoading, setIsLoading] = useState(false); const [isPlaying, setIsPlaying] = useState(false); const [isHandsFree, setIsHandsFree] = useState(false); const [statusMsg, setStatusMsg] = useState('Enlace 1.5 Flash + GCP TTS Establecido.'); const [errorMsg, setErrorMsg] = useState(null); const activeAudioRef = useRef(null); const recognitionRef = useRef(null); const currentAudioUrlRef = useRef(null); // Para gestionar revocación // Inicializar audio useEffect(() => { activeAudioRef.current = new Audio(); activeAudioRef.current.preload = "auto"; return () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } } if (recognitionRef.current) recognitionRef.current.stop(); }; }, []); // Configurar reconocimiento de voz useEffect(() => { if (!('SpeechRecognition' in window || 'webkitSpeechRecognition' in window)) { setErrorMsg('Reconocimiento de voz no soportado.'); return; } const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; recognitionRef.current = new SpeechRecognition(); recognitionRef.current.lang = 'es-ES'; recognitionRef.current.interimResults = false; recognitionRef.current.continuous = false; recognitionRef.current.onresult = async (event) => { const transcript = event.results[0][0].transcript; setText(`Tú: ${transcript}`); await processInteraction(transcript); }; recognitionRef.current.onerror = (event) => { if (event.error !== 'no-speech') { setErrorMsg(`Micrófono: ${event.error}`); setIsHandsFree(false); } }; recognitionRef.current.onend = () => { if (isHandsFree && !isPlaying && !isLoading) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; // Limpiar al desmontar return () => { if (recognitionRef.current) recognitionRef.current.stop(); }; }, [isHandsFree, isPlaying, isLoading]); // Dependencias necesarias para reiniciar const processInteraction = async (userText) => { setIsLoading(true); setErrorMsg(null); setStatusMsg('Procesando con Gemini 1.5 Flash...'); const key = apiKey.trim(); try { // 1. Llamada a Gemini con timeout const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 5000); const payloadText = { contents: [{ parts: [{ text: userText }] }], systemInstruction: { parts: [{ text: `Eres Kore, 28 años, Huesca. Labia, directa, sensual, disruptiva. Responde en español, máx 20 palabras. REGLA INNEGOCIABLE: CERO PREGUNTAS.` }] } }; const resText = await fetch( `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${key}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payloadText), signal: controller.signal } ); clearTimeout(timeoutId); if (!resText.ok) throw new Error(`Gemini error: ${resText.status}`); const dataText = await resText.json(); const aiText = dataText.candidates?.[0]?.content?.parts?.[0]?.text || "Mmm... vale."; setText(`Kore: ${aiText}`); // 2. Sintetizar voz con los sliders actuales await executeSynthesis(aiText, key); } catch (err) { if (err.name === 'AbortError') { setErrorMsg('Gemini timeout (5s)'); } else { setErrorMsg(err.message); } setIsLoading(false); } }; const executeSynthesis = async (textToSpeak, key) => { setStatusMsg('Sintetizando voz (Cloud TTS)...'); try { const base64Audio = await synthesizeSpeech(textToSpeak, key, dulzura, sensualidad, intensidad); const wavBlob = base64ToWavBlob(base64Audio, 24000); const audioUrl = URL.createObjectURL(wavBlob); // Revocar URL anterior si existe if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } currentAudioUrlRef.current = audioUrl; activeAudioRef.current.src = audioUrl; activeAudioRef.current.onended = () => { setIsPlaying(false); setStatusMsg('Transmisión completada.'); if (isHandsFree) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; setStatusMsg('Transmitiendo...'); setIsPlaying(true); setIsLoading(false); await activeAudioRef.current.play().catch(err => { throw new Error(`Autoplay bloqueado: ${err.message}`); }); } catch (error) { throw new Error(`Fallo TTS: ${error.message}`); } }; const handleManualPlay = async () => { if (!text.trim()) return setErrorMsg('Escribe algo primero.'); // Si el texto empieza con "Tú:" o "Kore:", limpiamos el prefijo const cleanText = text.replace(/^(Tú:|Kore:)\s*/, ''); if (!cleanText.trim()) return setErrorMsg('Texto vacío después de limpiar.'); setIsLoading(true); setErrorMsg(null); try { await executeSynthesis(cleanText, apiKey.trim()); } catch (err) { setErrorMsg(err.message); setIsLoading(false); } }; const toggleHandsFree = () => { if (!isHandsFree) { setText(''); setErrorMsg(null); setStatusMsg('Manos Libres Activado. Habla...'); // Desbloquear audio en algunos navegadores if (activeAudioRef.current) { activeAudioRef.current.src = SILENT_WAV; activeAudioRef.current.play().catch(() => {}); } try { recognitionRef.current.start(); } catch (e) {} } else { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Sistemas en pausa.'); if (recognitionRef.current) recognitionRef.current.stop(); } setIsHandsFree(!isHandsFree); }; const stopAudio = () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Señal interrumpida.'); }; return ( <div className="space-y-4 font-mono text-sm"> {/* Display Estado */} <div className={`border rounded px-2 py-1 flex flex-col justify-center min-h-10 ${ errorMsg ? 'bg-red-950/50 border-red-900' : isHandsFree ? 'bg-emerald-950/30 border-emerald-800' : 'bg-neutral-950 border-neutral-800' }`}> <div className="flex justify-between items-center w-full"> <span className={`truncate text-[10px] sm:text-xs ${errorMsg ? 'text-red-500' : 'text-emerald-500'}`}> > {errorMsg || statusMsg} </span> {isPlaying && !errorMsg && <Activity size={14} className="text-emerald-500 animate-pulse ml-2 flex-shrink-0" />} {isLoading && !errorMsg && <Zap size={14} className="text-amber-500 animate-pulse ml-2 flex-shrink-0" />} {isHandsFree && !isPlaying && !isLoading && !errorMsg && <Mic size={14} className="text-red-500 animate-pulse ml-2 flex-shrink-0" />} </div> </div> {/* Input Texto / Log */} <textarea value={text} onChange={(e) => setText(e.target.value)} className="w-full bg-neutral-950/50 border border-neutral-700 rounded p-2 text-xs text-neutral-300 focus:outline-none focus:border-emerald-500 resize-none h-20" placeholder={isHandsFree ? "Escuchando transcripción en tiempo real..." : "Escribe texto directo o activa Manos Libres..."} readOnly={isHandsFree || isLoading} /> {/* Sliders continuos (controlan SSML en tiempo real) */} <div className="space-y-3 bg-neutral-950/30 p-3 rounded border border-neutral-800"> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Agresiva</span><span className="text-emerald-400">Dulzura [{dulzura}]</span><span>Dulce</span> </div> <input type="range" min="0" max="100" value={dulzura} onChange={(e)=>setDulzura(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-emerald-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Robótica</span><span className="text-pink-400">Aura [{sensualidad}]</span><span>Sensual</span> </div> <input type="range" min="0" max="100" value={sensualidad} onChange={(e)=>setSensualidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-pink-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Atenuada</span><span className="text-amber-400">Intensidad [{intensidad}]</span><span>Fuerte</span> </div> <input type="range" min="0" max="100" value={intensidad} onChange={(e)=>setIntensidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-amber-500 cursor-pointer" /> </div> </div> {/* Botones de Control */} <div className="flex flex-col sm:flex-row gap-2"> <button onClick={toggleHandsFree} disabled={isLoading} className={`flex-1 py-2 rounded text-xs font-bold flex items-center justify-center gap-2 transition-colors border ${ isHandsFree ? 'bg-red-900/20 text-red-400 border-red-900/50 hover:bg-red-900/40 shadow-[0_0_10px_rgba(239,68,68,0.2)]' : 'bg-indigo-900/20 text-indigo-400 border-indigo-900/50 hover:bg-indigo-900/40' }`} > {isHandsFree ? <MicOff size={14} /> : <Mic size={14} />} {isHandsFree ? 'Detener Escucha' : 'Manos Libres'} </button> <div className="flex gap-2 flex-1"> <button onClick={handleManualPlay} disabled={isLoading || isPlaying || isHandsFree} className="flex-1 bg-emerald-600/20 hover:bg-emerald-600/40 text-emerald-400 border border-emerald-600/50 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center gap-1 transition-colors" > {isLoading ? <Loader2 size={14} className="animate-spin" /> : <Play size={14} />} Sintetizar </button> <button onClick={stopAudio} disabled={!isPlaying && !isHandsFree} className="px-4 bg-neutral-800 hover:bg-neutral-700 text-neutral-400 border border-neutral-700 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center transition-colors" > <Square size={14} /> </button> </div> </div> {/* Botón para limpiar caché (opcional) */} <div className="text-right"> <button onClick={() => audioCache.clear()} className="text-[8px] text-neutral-600 hover:text-neutral-400 underline" > limpiar caché de audio </button> </div> </div> ); }; // --- ENTORNO ESCRITORIO (sin cambios) --- export default function App() { const [widgets, setWidgets] = useState({ voice: { isOpen: true, pos: { x: window.innerWidth > 768 ? window.innerWidth / 2 - 170 : 20, y: 40 } } }); const toggleWidget = (id) => { setWidgets(prev => ({ ...prev, [id]: { ...prev[id], isOpen: !prev[id].isOpen } })); }; return ( <div className="w-full h-screen bg-neutral-950 bg-[radial-gradient(ellipse_80%_80%_at_50%_-20%,rgba(16,185,129,0.1),rgba(0,0,0,1))] overflow-hidden relative font-sans text-neutral-200"> <div className="absolute inset-0 flex items-center justify-center opacity-[0.02] pointer-events-none"><Settings2 size={500} /></div> {widgets.voice.isOpen && ( <DraggableWidget title="MODULADOR VOCAL KORE" icon={Zap} initialPos={widgets.voice.pos} onClose={() => toggleWidget('voice')}> <VoiceModulatorWidget /> </DraggableWidget> )} <div className="absolute bottom-6 left-1/2 transform -translate-x-1/2 bg-neutral-900/80 backdrop-blur-md border border-neutral-700/50 p-2 rounded-2xl shadow-2xl flex gap-2 z-[100]"> <div className="px-3 flex items-center border-r border-neutral-700/50 text-neutral-500"><LayoutGrid size={20} /></div> <button onClick={() => toggleWidget('voice')} className={`px-4 py-2 rounded-xl flex items-center gap-2 text-sm font-medium transition-all ${
"A bold text-only design for a t-shirt. The text says 'Dream Big, Work Hard' in a dynamic, modern font. The design uses a clean layout with high contrast colors, such as white text on a black background or vibrant neon text on a dark base. The font is a mix of bold and cursive styles, with emphasis on 'Dream' and 'Hard' in a larger, more decorative style. The text is centered, well-spaced, and visually striking, optimized for t-shirt printing with no graphics or additional elements, just the words." ar 4500:5400
Cartoon illustration, comic book cover featuring a handsome Caucasian man with burst-taper grey hair, wearing a white t-shirt and blue jeans, texting with his blue iPhone, a bold heading text in the background reads "PHONE" in huge bold sharp IMPACT white letters, in the top of the frame, occupying the whole frame, gta art style, gta 5 comics art, gta cover 2d game art, gta cover 2d game art, gta iv art style, rotoscoping, gta art style, gta v artwork style, gangsta rap
Create a group image featuring multiple digital cartoon characters. Each character should have a high-quality semi-3D polished cartoon style with stylized but realistic facial feature exaggeration. Keep each face clearly recognizable, with varied expressions, hairstyles, and skin tones. Smooth surfaces, soft lighting, subtle depth, and a premium cartoon finish. Arrange the characters in a clean, balanced grid or collage composition. Use a clean, simple background with enough empty space for text. Add large, bold, highly readable text that says: "AI Cartoon Maker tool". Place the text in a clear area (top or center) with strong contrast against the background. Use a modern sans-serif font style, solid color, no distortion, no effects that reduce readability. Ensure the text is clearly legible at small thumbnail sizes. No hand-drawn textures. No pencil or sketch effects. No logos, no watermarks. Dont repeat faces
Make a mafia boss with the face of input image 1 with mafia hat holding with two hands a doner kebab wrapped in his hands and he has a smile. Display text for the mascot logo should be like Godfather text style similar bold text. Color scheme. Black, Red, white. Logo text should say: KEBABOSS
Cartoon brain character relaxing in a hammock between large daisies, text "TRUST IN THE LORD" in a bold, bubble-lettered style, text "with all your heart" underneath, retro style, soft pastel colors, bold outlines, whimsical design, simple graphic elements, daisies with detailed white petals, light beige background, detailed illustration of the brain character with large, expressive eyes, light pink brain with simple arms and legs, character wearing boots, hammock in a light teal or blue color, simple, clear lines, flat design, cute and inspirational, illustration style.
A front view 3d macro detailed illustration gaming WITH realistic colour logo with chrome, metal gold, steal, silver WHICH LOOKS REAL with front face texture photorealistic style with colour with a shooter, featuring the BIG AND BOLD text of SAM.D.COSTA and clear text of GAMING in bold letters. SIMILAR TO CALL OF DUTY THEME AND WAR BACKGROUND
Image Type: Photorealistic Setting: A modern gym or dojo with clean, polished floors and minimal background distractions, conveying a professional and focused training environment. Main Subjects: A Brazilian Jiu-Jitsu athlete in a custom-designed gi. The athlete is in motion, executing a technique on the mat, showing off the vibrant and unique design of the gi. The design should be intricate and personalized, with bold colors. Text Placement & Style: Place the text "Customize Your Gear" in bold, clear white or bright color at the bottom or top of the thumbnail. Make sure the text stands out against the background with high contrast for readability. Overall Mood: Motivational and focused, emphasizing the performance-enhancing effect of personalized gear.
vintage patriotic t-shirt design, centered layout, Puerto Rican flag in the middle with blue triangle and white star on the left and red and white horizontal stripes, distressed vintage texture, bold retro typography, top text "MY GIRLFRIEND IS" in Bebas Neue style condensed font, large center text "PUERTO RICAN" in heavy Anton style bold font, bottom text "NOTHING SCARES ME" in Oswald bold style font, clean centered composition, patriotic humor design, slightly grunge worn effect, screen print vector style, high contrast, professional t-shirt graphic, transparent background, no mockup, no model
Main "World's Best Prompt Master" ke roop mein, maine Instagram, Facebook aur Websites par top performing diesel engine aur generator posts ka deep analysis kiya hai. Analysis of Top Performers (The Generator Wale Niche): Color Psychology: Top brands (jaise Cummins, Caterpillar, Sudhir Power) hamesha Safety Yellow, Black, aur White use karte hain. Ye colors "Caution," "Power," aur "Trust" signify karte hain. Imagery: "Action shots" (mechanic repairing) aur "Product Hero shots" (chamakta hua generator) sabse zyada convert hote hain. Text Strategy: Text hamesha BOLD aur Clean hota hai. Curly fonts ya fancy likhai is industry mein "weak" maani jaati hai. Aapko Editable Post chahiye. Isliye main aapko 2 alag-alag prompts de raha hoon. Pehla prompt Design/Layout ke liye (Canva Search Bar ke liye), aur doosra High-Quality Background Image ke liye (Canva Magic Media ke liye). 🟢 OPTION 1: The "All-in-One" Template Prompt (Is prompt ko Canva ke Home Page Search Bar mein copy-paste karein. Magic Media mein nahi.) "Create a professional Instagram Post Template for a Diesel Engine Sales & Service brand. Theme: Industrial, Heavy-Duty, and Trustworthy. Color Palette: Use High-Contrast Safety Yellow (#FFD700), Dark Charcoal (#1A1A1A), and White. Layout: Split screen or clean overlay. Visuals: Include a placeholder for a heavy diesel generator or a technician in safety gear. Text Structure: Create distinct, editable text boxes for a bold Headline ('POWER WHEN YOU NEED IT'), a Sub-headline ('Sales | Service | AMC'), and a CTA Button ('Call Now'). Font Style: Use strong, sans-serif fonts like 'Anton' or 'Roboto Condensed' to convey strength. Ensure the text is not flattened into the image.
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details, align correctly, text in the middle and straight to the pov,
Style: Printed T-Shirt Design The design should be highly realistic and captivating, focusing on showcasing a Print on Demand store specializing in movie-themed apparel. At the center of the scene, prominently feature a premium T-shirt laid out naturally on a minimalist chair. The T-shirt should display the text “watchfreemovies247 SHOP” in bold, clean, and clear typography, with sharp lines to give a professional, eye-catching effect. The text should immediately communicate a sense of quality and clarity, emphasizing the store’s movie-themed focus. Key Elements: Main T-Shirt Display: Place the central T-shirt on a modern, sleek chair, positioned naturally and without a person wearing it. The text “watchfreemovies247 SHOP” should be the focal point, printed clearly on the front of the T-shirt. The font must be easy to read, bold, and sharp, standing out against the fabric. The design should have a cinematic feel, subtly tying into the theme of movies and film culture. Additional T-Shirts and Graphic Elements: Surround the main T-shirt with several other shirts featuring creative, eye-catching cinematic graphic designs. These designs can include movie-related imagery such as film reels, directors’ clapperboards, iconic movie quotes, and other recognizable film visuals. The shirts should be displayed in a professional and organized manner, whether folded neatly, hanging, or draped across nearby props. Each shirt should have a different movie-themed graphic design to show the variety and creative possibilities offered by the store. Film-Themed Props and Background: Incorporate film-related props into the scene to enhance the cinematic atmosphere. These could include vintage film cameras, popcorn tubs, film reels, and director’s chairs. The props should be subtly placed around the scene, contributing to the overall theme without overshadowing the main T-shirt. The background should evoke a movie theater or film studio ambiance, with soft lighting and a cinematic glow that highlights the shirts and props. Professional Presentation: Ensure that the scene feels polished, well-organized, and professional. The design should communicate clearly that this is a Print on Demand store catering to film and movie enthusiasts. Arrange the shirts and props in a way that feels cohesive, yet dynamic, giving the viewer the impression that they are browsing a curated selection of unique, movie-themed apparel. Lighting and Color Scheme: Use warm, cinematic lighting to create depth and draw attention to the T-shirts. Incorporate a palette of rich, dark neutrals, with accents of golds, reds, and subtle lighting highlights to evoke the ambiance of a classic movie scene. The lighting should add a sense of dimension and make the central T-shirt the focal point while maintaining a balanced and inviting atmosphere. Final Vision: The completed design should instantly communicate that this is a professional Print on Demand store for movie lovers. The main T-shirt should stand out clearly with its sharp, bold text, while the surrounding shirts and cinematic props reinforce the theme. The scene should feel inviting, creative, and expertly arranged, capturing the essence of a store dedicated to passionate movie fans looking for unique, high-quality apparel. The overall layout must be realistic, visually striking, and professional, creating a sense of excitement and engagement with the viewer.
Create a 30-second promotional video in a professional marketing style for a mobile phone repair training course. Language & Voiceover: Voiceover in Egyptian Arabic dialect Clear, confident male voice Add on-screen captions (Arabic) synced with the voiceover 🎥 Scene Breakdown Scene 1 (0:00 - 0:05) – Hook Visual: Quick shot of a broken smartphone or a device not working. A frustrated person trying to turn it on. Voiceover: "عارف إن فيه ناس بتدفع آلاف عشان تصليح أعطال تافهة في موبايلاتها؟" Captions: Same text appears bold in center Scene 2 (0:05 - 0:15) – Problem & Solution Visual: Professional close-up shots of opening a phone using repair tools (screwdrivers, multimeter, hot air gun). Fast montage of fixing screen or charging port. Voiceover: "لو معندكش شغل أو عايز تزود دخلك، الفيديو ده ليك.. مجال صيانة الموبايلات مش محتاج منك شهادة ولا سنين خبرة، محتاج بس تتعلم الصح." Captions: Highlight key phrases dynamically Scene 3 (0:15 - 0:25) – Course Offer Visual: Clean shots of tools, workspace, or learning environment On-screen text (center, bold): "30 يوم بس – من الصفر للاحتراف" Voiceover: "أنا بقدم لك كورس صيانة موبايل شامل، هعلمك فيه من الصفر خطوة بخطوة إزاي تشخص العطل وتصلحه بإيدك.. وفي خلال 30 يوم بس، هتكون جاهز تبدأ وتكسب فلوس." Add subtle motion graphics Scene 4 (0:25 - 0:30) – Call to Action Visual: Confident person looking at camera, pointing down Voiceover: "مستني إيه؟ ابعت كلمة (ابدأ) دلوقتي في الكومنتات أو الرسائل وهبعتلك كل التفاصيل." Captions: Emphasize "ابدأ" ⚙️ Video Settings Style: Social media ad (TikTok / Reels / Shorts) Lighting: Bright (ring light or natural light) Music: Light motivational business background music Text: Large, bold, centered captions Quality: HD or 4K Camera: Multiple angles + fast-paced editing Transitions: Smooth, quick, engaging cuts 💡 AI Notes Emphasize professional repair tools (screwdrivers, multimeter, hot air gun) Keep pacing fast and attention-grabbing Make visuals feel modern and clean Optimize for vertical video (9:16) If you want, I can also turn this into: Script for ElevenLabs voiceover CapCut editing template Shot list + exact camera angles
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details
Кадр 11: Радужный макро-взгляд (Prismatic Macro Eye) Prompt: Extreme macro close-up of a young woman's eye looking directly at the camera. A sharp, narrow rainbow light spectrum from a prism projector cuts vertically across her pupil and cheek. 100% facial feature retention of Aisha Dosma, dark wavy hair, brown eyes. Hyper-realistic skin texture with visible pores and slight moisture. Sharp focus on eyelashes and iris. High-contrast lighting (chiaroscuro), deep shadows. Film grain, 85mm f/1.4 lens aesthetics. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 12: Макро-диалог с тенью (Macro Shadow Dialogue) Prompt: Extreme close-up profile of the lower face (nose, lips, chin) of a woman with 100% likeness to Aisha Dosma. Strong side lighting from a projector creating a dramatic chiaroscuro effect. On the concrete wall behind her, a large, sharp shadow of her profile is projected, overlapping with abstract light patterns. Wet lip gloss texture, satin skin finish. Dark cinematic atmosphere, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 13: Призматический макро-взгляд (Prismatic Macro Gaze) Prompt: Extreme macro shot of one eye of Aisha Dosma. Prismatic refraction creates a vibrant, detailed rainbow spectrum across the iris and eyelashes. Reflective catchlight from the projector in the pupil. Hyper-realistic wet skin texture with micro-droplets of makeup. Perfect 1:1 similarity of eye shape and eyebrow. Moody, dark background, intense cinematic lighting. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 14: Влажный блеск и проекция на губах (Macro Luminescent Lips) Prompt: Extreme macro close-up of the lips and chin of Aisha Dosma. The lips are covered in heavy, ultra-glossy clear lip gloss resembling liquid glass. Small, brilliant light specks and glints from a projector reflect on the glossy surface. An abstract geometric light pattern is projected onto the surrounding matte skin. Extreme detail, visible skin relief. Cinematic noir lighting, grainy film texture. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 15: Текстура волос и преломленная проекция (Macro Hair Bun) Prompt: Medium close-up of the back of the head and neck of Aisha Dosma. A messy high bun with curly strands. A projector shines through a prism directly onto the hair, creating a complex, kaleidoscopic rainbow refraction pattern on the hair texture and the concrete wall behind. Sharp focus on individual hair strands and light catchers in the curls. Dark, mysterious atmosphere. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 16: Сдвиг фокуса и проекция на коже (Patterned Reflection) Prompt: Medium shot of Aisha Dosma from behind, looking over her shoulder. Shallow depth of field. The focus is sharp on a concrete wall where a large, clear projection of her own face is displayed. Aisha herself is in the foreground, blurred (deep bokeh). On her blurred back and shoulder, an abstract light pattern from the projector is visible. Dark dress, cinematic lighting, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 17: Макро-взгляд (The Prismatic Double Gaze) Prompt: Extreme macro close-up of both eyes of Aisha Dosma, looking straight into the lens. 100% facial similarity. A complex prismatic light pattern scatters multiple spectral spots and rainbow flares across her forehead, eyes, and bridge of the nose. Sharp focus on the moist texture of the eyes and long eyelashes. Dark, moody background, intense cinematic chiaroscuro. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA".
A front view 3d macro detailed illustration gaming WITH realistic colour logo with chrome, metal gold, steal, silver WHICH LOOKS REAL with front face texture photorealistic style with colour with a shooter, featuring the BIG AND BOLD text of SAM.D.COSTA and clear text of GAMING in bold letters. SIMILAR TO CALL OF DUTY THEME AND WAR BACKGROUND
vintage patriotic t-shirt design, centered layout, Puerto Rican flag in the middle with blue triangle and white star on the left and red and white horizontal stripes, distressed vintage texture, bold retro typography, top text "MY GIRLFRIEND IS" in Bebas Neue style condensed font, large center text "PUERTO RICAN" in heavy Anton style bold font, bottom text "NOTHING SCARES ME" in Oswald bold style font, clean centered composition, patriotic humor design, slightly grunge worn effect, screen print vector style, high contrast, professional t-shirt graphic, transparent background, no mockup, no model
He optimizado tu código para lograr una modulación vocal continua y fluida basada en los sliders, con caché de audio, timeouts y mejor manejo del estado. Ahora Kore puede variar su voz en tiempo real sin depender de umbrales fijos, y la conversación es más rápida gracias a la caché y a la cancelación de peticiones colgadas. ```javascript import React, { useState, useRef, useEffect, useCallback } from 'react'; import { Play, Square, Mic, MicOff, Settings2, Activity, Loader2, X, GripHorizontal, LayoutGrid, Zap, AlertCircle } from 'lucide-react'; // --- CONSTANTES --- const SILENT_WAV = "data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"; const TTS_TIMEOUT = 5000; // 5 segundos máximo para la síntesis const DEFAULT_API_KEY = 'AIzaSyBlkvy_Op-XlzSMSDDl9ip42dMFZX28MAA'; // ⚠️ Cámbiala por tu propia clave // --- UTILIDADES --- const base64ToWavBlob = (base64Data, sampleRate = 24000) => { const binaryString = window.atob(base64Data); const pcmData = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) pcmData[i] = binaryString.charCodeAt(i); const numChannels = 1; const bitsPerSample = 16; const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmData.length; const buffer = new ArrayBuffer(44 + dataSize); const view = new DataView(buffer); const writeString = (view, offset, string) => { for (let i = 0; i < string.length; i++) view.setUint8(offset + i, string.charCodeAt(i)); }; writeString(view, 0, 'RIFF'); view.setUint32(4, 36 + dataSize, true); writeString(view, 8, 'WAVE'); writeString(view, 12, 'fmt '); view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, numChannels, true); view.setUint32(24, sampleRate, true); view.setUint32(28, byteRate, true); view.setUint16(32, blockAlign, true); view.setUint16(34, bitsPerSample, true); writeString(view, 36, 'data'); view.setUint32(40, dataSize, true); for (let i = 0; i < dataSize; i++) view.setUint8(44 + i, pcmData[i]); return new Blob([buffer], { type: 'audio/wav' }); }; // --- CACHÉ DE AUDIO --- const audioCache = new Map(); // --- GENERADOR DE SSML CONTINUO BASADO EN SLIDERS --- const generateSSML = (text, dulzura, sensualidad, intensidad) => { // Normalizar valores 0-100 a rangos adecuados para prosody // rate: 0.5 a 2.0 (1.0 es normal) const rate = 0.8 + (intensidad / 100) * 1.2; // 0.8 (lento) a 2.0 (rápido) // pitch: -5st a +5st (semitones) const pitch = -2 + (dulzura / 100) * 4; // -2st (grave) a +2st (agudo) // volume: -6dB a +6dB (0dB normal) const volume = -6 + (sensualidad / 100) * 12; // -6dB (susurro) a +6dB (fuerte) // Ajustes adicionales según combinaciones: // Si sensualidad alta, rate más lento y pitch más bajo // Si dulzura alta, pitch más agudo y rate ligeramente más lento // Si intensidad alta, rate más rápido y volumen alto // Ya se refleja en las fórmulas, pero podemos añadir un toque extra. const ssml = `<speak> <prosody rate="${rate.toFixed(2)}" pitch="${pitch.toFixed(0)}st" volume="${volume.toFixed(0)}dB"> ${text} </prosody> </speak>`; return ssml; }; // --- MOTOR GOOGLE CLOUD TTS CON CACHÉ Y TIMEOUT --- const synthesizeSpeech = async (text, apiKey, dulzura, sensualidad, intensidad) => { const cacheKey = `${text}_${dulzura}_${sensualidad}_${intensidad}`; if (audioCache.has(cacheKey)) { console.log('🎯 Usando audio cacheado'); return audioCache.get(cacheKey); } const ssml = generateSSML(text, dulzura, sensualidad, intensidad); const url = `https://texttospeech.googleapis.com/v1/text:synthesize?key=${apiKey}`; const body = { input: { ssml }, voice: { languageCode: 'es-ES', name: 'es-ES-Neural2-F', ssmlGender: 'FEMALE' }, audioConfig: { audioEncoding: 'LINEAR16', sampleRateHertz: 24000 } }; const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), TTS_TIMEOUT); try { const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal: controller.signal }); clearTimeout(timeoutId); if (!res.ok) throw new Error(`TTS error: ${res.status}`); const data = await res.json(); audioCache.set(cacheKey, data.audioContent); return data.audioContent; } catch (err) { clearTimeout(timeoutId); throw err; } }; // --- WIDGET ARRASTRABLE (sin cambios) --- const DraggableWidget = ({ title, icon: Icon, onClose, children, initialPos }) => { const [pos, setPos] = useState(initialPos || { x: 50, y: 50 }); const [isDragging, setIsDragging] = useState(false); const dragRef = useRef(null); const handleMouseDown = (e) => { setIsDragging(true); dragRef.current = { startX: e.clientX, startY: e.clientY, initialX: pos.x, initialY: pos.y }; }; const handleMouseMove = (e) => { if (!isDragging) return; setPos({ x: Math.max(0, dragRef.current.initialX + (e.clientX - dragRef.current.startX)), y: Math.max(0, dragRef.current.initialY + (e.clientY - dragRef.current.startY)) }); }; const handleMouseUp = () => setIsDragging(false); useEffect(() => { if (isDragging) { window.addEventListener('mousemove', handleMouseMove); window.addEventListener('mouseup', handleMouseUp); } return () => { window.removeEventListener('mousemove', handleMouseMove); window.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging]); return ( <div style={{ left: `${pos.x}px`, top: `${pos.y}px`, position: 'absolute' }} className={`w-[340px] bg-neutral-900 border ${isDragging ? 'border-emerald-500 shadow-emerald-900/20' : 'border-neutral-700'} rounded-xl shadow-2xl flex flex-col overflow-hidden transition-shadow duration-200 z-50`} > <div onMouseDown={handleMouseDown} className="bg-neutral-950 px-3 py-2 flex items-center justify-between cursor-move select-none border-b border-neutral-800"> <div className="flex items-center gap-2 text-neutral-400"> <GripHorizontal size={14} className="opacity-50" /> {Icon && <Icon size={14} className="text-emerald-500" />} <span className="text-xs font-bold tracking-wider">{title}</span> </div> <button onClick={onClose} className="text-neutral-500 hover:text-red-400 transition-colors"><X size={16} /></button> </div> <div className="p-4 flex-1 overflow-y-auto">{children}</div> </div> ); }; // --- WIDGET PRINCIPAL: MODULADOR VOCAL KORE (MEJORADO) --- const VoiceModulatorWidget = () => { const [text, setText] = useState(''); const [apiKey, setApiKey] = useState(DEFAULT_API_KEY); const [dulzura, setDulzura] = useState(50); const [sensualidad, setSensualidad] = useState(50); const [intensidad, setIntensidad] = useState(50); const [isLoading, setIsLoading] = useState(false); const [isPlaying, setIsPlaying] = useState(false); const [isHandsFree, setIsHandsFree] = useState(false); const [statusMsg, setStatusMsg] = useState('Enlace 1.5 Flash + GCP TTS Establecido.'); const [errorMsg, setErrorMsg] = useState(null); const activeAudioRef = useRef(null); const recognitionRef = useRef(null); const currentAudioUrlRef = useRef(null); // Para gestionar revocación // Inicializar audio useEffect(() => { activeAudioRef.current = new Audio(); activeAudioRef.current.preload = "auto"; return () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } } if (recognitionRef.current) recognitionRef.current.stop(); }; }, []); // Configurar reconocimiento de voz useEffect(() => { if (!('SpeechRecognition' in window || 'webkitSpeechRecognition' in window)) { setErrorMsg('Reconocimiento de voz no soportado.'); return; } const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; recognitionRef.current = new SpeechRecognition(); recognitionRef.current.lang = 'es-ES'; recognitionRef.current.interimResults = false; recognitionRef.current.continuous = false; recognitionRef.current.onresult = async (event) => { const transcript = event.results[0][0].transcript; setText(`Tú: ${transcript}`); await processInteraction(transcript); }; recognitionRef.current.onerror = (event) => { if (event.error !== 'no-speech') { setErrorMsg(`Micrófono: ${event.error}`); setIsHandsFree(false); } }; recognitionRef.current.onend = () => { if (isHandsFree && !isPlaying && !isLoading) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; // Limpiar al desmontar return () => { if (recognitionRef.current) recognitionRef.current.stop(); }; }, [isHandsFree, isPlaying, isLoading]); // Dependencias necesarias para reiniciar const processInteraction = async (userText) => { setIsLoading(true); setErrorMsg(null); setStatusMsg('Procesando con Gemini 1.5 Flash...'); const key = apiKey.trim(); try { // 1. Llamada a Gemini con timeout const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 5000); const payloadText = { contents: [{ parts: [{ text: userText }] }], systemInstruction: { parts: [{ text: `Eres Kore, 28 años, Huesca. Labia, directa, sensual, disruptiva. Responde en español, máx 20 palabras. REGLA INNEGOCIABLE: CERO PREGUNTAS.` }] } }; const resText = await fetch( `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${key}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payloadText), signal: controller.signal } ); clearTimeout(timeoutId); if (!resText.ok) throw new Error(`Gemini error: ${resText.status}`); const dataText = await resText.json(); const aiText = dataText.candidates?.[0]?.content?.parts?.[0]?.text || "Mmm... vale."; setText(`Kore: ${aiText}`); // 2. Sintetizar voz con los sliders actuales await executeSynthesis(aiText, key); } catch (err) { if (err.name === 'AbortError') { setErrorMsg('Gemini timeout (5s)'); } else { setErrorMsg(err.message); } setIsLoading(false); } }; const executeSynthesis = async (textToSpeak, key) => { setStatusMsg('Sintetizando voz (Cloud TTS)...'); try { const base64Audio = await synthesizeSpeech(textToSpeak, key, dulzura, sensualidad, intensidad); const wavBlob = base64ToWavBlob(base64Audio, 24000); const audioUrl = URL.createObjectURL(wavBlob); // Revocar URL anterior si existe if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } currentAudioUrlRef.current = audioUrl; activeAudioRef.current.src = audioUrl; activeAudioRef.current.onended = () => { setIsPlaying(false); setStatusMsg('Transmisión completada.'); if (isHandsFree) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; setStatusMsg('Transmitiendo...'); setIsPlaying(true); setIsLoading(false); await activeAudioRef.current.play().catch(err => { throw new Error(`Autoplay bloqueado: ${err.message}`); }); } catch (error) { throw new Error(`Fallo TTS: ${error.message}`); } }; const handleManualPlay = async () => { if (!text.trim()) return setErrorMsg('Escribe algo primero.'); // Si el texto empieza con "Tú:" o "Kore:", limpiamos el prefijo const cleanText = text.replace(/^(Tú:|Kore:)\s*/, ''); if (!cleanText.trim()) return setErrorMsg('Texto vacío después de limpiar.'); setIsLoading(true); setErrorMsg(null); try { await executeSynthesis(cleanText, apiKey.trim()); } catch (err) { setErrorMsg(err.message); setIsLoading(false); } }; const toggleHandsFree = () => { if (!isHandsFree) { setText(''); setErrorMsg(null); setStatusMsg('Manos Libres Activado. Habla...'); // Desbloquear audio en algunos navegadores if (activeAudioRef.current) { activeAudioRef.current.src = SILENT_WAV; activeAudioRef.current.play().catch(() => {}); } try { recognitionRef.current.start(); } catch (e) {} } else { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Sistemas en pausa.'); if (recognitionRef.current) recognitionRef.current.stop(); } setIsHandsFree(!isHandsFree); }; const stopAudio = () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Señal interrumpida.'); }; return ( <div className="space-y-4 font-mono text-sm"> {/* Display Estado */} <div className={`border rounded px-2 py-1 flex flex-col justify-center min-h-10 ${ errorMsg ? 'bg-red-950/50 border-red-900' : isHandsFree ? 'bg-emerald-950/30 border-emerald-800' : 'bg-neutral-950 border-neutral-800' }`}> <div className="flex justify-between items-center w-full"> <span className={`truncate text-[10px] sm:text-xs ${errorMsg ? 'text-red-500' : 'text-emerald-500'}`}> > {errorMsg || statusMsg} </span> {isPlaying && !errorMsg && <Activity size={14} className="text-emerald-500 animate-pulse ml-2 flex-shrink-0" />} {isLoading && !errorMsg && <Zap size={14} className="text-amber-500 animate-pulse ml-2 flex-shrink-0" />} {isHandsFree && !isPlaying && !isLoading && !errorMsg && <Mic size={14} className="text-red-500 animate-pulse ml-2 flex-shrink-0" />} </div> </div> {/* Input Texto / Log */} <textarea value={text} onChange={(e) => setText(e.target.value)} className="w-full bg-neutral-950/50 border border-neutral-700 rounded p-2 text-xs text-neutral-300 focus:outline-none focus:border-emerald-500 resize-none h-20" placeholder={isHandsFree ? "Escuchando transcripción en tiempo real..." : "Escribe texto directo o activa Manos Libres..."} readOnly={isHandsFree || isLoading} /> {/* Sliders continuos (controlan SSML en tiempo real) */} <div className="space-y-3 bg-neutral-950/30 p-3 rounded border border-neutral-800"> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Agresiva</span><span className="text-emerald-400">Dulzura [{dulzura}]</span><span>Dulce</span> </div> <input type="range" min="0" max="100" value={dulzura} onChange={(e)=>setDulzura(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-emerald-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Robótica</span><span className="text-pink-400">Aura [{sensualidad}]</span><span>Sensual</span> </div> <input type="range" min="0" max="100" value={sensualidad} onChange={(e)=>setSensualidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-pink-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Atenuada</span><span className="text-amber-400">Intensidad [{intensidad}]</span><span>Fuerte</span> </div> <input type="range" min="0" max="100" value={intensidad} onChange={(e)=>setIntensidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-amber-500 cursor-pointer" /> </div> </div> {/* Botones de Control */} <div className="flex flex-col sm:flex-row gap-2"> <button onClick={toggleHandsFree} disabled={isLoading} className={`flex-1 py-2 rounded text-xs font-bold flex items-center justify-center gap-2 transition-colors border ${ isHandsFree ? 'bg-red-900/20 text-red-400 border-red-900/50 hover:bg-red-900/40 shadow-[0_0_10px_rgba(239,68,68,0.2)]' : 'bg-indigo-900/20 text-indigo-400 border-indigo-900/50 hover:bg-indigo-900/40' }`} > {isHandsFree ? <MicOff size={14} /> : <Mic size={14} />} {isHandsFree ? 'Detener Escucha' : 'Manos Libres'} </button> <div className="flex gap-2 flex-1"> <button onClick={handleManualPlay} disabled={isLoading || isPlaying || isHandsFree} className="flex-1 bg-emerald-600/20 hover:bg-emerald-600/40 text-emerald-400 border border-emerald-600/50 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center gap-1 transition-colors" > {isLoading ? <Loader2 size={14} className="animate-spin" /> : <Play size={14} />} Sintetizar </button> <button onClick={stopAudio} disabled={!isPlaying && !isHandsFree} className="px-4 bg-neutral-800 hover:bg-neutral-700 text-neutral-400 border border-neutral-700 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center transition-colors" > <Square size={14} /> </button> </div> </div> {/* Botón para limpiar caché (opcional) */} <div className="text-right"> <button onClick={() => audioCache.clear()} className="text-[8px] text-neutral-600 hover:text-neutral-400 underline" > limpiar caché de audio </button> </div> </div> ); }; // --- ENTORNO ESCRITORIO (sin cambios) --- export default function App() { const [widgets, setWidgets] = useState({ voice: { isOpen: true, pos: { x: window.innerWidth > 768 ? window.innerWidth / 2 - 170 : 20, y: 40 } } }); const toggleWidget = (id) => { setWidgets(prev => ({ ...prev, [id]: { ...prev[id], isOpen: !prev[id].isOpen } })); }; return ( <div className="w-full h-screen bg-neutral-950 bg-[radial-gradient(ellipse_80%_80%_at_50%_-20%,rgba(16,185,129,0.1),rgba(0,0,0,1))] overflow-hidden relative font-sans text-neutral-200"> <div className="absolute inset-0 flex items-center justify-center opacity-[0.02] pointer-events-none"><Settings2 size={500} /></div> {widgets.voice.isOpen && ( <DraggableWidget title="MODULADOR VOCAL KORE" icon={Zap} initialPos={widgets.voice.pos} onClose={() => toggleWidget('voice')}> <VoiceModulatorWidget /> </DraggableWidget> )} <div className="absolute bottom-6 left-1/2 transform -translate-x-1/2 bg-neutral-900/80 backdrop-blur-md border border-neutral-700/50 p-2 rounded-2xl shadow-2xl flex gap-2 z-[100]"> <div className="px-3 flex items-center border-r border-neutral-700/50 text-neutral-500"><LayoutGrid size={20} /></div> <button onClick={() => toggleWidget('voice')} className={`px-4 py-2 rounded-xl flex items-center gap-2 text-sm font-medium transition-all ${
"A bold text-only design for a t-shirt. The text says 'Dream Big, Work Hard' in a dynamic, modern font. The design uses a clean layout with high contrast colors, such as white text on a black background or vibrant neon text on a dark base. The font is a mix of bold and cursive styles, with emphasis on 'Dream' and 'Hard' in a larger, more decorative style. The text is centered, well-spaced, and visually striking, optimized for t-shirt printing with no graphics or additional elements, just the words." ar 4500:5400
Create a group image featuring multiple digital cartoon characters. Each character should have a high-quality semi-3D polished cartoon style with stylized but realistic facial feature exaggeration. Keep each face clearly recognizable, with varied expressions, hairstyles, and skin tones. Smooth surfaces, soft lighting, subtle depth, and a premium cartoon finish. Arrange the characters in a clean, balanced grid or collage composition. Use a clean, simple background with enough empty space for text. Add large, bold, highly readable text that says: "AI Cartoon Maker tool". Place the text in a clear area (top or center) with strong contrast against the background. Use a modern sans-serif font style, solid color, no distortion, no effects that reduce readability. Ensure the text is clearly legible at small thumbnail sizes. No hand-drawn textures. No pencil or sketch effects. No logos, no watermarks. Dont repeat faces
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details
Image Type: Photorealistic Setting: A modern gym or dojo with clean, polished floors and minimal background distractions, conveying a professional and focused training environment. Main Subjects: A Brazilian Jiu-Jitsu athlete in a custom-designed gi. The athlete is in motion, executing a technique on the mat, showing off the vibrant and unique design of the gi. The design should be intricate and personalized, with bold colors. Text Placement & Style: Place the text "Customize Your Gear" in bold, clear white or bright color at the bottom or top of the thumbnail. Make sure the text stands out against the background with high contrast for readability. Overall Mood: Motivational and focused, emphasizing the performance-enhancing effect of personalized gear.
Main "World's Best Prompt Master" ke roop mein, maine Instagram, Facebook aur Websites par top performing diesel engine aur generator posts ka deep analysis kiya hai. Analysis of Top Performers (The Generator Wale Niche): Color Psychology: Top brands (jaise Cummins, Caterpillar, Sudhir Power) hamesha Safety Yellow, Black, aur White use karte hain. Ye colors "Caution," "Power," aur "Trust" signify karte hain. Imagery: "Action shots" (mechanic repairing) aur "Product Hero shots" (chamakta hua generator) sabse zyada convert hote hain. Text Strategy: Text hamesha BOLD aur Clean hota hai. Curly fonts ya fancy likhai is industry mein "weak" maani jaati hai. Aapko Editable Post chahiye. Isliye main aapko 2 alag-alag prompts de raha hoon. Pehla prompt Design/Layout ke liye (Canva Search Bar ke liye), aur doosra High-Quality Background Image ke liye (Canva Magic Media ke liye). 🟢 OPTION 1: The "All-in-One" Template Prompt (Is prompt ko Canva ke Home Page Search Bar mein copy-paste karein. Magic Media mein nahi.) "Create a professional Instagram Post Template for a Diesel Engine Sales & Service brand. Theme: Industrial, Heavy-Duty, and Trustworthy. Color Palette: Use High-Contrast Safety Yellow (#FFD700), Dark Charcoal (#1A1A1A), and White. Layout: Split screen or clean overlay. Visuals: Include a placeholder for a heavy diesel generator or a technician in safety gear. Text Structure: Create distinct, editable text boxes for a bold Headline ('POWER WHEN YOU NEED IT'), a Sub-headline ('Sales | Service | AMC'), and a CTA Button ('Call Now'). Font Style: Use strong, sans-serif fonts like 'Anton' or 'Roboto Condensed' to convey strength. Ensure the text is not flattened into the image.
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details, align correctly, text in the middle and straight to the pov,
Create a 30-second promotional video in a professional marketing style for a mobile phone repair training course. Language & Voiceover: Voiceover in Egyptian Arabic dialect Clear, confident male voice Add on-screen captions (Arabic) synced with the voiceover 🎥 Scene Breakdown Scene 1 (0:00 - 0:05) – Hook Visual: Quick shot of a broken smartphone or a device not working. A frustrated person trying to turn it on. Voiceover: "عارف إن فيه ناس بتدفع آلاف عشان تصليح أعطال تافهة في موبايلاتها؟" Captions: Same text appears bold in center Scene 2 (0:05 - 0:15) – Problem & Solution Visual: Professional close-up shots of opening a phone using repair tools (screwdrivers, multimeter, hot air gun). Fast montage of fixing screen or charging port. Voiceover: "لو معندكش شغل أو عايز تزود دخلك، الفيديو ده ليك.. مجال صيانة الموبايلات مش محتاج منك شهادة ولا سنين خبرة، محتاج بس تتعلم الصح." Captions: Highlight key phrases dynamically Scene 3 (0:15 - 0:25) – Course Offer Visual: Clean shots of tools, workspace, or learning environment On-screen text (center, bold): "30 يوم بس – من الصفر للاحتراف" Voiceover: "أنا بقدم لك كورس صيانة موبايل شامل، هعلمك فيه من الصفر خطوة بخطوة إزاي تشخص العطل وتصلحه بإيدك.. وفي خلال 30 يوم بس، هتكون جاهز تبدأ وتكسب فلوس." Add subtle motion graphics Scene 4 (0:25 - 0:30) – Call to Action Visual: Confident person looking at camera, pointing down Voiceover: "مستني إيه؟ ابعت كلمة (ابدأ) دلوقتي في الكومنتات أو الرسائل وهبعتلك كل التفاصيل." Captions: Emphasize "ابدأ" ⚙️ Video Settings Style: Social media ad (TikTok / Reels / Shorts) Lighting: Bright (ring light or natural light) Music: Light motivational business background music Text: Large, bold, centered captions Quality: HD or 4K Camera: Multiple angles + fast-paced editing Transitions: Smooth, quick, engaging cuts 💡 AI Notes Emphasize professional repair tools (screwdrivers, multimeter, hot air gun) Keep pacing fast and attention-grabbing Make visuals feel modern and clean Optimize for vertical video (9:16) If you want, I can also turn this into: Script for ElevenLabs voiceover CapCut editing template Shot list + exact camera angles
Make a mafia boss with the face of input image 1 with mafia hat holding with two hands a doner kebab wrapped in his hands and he has a smile. Display text for the mascot logo should be like Godfather text style similar bold text. Color scheme. Black, Red, white. Logo text should say: KEBABOSS
Cartoon illustration, comic book cover featuring a handsome Caucasian man with burst-taper grey hair, wearing a white t-shirt and blue jeans, texting with his blue iPhone, a bold heading text in the background reads "PHONE" in huge bold sharp IMPACT white letters, in the top of the frame, occupying the whole frame, gta art style, gta 5 comics art, gta cover 2d game art, gta cover 2d game art, gta iv art style, rotoscoping, gta art style, gta v artwork style, gangsta rap
Style: Printed T-Shirt Design The design should be highly realistic and captivating, focusing on showcasing a Print on Demand store specializing in movie-themed apparel. At the center of the scene, prominently feature a premium T-shirt laid out naturally on a minimalist chair. The T-shirt should display the text “watchfreemovies247 SHOP” in bold, clean, and clear typography, with sharp lines to give a professional, eye-catching effect. The text should immediately communicate a sense of quality and clarity, emphasizing the store’s movie-themed focus. Key Elements: Main T-Shirt Display: Place the central T-shirt on a modern, sleek chair, positioned naturally and without a person wearing it. The text “watchfreemovies247 SHOP” should be the focal point, printed clearly on the front of the T-shirt. The font must be easy to read, bold, and sharp, standing out against the fabric. The design should have a cinematic feel, subtly tying into the theme of movies and film culture. Additional T-Shirts and Graphic Elements: Surround the main T-shirt with several other shirts featuring creative, eye-catching cinematic graphic designs. These designs can include movie-related imagery such as film reels, directors’ clapperboards, iconic movie quotes, and other recognizable film visuals. The shirts should be displayed in a professional and organized manner, whether folded neatly, hanging, or draped across nearby props. Each shirt should have a different movie-themed graphic design to show the variety and creative possibilities offered by the store. Film-Themed Props and Background: Incorporate film-related props into the scene to enhance the cinematic atmosphere. These could include vintage film cameras, popcorn tubs, film reels, and director’s chairs. The props should be subtly placed around the scene, contributing to the overall theme without overshadowing the main T-shirt. The background should evoke a movie theater or film studio ambiance, with soft lighting and a cinematic glow that highlights the shirts and props. Professional Presentation: Ensure that the scene feels polished, well-organized, and professional. The design should communicate clearly that this is a Print on Demand store catering to film and movie enthusiasts. Arrange the shirts and props in a way that feels cohesive, yet dynamic, giving the viewer the impression that they are browsing a curated selection of unique, movie-themed apparel. Lighting and Color Scheme: Use warm, cinematic lighting to create depth and draw attention to the T-shirts. Incorporate a palette of rich, dark neutrals, with accents of golds, reds, and subtle lighting highlights to evoke the ambiance of a classic movie scene. The lighting should add a sense of dimension and make the central T-shirt the focal point while maintaining a balanced and inviting atmosphere. Final Vision: The completed design should instantly communicate that this is a professional Print on Demand store for movie lovers. The main T-shirt should stand out clearly with its sharp, bold text, while the surrounding shirts and cinematic props reinforce the theme. The scene should feel inviting, creative, and expertly arranged, capturing the essence of a store dedicated to passionate movie fans looking for unique, high-quality apparel. The overall layout must be realistic, visually striking, and professional, creating a sense of excitement and engagement with the viewer.
Cartoon brain character relaxing in a hammock between large daisies, text "TRUST IN THE LORD" in a bold, bubble-lettered style, text "with all your heart" underneath, retro style, soft pastel colors, bold outlines, whimsical design, simple graphic elements, daisies with detailed white petals, light beige background, detailed illustration of the brain character with large, expressive eyes, light pink brain with simple arms and legs, character wearing boots, hammock in a light teal or blue color, simple, clear lines, flat design, cute and inspirational, illustration style.
Кадр 11: Радужный макро-взгляд (Prismatic Macro Eye) Prompt: Extreme macro close-up of a young woman's eye looking directly at the camera. A sharp, narrow rainbow light spectrum from a prism projector cuts vertically across her pupil and cheek. 100% facial feature retention of Aisha Dosma, dark wavy hair, brown eyes. Hyper-realistic skin texture with visible pores and slight moisture. Sharp focus on eyelashes and iris. High-contrast lighting (chiaroscuro), deep shadows. Film grain, 85mm f/1.4 lens aesthetics. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 12: Макро-диалог с тенью (Macro Shadow Dialogue) Prompt: Extreme close-up profile of the lower face (nose, lips, chin) of a woman with 100% likeness to Aisha Dosma. Strong side lighting from a projector creating a dramatic chiaroscuro effect. On the concrete wall behind her, a large, sharp shadow of her profile is projected, overlapping with abstract light patterns. Wet lip gloss texture, satin skin finish. Dark cinematic atmosphere, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 13: Призматический макро-взгляд (Prismatic Macro Gaze) Prompt: Extreme macro shot of one eye of Aisha Dosma. Prismatic refraction creates a vibrant, detailed rainbow spectrum across the iris and eyelashes. Reflective catchlight from the projector in the pupil. Hyper-realistic wet skin texture with micro-droplets of makeup. Perfect 1:1 similarity of eye shape and eyebrow. Moody, dark background, intense cinematic lighting. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 14: Влажный блеск и проекция на губах (Macro Luminescent Lips) Prompt: Extreme macro close-up of the lips and chin of Aisha Dosma. The lips are covered in heavy, ultra-glossy clear lip gloss resembling liquid glass. Small, brilliant light specks and glints from a projector reflect on the glossy surface. An abstract geometric light pattern is projected onto the surrounding matte skin. Extreme detail, visible skin relief. Cinematic noir lighting, grainy film texture. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 15: Текстура волос и преломленная проекция (Macro Hair Bun) Prompt: Medium close-up of the back of the head and neck of Aisha Dosma. A messy high bun with curly strands. A projector shines through a prism directly onto the hair, creating a complex, kaleidoscopic rainbow refraction pattern on the hair texture and the concrete wall behind. Sharp focus on individual hair strands and light catchers in the curls. Dark, mysterious atmosphere. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 16: Сдвиг фокуса и проекция на коже (Patterned Reflection) Prompt: Medium shot of Aisha Dosma from behind, looking over her shoulder. Shallow depth of field. The focus is sharp on a concrete wall where a large, clear projection of her own face is displayed. Aisha herself is in the foreground, blurred (deep bokeh). On her blurred back and shoulder, an abstract light pattern from the projector is visible. Dark dress, cinematic lighting, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 17: Макро-взгляд (The Prismatic Double Gaze) Prompt: Extreme macro close-up of both eyes of Aisha Dosma, looking straight into the lens. 100% facial similarity. A complex prismatic light pattern scatters multiple spectral spots and rainbow flares across her forehead, eyes, and bridge of the nose. Sharp focus on the moist texture of the eyes and long eyelashes. Dark, moody background, intense cinematic chiaroscuro. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA".
vintage patriotic t-shirt design, centered layout, Puerto Rican flag in the middle with blue triangle and white star on the left and red and white horizontal stripes, distressed vintage texture, bold retro typography, top text "MY GIRLFRIEND IS" in Bebas Neue style condensed font, large center text "PUERTO RICAN" in heavy Anton style bold font, bottom text "NOTHING SCARES ME" in Oswald bold style font, clean centered composition, patriotic humor design, slightly grunge worn effect, screen print vector style, high contrast, professional t-shirt graphic, transparent background, no mockup, no model
Style: Printed T-Shirt Design The design should be highly realistic and captivating, focusing on showcasing a Print on Demand store specializing in movie-themed apparel. At the center of the scene, prominently feature a premium T-shirt laid out naturally on a minimalist chair. The T-shirt should display the text “watchfreemovies247 SHOP” in bold, clean, and clear typography, with sharp lines to give a professional, eye-catching effect. The text should immediately communicate a sense of quality and clarity, emphasizing the store’s movie-themed focus. Key Elements: Main T-Shirt Display: Place the central T-shirt on a modern, sleek chair, positioned naturally and without a person wearing it. The text “watchfreemovies247 SHOP” should be the focal point, printed clearly on the front of the T-shirt. The font must be easy to read, bold, and sharp, standing out against the fabric. The design should have a cinematic feel, subtly tying into the theme of movies and film culture. Additional T-Shirts and Graphic Elements: Surround the main T-shirt with several other shirts featuring creative, eye-catching cinematic graphic designs. These designs can include movie-related imagery such as film reels, directors’ clapperboards, iconic movie quotes, and other recognizable film visuals. The shirts should be displayed in a professional and organized manner, whether folded neatly, hanging, or draped across nearby props. Each shirt should have a different movie-themed graphic design to show the variety and creative possibilities offered by the store. Film-Themed Props and Background: Incorporate film-related props into the scene to enhance the cinematic atmosphere. These could include vintage film cameras, popcorn tubs, film reels, and director’s chairs. The props should be subtly placed around the scene, contributing to the overall theme without overshadowing the main T-shirt. The background should evoke a movie theater or film studio ambiance, with soft lighting and a cinematic glow that highlights the shirts and props. Professional Presentation: Ensure that the scene feels polished, well-organized, and professional. The design should communicate clearly that this is a Print on Demand store catering to film and movie enthusiasts. Arrange the shirts and props in a way that feels cohesive, yet dynamic, giving the viewer the impression that they are browsing a curated selection of unique, movie-themed apparel. Lighting and Color Scheme: Use warm, cinematic lighting to create depth and draw attention to the T-shirts. Incorporate a palette of rich, dark neutrals, with accents of golds, reds, and subtle lighting highlights to evoke the ambiance of a classic movie scene. The lighting should add a sense of dimension and make the central T-shirt the focal point while maintaining a balanced and inviting atmosphere. Final Vision: The completed design should instantly communicate that this is a professional Print on Demand store for movie lovers. The main T-shirt should stand out clearly with its sharp, bold text, while the surrounding shirts and cinematic props reinforce the theme. The scene should feel inviting, creative, and expertly arranged, capturing the essence of a store dedicated to passionate movie fans looking for unique, high-quality apparel. The overall layout must be realistic, visually striking, and professional, creating a sense of excitement and engagement with the viewer.
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details
Image Type: Photorealistic Setting: A modern gym or dojo with clean, polished floors and minimal background distractions, conveying a professional and focused training environment. Main Subjects: A Brazilian Jiu-Jitsu athlete in a custom-designed gi. The athlete is in motion, executing a technique on the mat, showing off the vibrant and unique design of the gi. The design should be intricate and personalized, with bold colors. Text Placement & Style: Place the text "Customize Your Gear" in bold, clear white or bright color at the bottom or top of the thumbnail. Make sure the text stands out against the background with high contrast for readability. Overall Mood: Motivational and focused, emphasizing the performance-enhancing effect of personalized gear.
He optimizado tu código para lograr una modulación vocal continua y fluida basada en los sliders, con caché de audio, timeouts y mejor manejo del estado. Ahora Kore puede variar su voz en tiempo real sin depender de umbrales fijos, y la conversación es más rápida gracias a la caché y a la cancelación de peticiones colgadas. ```javascript import React, { useState, useRef, useEffect, useCallback } from 'react'; import { Play, Square, Mic, MicOff, Settings2, Activity, Loader2, X, GripHorizontal, LayoutGrid, Zap, AlertCircle } from 'lucide-react'; // --- CONSTANTES --- const SILENT_WAV = "data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"; const TTS_TIMEOUT = 5000; // 5 segundos máximo para la síntesis const DEFAULT_API_KEY = 'AIzaSyBlkvy_Op-XlzSMSDDl9ip42dMFZX28MAA'; // ⚠️ Cámbiala por tu propia clave // --- UTILIDADES --- const base64ToWavBlob = (base64Data, sampleRate = 24000) => { const binaryString = window.atob(base64Data); const pcmData = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) pcmData[i] = binaryString.charCodeAt(i); const numChannels = 1; const bitsPerSample = 16; const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmData.length; const buffer = new ArrayBuffer(44 + dataSize); const view = new DataView(buffer); const writeString = (view, offset, string) => { for (let i = 0; i < string.length; i++) view.setUint8(offset + i, string.charCodeAt(i)); }; writeString(view, 0, 'RIFF'); view.setUint32(4, 36 + dataSize, true); writeString(view, 8, 'WAVE'); writeString(view, 12, 'fmt '); view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, numChannels, true); view.setUint32(24, sampleRate, true); view.setUint32(28, byteRate, true); view.setUint16(32, blockAlign, true); view.setUint16(34, bitsPerSample, true); writeString(view, 36, 'data'); view.setUint32(40, dataSize, true); for (let i = 0; i < dataSize; i++) view.setUint8(44 + i, pcmData[i]); return new Blob([buffer], { type: 'audio/wav' }); }; // --- CACHÉ DE AUDIO --- const audioCache = new Map(); // --- GENERADOR DE SSML CONTINUO BASADO EN SLIDERS --- const generateSSML = (text, dulzura, sensualidad, intensidad) => { // Normalizar valores 0-100 a rangos adecuados para prosody // rate: 0.5 a 2.0 (1.0 es normal) const rate = 0.8 + (intensidad / 100) * 1.2; // 0.8 (lento) a 2.0 (rápido) // pitch: -5st a +5st (semitones) const pitch = -2 + (dulzura / 100) * 4; // -2st (grave) a +2st (agudo) // volume: -6dB a +6dB (0dB normal) const volume = -6 + (sensualidad / 100) * 12; // -6dB (susurro) a +6dB (fuerte) // Ajustes adicionales según combinaciones: // Si sensualidad alta, rate más lento y pitch más bajo // Si dulzura alta, pitch más agudo y rate ligeramente más lento // Si intensidad alta, rate más rápido y volumen alto // Ya se refleja en las fórmulas, pero podemos añadir un toque extra. const ssml = `<speak> <prosody rate="${rate.toFixed(2)}" pitch="${pitch.toFixed(0)}st" volume="${volume.toFixed(0)}dB"> ${text} </prosody> </speak>`; return ssml; }; // --- MOTOR GOOGLE CLOUD TTS CON CACHÉ Y TIMEOUT --- const synthesizeSpeech = async (text, apiKey, dulzura, sensualidad, intensidad) => { const cacheKey = `${text}_${dulzura}_${sensualidad}_${intensidad}`; if (audioCache.has(cacheKey)) { console.log('🎯 Usando audio cacheado'); return audioCache.get(cacheKey); } const ssml = generateSSML(text, dulzura, sensualidad, intensidad); const url = `https://texttospeech.googleapis.com/v1/text:synthesize?key=${apiKey}`; const body = { input: { ssml }, voice: { languageCode: 'es-ES', name: 'es-ES-Neural2-F', ssmlGender: 'FEMALE' }, audioConfig: { audioEncoding: 'LINEAR16', sampleRateHertz: 24000 } }; const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), TTS_TIMEOUT); try { const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal: controller.signal }); clearTimeout(timeoutId); if (!res.ok) throw new Error(`TTS error: ${res.status}`); const data = await res.json(); audioCache.set(cacheKey, data.audioContent); return data.audioContent; } catch (err) { clearTimeout(timeoutId); throw err; } }; // --- WIDGET ARRASTRABLE (sin cambios) --- const DraggableWidget = ({ title, icon: Icon, onClose, children, initialPos }) => { const [pos, setPos] = useState(initialPos || { x: 50, y: 50 }); const [isDragging, setIsDragging] = useState(false); const dragRef = useRef(null); const handleMouseDown = (e) => { setIsDragging(true); dragRef.current = { startX: e.clientX, startY: e.clientY, initialX: pos.x, initialY: pos.y }; }; const handleMouseMove = (e) => { if (!isDragging) return; setPos({ x: Math.max(0, dragRef.current.initialX + (e.clientX - dragRef.current.startX)), y: Math.max(0, dragRef.current.initialY + (e.clientY - dragRef.current.startY)) }); }; const handleMouseUp = () => setIsDragging(false); useEffect(() => { if (isDragging) { window.addEventListener('mousemove', handleMouseMove); window.addEventListener('mouseup', handleMouseUp); } return () => { window.removeEventListener('mousemove', handleMouseMove); window.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging]); return ( <div style={{ left: `${pos.x}px`, top: `${pos.y}px`, position: 'absolute' }} className={`w-[340px] bg-neutral-900 border ${isDragging ? 'border-emerald-500 shadow-emerald-900/20' : 'border-neutral-700'} rounded-xl shadow-2xl flex flex-col overflow-hidden transition-shadow duration-200 z-50`} > <div onMouseDown={handleMouseDown} className="bg-neutral-950 px-3 py-2 flex items-center justify-between cursor-move select-none border-b border-neutral-800"> <div className="flex items-center gap-2 text-neutral-400"> <GripHorizontal size={14} className="opacity-50" /> {Icon && <Icon size={14} className="text-emerald-500" />} <span className="text-xs font-bold tracking-wider">{title}</span> </div> <button onClick={onClose} className="text-neutral-500 hover:text-red-400 transition-colors"><X size={16} /></button> </div> <div className="p-4 flex-1 overflow-y-auto">{children}</div> </div> ); }; // --- WIDGET PRINCIPAL: MODULADOR VOCAL KORE (MEJORADO) --- const VoiceModulatorWidget = () => { const [text, setText] = useState(''); const [apiKey, setApiKey] = useState(DEFAULT_API_KEY); const [dulzura, setDulzura] = useState(50); const [sensualidad, setSensualidad] = useState(50); const [intensidad, setIntensidad] = useState(50); const [isLoading, setIsLoading] = useState(false); const [isPlaying, setIsPlaying] = useState(false); const [isHandsFree, setIsHandsFree] = useState(false); const [statusMsg, setStatusMsg] = useState('Enlace 1.5 Flash + GCP TTS Establecido.'); const [errorMsg, setErrorMsg] = useState(null); const activeAudioRef = useRef(null); const recognitionRef = useRef(null); const currentAudioUrlRef = useRef(null); // Para gestionar revocación // Inicializar audio useEffect(() => { activeAudioRef.current = new Audio(); activeAudioRef.current.preload = "auto"; return () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } } if (recognitionRef.current) recognitionRef.current.stop(); }; }, []); // Configurar reconocimiento de voz useEffect(() => { if (!('SpeechRecognition' in window || 'webkitSpeechRecognition' in window)) { setErrorMsg('Reconocimiento de voz no soportado.'); return; } const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; recognitionRef.current = new SpeechRecognition(); recognitionRef.current.lang = 'es-ES'; recognitionRef.current.interimResults = false; recognitionRef.current.continuous = false; recognitionRef.current.onresult = async (event) => { const transcript = event.results[0][0].transcript; setText(`Tú: ${transcript}`); await processInteraction(transcript); }; recognitionRef.current.onerror = (event) => { if (event.error !== 'no-speech') { setErrorMsg(`Micrófono: ${event.error}`); setIsHandsFree(false); } }; recognitionRef.current.onend = () => { if (isHandsFree && !isPlaying && !isLoading) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; // Limpiar al desmontar return () => { if (recognitionRef.current) recognitionRef.current.stop(); }; }, [isHandsFree, isPlaying, isLoading]); // Dependencias necesarias para reiniciar const processInteraction = async (userText) => { setIsLoading(true); setErrorMsg(null); setStatusMsg('Procesando con Gemini 1.5 Flash...'); const key = apiKey.trim(); try { // 1. Llamada a Gemini con timeout const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 5000); const payloadText = { contents: [{ parts: [{ text: userText }] }], systemInstruction: { parts: [{ text: `Eres Kore, 28 años, Huesca. Labia, directa, sensual, disruptiva. Responde en español, máx 20 palabras. REGLA INNEGOCIABLE: CERO PREGUNTAS.` }] } }; const resText = await fetch( `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${key}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payloadText), signal: controller.signal } ); clearTimeout(timeoutId); if (!resText.ok) throw new Error(`Gemini error: ${resText.status}`); const dataText = await resText.json(); const aiText = dataText.candidates?.[0]?.content?.parts?.[0]?.text || "Mmm... vale."; setText(`Kore: ${aiText}`); // 2. Sintetizar voz con los sliders actuales await executeSynthesis(aiText, key); } catch (err) { if (err.name === 'AbortError') { setErrorMsg('Gemini timeout (5s)'); } else { setErrorMsg(err.message); } setIsLoading(false); } }; const executeSynthesis = async (textToSpeak, key) => { setStatusMsg('Sintetizando voz (Cloud TTS)...'); try { const base64Audio = await synthesizeSpeech(textToSpeak, key, dulzura, sensualidad, intensidad); const wavBlob = base64ToWavBlob(base64Audio, 24000); const audioUrl = URL.createObjectURL(wavBlob); // Revocar URL anterior si existe if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } currentAudioUrlRef.current = audioUrl; activeAudioRef.current.src = audioUrl; activeAudioRef.current.onended = () => { setIsPlaying(false); setStatusMsg('Transmisión completada.'); if (isHandsFree) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; setStatusMsg('Transmitiendo...'); setIsPlaying(true); setIsLoading(false); await activeAudioRef.current.play().catch(err => { throw new Error(`Autoplay bloqueado: ${err.message}`); }); } catch (error) { throw new Error(`Fallo TTS: ${error.message}`); } }; const handleManualPlay = async () => { if (!text.trim()) return setErrorMsg('Escribe algo primero.'); // Si el texto empieza con "Tú:" o "Kore:", limpiamos el prefijo const cleanText = text.replace(/^(Tú:|Kore:)\s*/, ''); if (!cleanText.trim()) return setErrorMsg('Texto vacío después de limpiar.'); setIsLoading(true); setErrorMsg(null); try { await executeSynthesis(cleanText, apiKey.trim()); } catch (err) { setErrorMsg(err.message); setIsLoading(false); } }; const toggleHandsFree = () => { if (!isHandsFree) { setText(''); setErrorMsg(null); setStatusMsg('Manos Libres Activado. Habla...'); // Desbloquear audio en algunos navegadores if (activeAudioRef.current) { activeAudioRef.current.src = SILENT_WAV; activeAudioRef.current.play().catch(() => {}); } try { recognitionRef.current.start(); } catch (e) {} } else { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Sistemas en pausa.'); if (recognitionRef.current) recognitionRef.current.stop(); } setIsHandsFree(!isHandsFree); }; const stopAudio = () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Señal interrumpida.'); }; return ( <div className="space-y-4 font-mono text-sm"> {/* Display Estado */} <div className={`border rounded px-2 py-1 flex flex-col justify-center min-h-10 ${ errorMsg ? 'bg-red-950/50 border-red-900' : isHandsFree ? 'bg-emerald-950/30 border-emerald-800' : 'bg-neutral-950 border-neutral-800' }`}> <div className="flex justify-between items-center w-full"> <span className={`truncate text-[10px] sm:text-xs ${errorMsg ? 'text-red-500' : 'text-emerald-500'}`}> > {errorMsg || statusMsg} </span> {isPlaying && !errorMsg && <Activity size={14} className="text-emerald-500 animate-pulse ml-2 flex-shrink-0" />} {isLoading && !errorMsg && <Zap size={14} className="text-amber-500 animate-pulse ml-2 flex-shrink-0" />} {isHandsFree && !isPlaying && !isLoading && !errorMsg && <Mic size={14} className="text-red-500 animate-pulse ml-2 flex-shrink-0" />} </div> </div> {/* Input Texto / Log */} <textarea value={text} onChange={(e) => setText(e.target.value)} className="w-full bg-neutral-950/50 border border-neutral-700 rounded p-2 text-xs text-neutral-300 focus:outline-none focus:border-emerald-500 resize-none h-20" placeholder={isHandsFree ? "Escuchando transcripción en tiempo real..." : "Escribe texto directo o activa Manos Libres..."} readOnly={isHandsFree || isLoading} /> {/* Sliders continuos (controlan SSML en tiempo real) */} <div className="space-y-3 bg-neutral-950/30 p-3 rounded border border-neutral-800"> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Agresiva</span><span className="text-emerald-400">Dulzura [{dulzura}]</span><span>Dulce</span> </div> <input type="range" min="0" max="100" value={dulzura} onChange={(e)=>setDulzura(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-emerald-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Robótica</span><span className="text-pink-400">Aura [{sensualidad}]</span><span>Sensual</span> </div> <input type="range" min="0" max="100" value={sensualidad} onChange={(e)=>setSensualidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-pink-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Atenuada</span><span className="text-amber-400">Intensidad [{intensidad}]</span><span>Fuerte</span> </div> <input type="range" min="0" max="100" value={intensidad} onChange={(e)=>setIntensidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-amber-500 cursor-pointer" /> </div> </div> {/* Botones de Control */} <div className="flex flex-col sm:flex-row gap-2"> <button onClick={toggleHandsFree} disabled={isLoading} className={`flex-1 py-2 rounded text-xs font-bold flex items-center justify-center gap-2 transition-colors border ${ isHandsFree ? 'bg-red-900/20 text-red-400 border-red-900/50 hover:bg-red-900/40 shadow-[0_0_10px_rgba(239,68,68,0.2)]' : 'bg-indigo-900/20 text-indigo-400 border-indigo-900/50 hover:bg-indigo-900/40' }`} > {isHandsFree ? <MicOff size={14} /> : <Mic size={14} />} {isHandsFree ? 'Detener Escucha' : 'Manos Libres'} </button> <div className="flex gap-2 flex-1"> <button onClick={handleManualPlay} disabled={isLoading || isPlaying || isHandsFree} className="flex-1 bg-emerald-600/20 hover:bg-emerald-600/40 text-emerald-400 border border-emerald-600/50 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center gap-1 transition-colors" > {isLoading ? <Loader2 size={14} className="animate-spin" /> : <Play size={14} />} Sintetizar </button> <button onClick={stopAudio} disabled={!isPlaying && !isHandsFree} className="px-4 bg-neutral-800 hover:bg-neutral-700 text-neutral-400 border border-neutral-700 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center transition-colors" > <Square size={14} /> </button> </div> </div> {/* Botón para limpiar caché (opcional) */} <div className="text-right"> <button onClick={() => audioCache.clear()} className="text-[8px] text-neutral-600 hover:text-neutral-400 underline" > limpiar caché de audio </button> </div> </div> ); }; // --- ENTORNO ESCRITORIO (sin cambios) --- export default function App() { const [widgets, setWidgets] = useState({ voice: { isOpen: true, pos: { x: window.innerWidth > 768 ? window.innerWidth / 2 - 170 : 20, y: 40 } } }); const toggleWidget = (id) => { setWidgets(prev => ({ ...prev, [id]: { ...prev[id], isOpen: !prev[id].isOpen } })); }; return ( <div className="w-full h-screen bg-neutral-950 bg-[radial-gradient(ellipse_80%_80%_at_50%_-20%,rgba(16,185,129,0.1),rgba(0,0,0,1))] overflow-hidden relative font-sans text-neutral-200"> <div className="absolute inset-0 flex items-center justify-center opacity-[0.02] pointer-events-none"><Settings2 size={500} /></div> {widgets.voice.isOpen && ( <DraggableWidget title="MODULADOR VOCAL KORE" icon={Zap} initialPos={widgets.voice.pos} onClose={() => toggleWidget('voice')}> <VoiceModulatorWidget /> </DraggableWidget> )} <div className="absolute bottom-6 left-1/2 transform -translate-x-1/2 bg-neutral-900/80 backdrop-blur-md border border-neutral-700/50 p-2 rounded-2xl shadow-2xl flex gap-2 z-[100]"> <div className="px-3 flex items-center border-r border-neutral-700/50 text-neutral-500"><LayoutGrid size={20} /></div> <button onClick={() => toggleWidget('voice')} className={`px-4 py-2 rounded-xl flex items-center gap-2 text-sm font-medium transition-all ${
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details, align correctly, text in the middle and straight to the pov,
Main "World's Best Prompt Master" ke roop mein, maine Instagram, Facebook aur Websites par top performing diesel engine aur generator posts ka deep analysis kiya hai. Analysis of Top Performers (The Generator Wale Niche): Color Psychology: Top brands (jaise Cummins, Caterpillar, Sudhir Power) hamesha Safety Yellow, Black, aur White use karte hain. Ye colors "Caution," "Power," aur "Trust" signify karte hain. Imagery: "Action shots" (mechanic repairing) aur "Product Hero shots" (chamakta hua generator) sabse zyada convert hote hain. Text Strategy: Text hamesha BOLD aur Clean hota hai. Curly fonts ya fancy likhai is industry mein "weak" maani jaati hai. Aapko Editable Post chahiye. Isliye main aapko 2 alag-alag prompts de raha hoon. Pehla prompt Design/Layout ke liye (Canva Search Bar ke liye), aur doosra High-Quality Background Image ke liye (Canva Magic Media ke liye). 🟢 OPTION 1: The "All-in-One" Template Prompt (Is prompt ko Canva ke Home Page Search Bar mein copy-paste karein. Magic Media mein nahi.) "Create a professional Instagram Post Template for a Diesel Engine Sales & Service brand. Theme: Industrial, Heavy-Duty, and Trustworthy. Color Palette: Use High-Contrast Safety Yellow (#FFD700), Dark Charcoal (#1A1A1A), and White. Layout: Split screen or clean overlay. Visuals: Include a placeholder for a heavy diesel generator or a technician in safety gear. Text Structure: Create distinct, editable text boxes for a bold Headline ('POWER WHEN YOU NEED IT'), a Sub-headline ('Sales | Service | AMC'), and a CTA Button ('Call Now'). Font Style: Use strong, sans-serif fonts like 'Anton' or 'Roboto Condensed' to convey strength. Ensure the text is not flattened into the image.
"A bold text-only design for a t-shirt. The text says 'Dream Big, Work Hard' in a dynamic, modern font. The design uses a clean layout with high contrast colors, such as white text on a black background or vibrant neon text on a dark base. The font is a mix of bold and cursive styles, with emphasis on 'Dream' and 'Hard' in a larger, more decorative style. The text is centered, well-spaced, and visually striking, optimized for t-shirt printing with no graphics or additional elements, just the words." ar 4500:5400
Cartoon illustration, comic book cover featuring a handsome Caucasian man with burst-taper grey hair, wearing a white t-shirt and blue jeans, texting with his blue iPhone, a bold heading text in the background reads "PHONE" in huge bold sharp IMPACT white letters, in the top of the frame, occupying the whole frame, gta art style, gta 5 comics art, gta cover 2d game art, gta cover 2d game art, gta iv art style, rotoscoping, gta art style, gta v artwork style, gangsta rap
Create a 30-second promotional video in a professional marketing style for a mobile phone repair training course. Language & Voiceover: Voiceover in Egyptian Arabic dialect Clear, confident male voice Add on-screen captions (Arabic) synced with the voiceover 🎥 Scene Breakdown Scene 1 (0:00 - 0:05) – Hook Visual: Quick shot of a broken smartphone or a device not working. A frustrated person trying to turn it on. Voiceover: "عارف إن فيه ناس بتدفع آلاف عشان تصليح أعطال تافهة في موبايلاتها؟" Captions: Same text appears bold in center Scene 2 (0:05 - 0:15) – Problem & Solution Visual: Professional close-up shots of opening a phone using repair tools (screwdrivers, multimeter, hot air gun). Fast montage of fixing screen or charging port. Voiceover: "لو معندكش شغل أو عايز تزود دخلك، الفيديو ده ليك.. مجال صيانة الموبايلات مش محتاج منك شهادة ولا سنين خبرة، محتاج بس تتعلم الصح." Captions: Highlight key phrases dynamically Scene 3 (0:15 - 0:25) – Course Offer Visual: Clean shots of tools, workspace, or learning environment On-screen text (center, bold): "30 يوم بس – من الصفر للاحتراف" Voiceover: "أنا بقدم لك كورس صيانة موبايل شامل، هعلمك فيه من الصفر خطوة بخطوة إزاي تشخص العطل وتصلحه بإيدك.. وفي خلال 30 يوم بس، هتكون جاهز تبدأ وتكسب فلوس." Add subtle motion graphics Scene 4 (0:25 - 0:30) – Call to Action Visual: Confident person looking at camera, pointing down Voiceover: "مستني إيه؟ ابعت كلمة (ابدأ) دلوقتي في الكومنتات أو الرسائل وهبعتلك كل التفاصيل." Captions: Emphasize "ابدأ" ⚙️ Video Settings Style: Social media ad (TikTok / Reels / Shorts) Lighting: Bright (ring light or natural light) Music: Light motivational business background music Text: Large, bold, centered captions Quality: HD or 4K Camera: Multiple angles + fast-paced editing Transitions: Smooth, quick, engaging cuts 💡 AI Notes Emphasize professional repair tools (screwdrivers, multimeter, hot air gun) Keep pacing fast and attention-grabbing Make visuals feel modern and clean Optimize for vertical video (9:16) If you want, I can also turn this into: Script for ElevenLabs voiceover CapCut editing template Shot list + exact camera angles
Cartoon brain character relaxing in a hammock between large daisies, text "TRUST IN THE LORD" in a bold, bubble-lettered style, text "with all your heart" underneath, retro style, soft pastel colors, bold outlines, whimsical design, simple graphic elements, daisies with detailed white petals, light beige background, detailed illustration of the brain character with large, expressive eyes, light pink brain with simple arms and legs, character wearing boots, hammock in a light teal or blue color, simple, clear lines, flat design, cute and inspirational, illustration style.
A front view 3d macro detailed illustration gaming WITH realistic colour logo with chrome, metal gold, steal, silver WHICH LOOKS REAL with front face texture photorealistic style with colour with a shooter, featuring the BIG AND BOLD text of SAM.D.COSTA and clear text of GAMING in bold letters. SIMILAR TO CALL OF DUTY THEME AND WAR BACKGROUND
Create a group image featuring multiple digital cartoon characters. Each character should have a high-quality semi-3D polished cartoon style with stylized but realistic facial feature exaggeration. Keep each face clearly recognizable, with varied expressions, hairstyles, and skin tones. Smooth surfaces, soft lighting, subtle depth, and a premium cartoon finish. Arrange the characters in a clean, balanced grid or collage composition. Use a clean, simple background with enough empty space for text. Add large, bold, highly readable text that says: "AI Cartoon Maker tool". Place the text in a clear area (top or center) with strong contrast against the background. Use a modern sans-serif font style, solid color, no distortion, no effects that reduce readability. Ensure the text is clearly legible at small thumbnail sizes. No hand-drawn textures. No pencil or sketch effects. No logos, no watermarks. Dont repeat faces
Make a mafia boss with the face of input image 1 with mafia hat holding with two hands a doner kebab wrapped in his hands and he has a smile. Display text for the mascot logo should be like Godfather text style similar bold text. Color scheme. Black, Red, white. Logo text should say: KEBABOSS
Кадр 11: Радужный макро-взгляд (Prismatic Macro Eye) Prompt: Extreme macro close-up of a young woman's eye looking directly at the camera. A sharp, narrow rainbow light spectrum from a prism projector cuts vertically across her pupil and cheek. 100% facial feature retention of Aisha Dosma, dark wavy hair, brown eyes. Hyper-realistic skin texture with visible pores and slight moisture. Sharp focus on eyelashes and iris. High-contrast lighting (chiaroscuro), deep shadows. Film grain, 85mm f/1.4 lens aesthetics. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 12: Макро-диалог с тенью (Macro Shadow Dialogue) Prompt: Extreme close-up profile of the lower face (nose, lips, chin) of a woman with 100% likeness to Aisha Dosma. Strong side lighting from a projector creating a dramatic chiaroscuro effect. On the concrete wall behind her, a large, sharp shadow of her profile is projected, overlapping with abstract light patterns. Wet lip gloss texture, satin skin finish. Dark cinematic atmosphere, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 13: Призматический макро-взгляд (Prismatic Macro Gaze) Prompt: Extreme macro shot of one eye of Aisha Dosma. Prismatic refraction creates a vibrant, detailed rainbow spectrum across the iris and eyelashes. Reflective catchlight from the projector in the pupil. Hyper-realistic wet skin texture with micro-droplets of makeup. Perfect 1:1 similarity of eye shape and eyebrow. Moody, dark background, intense cinematic lighting. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 14: Влажный блеск и проекция на губах (Macro Luminescent Lips) Prompt: Extreme macro close-up of the lips and chin of Aisha Dosma. The lips are covered in heavy, ultra-glossy clear lip gloss resembling liquid glass. Small, brilliant light specks and glints from a projector reflect on the glossy surface. An abstract geometric light pattern is projected onto the surrounding matte skin. Extreme detail, visible skin relief. Cinematic noir lighting, grainy film texture. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 15: Текстура волос и преломленная проекция (Macro Hair Bun) Prompt: Medium close-up of the back of the head and neck of Aisha Dosma. A messy high bun with curly strands. A projector shines through a prism directly onto the hair, creating a complex, kaleidoscopic rainbow refraction pattern on the hair texture and the concrete wall behind. Sharp focus on individual hair strands and light catchers in the curls. Dark, mysterious atmosphere. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 16: Сдвиг фокуса и проекция на коже (Patterned Reflection) Prompt: Medium shot of Aisha Dosma from behind, looking over her shoulder. Shallow depth of field. The focus is sharp on a concrete wall where a large, clear projection of her own face is displayed. Aisha herself is in the foreground, blurred (deep bokeh). On her blurred back and shoulder, an abstract light pattern from the projector is visible. Dark dress, cinematic lighting, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 17: Макро-взгляд (The Prismatic Double Gaze) Prompt: Extreme macro close-up of both eyes of Aisha Dosma, looking straight into the lens. 100% facial similarity. A complex prismatic light pattern scatters multiple spectral spots and rainbow flares across her forehead, eyes, and bridge of the nose. Sharp focus on the moist texture of the eyes and long eyelashes. Dark, moody background, intense cinematic chiaroscuro. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA".
Cartoon illustration, comic book cover featuring a handsome Caucasian man with burst-taper grey hair, wearing a white t-shirt and blue jeans, texting with his blue iPhone, a bold heading text in the background reads "PHONE" in huge bold sharp IMPACT white letters, in the top of the frame, occupying the whole frame, gta art style, gta 5 comics art, gta cover 2d game art, gta cover 2d game art, gta iv art style, rotoscoping, gta art style, gta v artwork style, gangsta rap
Create a 30-second promotional video in a professional marketing style for a mobile phone repair training course. Language & Voiceover: Voiceover in Egyptian Arabic dialect Clear, confident male voice Add on-screen captions (Arabic) synced with the voiceover 🎥 Scene Breakdown Scene 1 (0:00 - 0:05) – Hook Visual: Quick shot of a broken smartphone or a device not working. A frustrated person trying to turn it on. Voiceover: "عارف إن فيه ناس بتدفع آلاف عشان تصليح أعطال تافهة في موبايلاتها؟" Captions: Same text appears bold in center Scene 2 (0:05 - 0:15) – Problem & Solution Visual: Professional close-up shots of opening a phone using repair tools (screwdrivers, multimeter, hot air gun). Fast montage of fixing screen or charging port. Voiceover: "لو معندكش شغل أو عايز تزود دخلك، الفيديو ده ليك.. مجال صيانة الموبايلات مش محتاج منك شهادة ولا سنين خبرة، محتاج بس تتعلم الصح." Captions: Highlight key phrases dynamically Scene 3 (0:15 - 0:25) – Course Offer Visual: Clean shots of tools, workspace, or learning environment On-screen text (center, bold): "30 يوم بس – من الصفر للاحتراف" Voiceover: "أنا بقدم لك كورس صيانة موبايل شامل، هعلمك فيه من الصفر خطوة بخطوة إزاي تشخص العطل وتصلحه بإيدك.. وفي خلال 30 يوم بس، هتكون جاهز تبدأ وتكسب فلوس." Add subtle motion graphics Scene 4 (0:25 - 0:30) – Call to Action Visual: Confident person looking at camera, pointing down Voiceover: "مستني إيه؟ ابعت كلمة (ابدأ) دلوقتي في الكومنتات أو الرسائل وهبعتلك كل التفاصيل." Captions: Emphasize "ابدأ" ⚙️ Video Settings Style: Social media ad (TikTok / Reels / Shorts) Lighting: Bright (ring light or natural light) Music: Light motivational business background music Text: Large, bold, centered captions Quality: HD or 4K Camera: Multiple angles + fast-paced editing Transitions: Smooth, quick, engaging cuts 💡 AI Notes Emphasize professional repair tools (screwdrivers, multimeter, hot air gun) Keep pacing fast and attention-grabbing Make visuals feel modern and clean Optimize for vertical video (9:16) If you want, I can also turn this into: Script for ElevenLabs voiceover CapCut editing template Shot list + exact camera angles
vintage patriotic t-shirt design, centered layout, Puerto Rican flag in the middle with blue triangle and white star on the left and red and white horizontal stripes, distressed vintage texture, bold retro typography, top text "MY GIRLFRIEND IS" in Bebas Neue style condensed font, large center text "PUERTO RICAN" in heavy Anton style bold font, bottom text "NOTHING SCARES ME" in Oswald bold style font, clean centered composition, patriotic humor design, slightly grunge worn effect, screen print vector style, high contrast, professional t-shirt graphic, transparent background, no mockup, no model
Create a group image featuring multiple digital cartoon characters. Each character should have a high-quality semi-3D polished cartoon style with stylized but realistic facial feature exaggeration. Keep each face clearly recognizable, with varied expressions, hairstyles, and skin tones. Smooth surfaces, soft lighting, subtle depth, and a premium cartoon finish. Arrange the characters in a clean, balanced grid or collage composition. Use a clean, simple background with enough empty space for text. Add large, bold, highly readable text that says: "AI Cartoon Maker tool". Place the text in a clear area (top or center) with strong contrast against the background. Use a modern sans-serif font style, solid color, no distortion, no effects that reduce readability. Ensure the text is clearly legible at small thumbnail sizes. No hand-drawn textures. No pencil or sketch effects. No logos, no watermarks. Dont repeat faces
Cartoon brain character relaxing in a hammock between large daisies, text "TRUST IN THE LORD" in a bold, bubble-lettered style, text "with all your heart" underneath, retro style, soft pastel colors, bold outlines, whimsical design, simple graphic elements, daisies with detailed white petals, light beige background, detailed illustration of the brain character with large, expressive eyes, light pink brain with simple arms and legs, character wearing boots, hammock in a light teal or blue color, simple, clear lines, flat design, cute and inspirational, illustration style.
A front view 3d macro detailed illustration gaming WITH realistic colour logo with chrome, metal gold, steal, silver WHICH LOOKS REAL with front face texture photorealistic style with colour with a shooter, featuring the BIG AND BOLD text of SAM.D.COSTA and clear text of GAMING in bold letters. SIMILAR TO CALL OF DUTY THEME AND WAR BACKGROUND
Main "World's Best Prompt Master" ke roop mein, maine Instagram, Facebook aur Websites par top performing diesel engine aur generator posts ka deep analysis kiya hai. Analysis of Top Performers (The Generator Wale Niche): Color Psychology: Top brands (jaise Cummins, Caterpillar, Sudhir Power) hamesha Safety Yellow, Black, aur White use karte hain. Ye colors "Caution," "Power," aur "Trust" signify karte hain. Imagery: "Action shots" (mechanic repairing) aur "Product Hero shots" (chamakta hua generator) sabse zyada convert hote hain. Text Strategy: Text hamesha BOLD aur Clean hota hai. Curly fonts ya fancy likhai is industry mein "weak" maani jaati hai. Aapko Editable Post chahiye. Isliye main aapko 2 alag-alag prompts de raha hoon. Pehla prompt Design/Layout ke liye (Canva Search Bar ke liye), aur doosra High-Quality Background Image ke liye (Canva Magic Media ke liye). 🟢 OPTION 1: The "All-in-One" Template Prompt (Is prompt ko Canva ke Home Page Search Bar mein copy-paste karein. Magic Media mein nahi.) "Create a professional Instagram Post Template for a Diesel Engine Sales & Service brand. Theme: Industrial, Heavy-Duty, and Trustworthy. Color Palette: Use High-Contrast Safety Yellow (#FFD700), Dark Charcoal (#1A1A1A), and White. Layout: Split screen or clean overlay. Visuals: Include a placeholder for a heavy diesel generator or a technician in safety gear. Text Structure: Create distinct, editable text boxes for a bold Headline ('POWER WHEN YOU NEED IT'), a Sub-headline ('Sales | Service | AMC'), and a CTA Button ('Call Now'). Font Style: Use strong, sans-serif fonts like 'Anton' or 'Roboto Condensed' to convey strength. Ensure the text is not flattened into the image.
"A bold text-only design for a t-shirt. The text says 'Dream Big, Work Hard' in a dynamic, modern font. The design uses a clean layout with high contrast colors, such as white text on a black background or vibrant neon text on a dark base. The font is a mix of bold and cursive styles, with emphasis on 'Dream' and 'Hard' in a larger, more decorative style. The text is centered, well-spaced, and visually striking, optimized for t-shirt printing with no graphics or additional elements, just the words." ar 4500:5400
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details, align correctly, text in the middle and straight to the pov,
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details
Image Type: Photorealistic Setting: A modern gym or dojo with clean, polished floors and minimal background distractions, conveying a professional and focused training environment. Main Subjects: A Brazilian Jiu-Jitsu athlete in a custom-designed gi. The athlete is in motion, executing a technique on the mat, showing off the vibrant and unique design of the gi. The design should be intricate and personalized, with bold colors. Text Placement & Style: Place the text "Customize Your Gear" in bold, clear white or bright color at the bottom or top of the thumbnail. Make sure the text stands out against the background with high contrast for readability. Overall Mood: Motivational and focused, emphasizing the performance-enhancing effect of personalized gear.
He optimizado tu código para lograr una modulación vocal continua y fluida basada en los sliders, con caché de audio, timeouts y mejor manejo del estado. Ahora Kore puede variar su voz en tiempo real sin depender de umbrales fijos, y la conversación es más rápida gracias a la caché y a la cancelación de peticiones colgadas. ```javascript import React, { useState, useRef, useEffect, useCallback } from 'react'; import { Play, Square, Mic, MicOff, Settings2, Activity, Loader2, X, GripHorizontal, LayoutGrid, Zap, AlertCircle } from 'lucide-react'; // --- CONSTANTES --- const SILENT_WAV = "data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"; const TTS_TIMEOUT = 5000; // 5 segundos máximo para la síntesis const DEFAULT_API_KEY = 'AIzaSyBlkvy_Op-XlzSMSDDl9ip42dMFZX28MAA'; // ⚠️ Cámbiala por tu propia clave // --- UTILIDADES --- const base64ToWavBlob = (base64Data, sampleRate = 24000) => { const binaryString = window.atob(base64Data); const pcmData = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) pcmData[i] = binaryString.charCodeAt(i); const numChannels = 1; const bitsPerSample = 16; const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmData.length; const buffer = new ArrayBuffer(44 + dataSize); const view = new DataView(buffer); const writeString = (view, offset, string) => { for (let i = 0; i < string.length; i++) view.setUint8(offset + i, string.charCodeAt(i)); }; writeString(view, 0, 'RIFF'); view.setUint32(4, 36 + dataSize, true); writeString(view, 8, 'WAVE'); writeString(view, 12, 'fmt '); view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, numChannels, true); view.setUint32(24, sampleRate, true); view.setUint32(28, byteRate, true); view.setUint16(32, blockAlign, true); view.setUint16(34, bitsPerSample, true); writeString(view, 36, 'data'); view.setUint32(40, dataSize, true); for (let i = 0; i < dataSize; i++) view.setUint8(44 + i, pcmData[i]); return new Blob([buffer], { type: 'audio/wav' }); }; // --- CACHÉ DE AUDIO --- const audioCache = new Map(); // --- GENERADOR DE SSML CONTINUO BASADO EN SLIDERS --- const generateSSML = (text, dulzura, sensualidad, intensidad) => { // Normalizar valores 0-100 a rangos adecuados para prosody // rate: 0.5 a 2.0 (1.0 es normal) const rate = 0.8 + (intensidad / 100) * 1.2; // 0.8 (lento) a 2.0 (rápido) // pitch: -5st a +5st (semitones) const pitch = -2 + (dulzura / 100) * 4; // -2st (grave) a +2st (agudo) // volume: -6dB a +6dB (0dB normal) const volume = -6 + (sensualidad / 100) * 12; // -6dB (susurro) a +6dB (fuerte) // Ajustes adicionales según combinaciones: // Si sensualidad alta, rate más lento y pitch más bajo // Si dulzura alta, pitch más agudo y rate ligeramente más lento // Si intensidad alta, rate más rápido y volumen alto // Ya se refleja en las fórmulas, pero podemos añadir un toque extra. const ssml = `<speak> <prosody rate="${rate.toFixed(2)}" pitch="${pitch.toFixed(0)}st" volume="${volume.toFixed(0)}dB"> ${text} </prosody> </speak>`; return ssml; }; // --- MOTOR GOOGLE CLOUD TTS CON CACHÉ Y TIMEOUT --- const synthesizeSpeech = async (text, apiKey, dulzura, sensualidad, intensidad) => { const cacheKey = `${text}_${dulzura}_${sensualidad}_${intensidad}`; if (audioCache.has(cacheKey)) { console.log('🎯 Usando audio cacheado'); return audioCache.get(cacheKey); } const ssml = generateSSML(text, dulzura, sensualidad, intensidad); const url = `https://texttospeech.googleapis.com/v1/text:synthesize?key=${apiKey}`; const body = { input: { ssml }, voice: { languageCode: 'es-ES', name: 'es-ES-Neural2-F', ssmlGender: 'FEMALE' }, audioConfig: { audioEncoding: 'LINEAR16', sampleRateHertz: 24000 } }; const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), TTS_TIMEOUT); try { const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal: controller.signal }); clearTimeout(timeoutId); if (!res.ok) throw new Error(`TTS error: ${res.status}`); const data = await res.json(); audioCache.set(cacheKey, data.audioContent); return data.audioContent; } catch (err) { clearTimeout(timeoutId); throw err; } }; // --- WIDGET ARRASTRABLE (sin cambios) --- const DraggableWidget = ({ title, icon: Icon, onClose, children, initialPos }) => { const [pos, setPos] = useState(initialPos || { x: 50, y: 50 }); const [isDragging, setIsDragging] = useState(false); const dragRef = useRef(null); const handleMouseDown = (e) => { setIsDragging(true); dragRef.current = { startX: e.clientX, startY: e.clientY, initialX: pos.x, initialY: pos.y }; }; const handleMouseMove = (e) => { if (!isDragging) return; setPos({ x: Math.max(0, dragRef.current.initialX + (e.clientX - dragRef.current.startX)), y: Math.max(0, dragRef.current.initialY + (e.clientY - dragRef.current.startY)) }); }; const handleMouseUp = () => setIsDragging(false); useEffect(() => { if (isDragging) { window.addEventListener('mousemove', handleMouseMove); window.addEventListener('mouseup', handleMouseUp); } return () => { window.removeEventListener('mousemove', handleMouseMove); window.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging]); return ( <div style={{ left: `${pos.x}px`, top: `${pos.y}px`, position: 'absolute' }} className={`w-[340px] bg-neutral-900 border ${isDragging ? 'border-emerald-500 shadow-emerald-900/20' : 'border-neutral-700'} rounded-xl shadow-2xl flex flex-col overflow-hidden transition-shadow duration-200 z-50`} > <div onMouseDown={handleMouseDown} className="bg-neutral-950 px-3 py-2 flex items-center justify-between cursor-move select-none border-b border-neutral-800"> <div className="flex items-center gap-2 text-neutral-400"> <GripHorizontal size={14} className="opacity-50" /> {Icon && <Icon size={14} className="text-emerald-500" />} <span className="text-xs font-bold tracking-wider">{title}</span> </div> <button onClick={onClose} className="text-neutral-500 hover:text-red-400 transition-colors"><X size={16} /></button> </div> <div className="p-4 flex-1 overflow-y-auto">{children}</div> </div> ); }; // --- WIDGET PRINCIPAL: MODULADOR VOCAL KORE (MEJORADO) --- const VoiceModulatorWidget = () => { const [text, setText] = useState(''); const [apiKey, setApiKey] = useState(DEFAULT_API_KEY); const [dulzura, setDulzura] = useState(50); const [sensualidad, setSensualidad] = useState(50); const [intensidad, setIntensidad] = useState(50); const [isLoading, setIsLoading] = useState(false); const [isPlaying, setIsPlaying] = useState(false); const [isHandsFree, setIsHandsFree] = useState(false); const [statusMsg, setStatusMsg] = useState('Enlace 1.5 Flash + GCP TTS Establecido.'); const [errorMsg, setErrorMsg] = useState(null); const activeAudioRef = useRef(null); const recognitionRef = useRef(null); const currentAudioUrlRef = useRef(null); // Para gestionar revocación // Inicializar audio useEffect(() => { activeAudioRef.current = new Audio(); activeAudioRef.current.preload = "auto"; return () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } } if (recognitionRef.current) recognitionRef.current.stop(); }; }, []); // Configurar reconocimiento de voz useEffect(() => { if (!('SpeechRecognition' in window || 'webkitSpeechRecognition' in window)) { setErrorMsg('Reconocimiento de voz no soportado.'); return; } const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; recognitionRef.current = new SpeechRecognition(); recognitionRef.current.lang = 'es-ES'; recognitionRef.current.interimResults = false; recognitionRef.current.continuous = false; recognitionRef.current.onresult = async (event) => { const transcript = event.results[0][0].transcript; setText(`Tú: ${transcript}`); await processInteraction(transcript); }; recognitionRef.current.onerror = (event) => { if (event.error !== 'no-speech') { setErrorMsg(`Micrófono: ${event.error}`); setIsHandsFree(false); } }; recognitionRef.current.onend = () => { if (isHandsFree && !isPlaying && !isLoading) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; // Limpiar al desmontar return () => { if (recognitionRef.current) recognitionRef.current.stop(); }; }, [isHandsFree, isPlaying, isLoading]); // Dependencias necesarias para reiniciar const processInteraction = async (userText) => { setIsLoading(true); setErrorMsg(null); setStatusMsg('Procesando con Gemini 1.5 Flash...'); const key = apiKey.trim(); try { // 1. Llamada a Gemini con timeout const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 5000); const payloadText = { contents: [{ parts: [{ text: userText }] }], systemInstruction: { parts: [{ text: `Eres Kore, 28 años, Huesca. Labia, directa, sensual, disruptiva. Responde en español, máx 20 palabras. REGLA INNEGOCIABLE: CERO PREGUNTAS.` }] } }; const resText = await fetch( `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${key}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payloadText), signal: controller.signal } ); clearTimeout(timeoutId); if (!resText.ok) throw new Error(`Gemini error: ${resText.status}`); const dataText = await resText.json(); const aiText = dataText.candidates?.[0]?.content?.parts?.[0]?.text || "Mmm... vale."; setText(`Kore: ${aiText}`); // 2. Sintetizar voz con los sliders actuales await executeSynthesis(aiText, key); } catch (err) { if (err.name === 'AbortError') { setErrorMsg('Gemini timeout (5s)'); } else { setErrorMsg(err.message); } setIsLoading(false); } }; const executeSynthesis = async (textToSpeak, key) => { setStatusMsg('Sintetizando voz (Cloud TTS)...'); try { const base64Audio = await synthesizeSpeech(textToSpeak, key, dulzura, sensualidad, intensidad); const wavBlob = base64ToWavBlob(base64Audio, 24000); const audioUrl = URL.createObjectURL(wavBlob); // Revocar URL anterior si existe if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } currentAudioUrlRef.current = audioUrl; activeAudioRef.current.src = audioUrl; activeAudioRef.current.onended = () => { setIsPlaying(false); setStatusMsg('Transmisión completada.'); if (isHandsFree) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; setStatusMsg('Transmitiendo...'); setIsPlaying(true); setIsLoading(false); await activeAudioRef.current.play().catch(err => { throw new Error(`Autoplay bloqueado: ${err.message}`); }); } catch (error) { throw new Error(`Fallo TTS: ${error.message}`); } }; const handleManualPlay = async () => { if (!text.trim()) return setErrorMsg('Escribe algo primero.'); // Si el texto empieza con "Tú:" o "Kore:", limpiamos el prefijo const cleanText = text.replace(/^(Tú:|Kore:)\s*/, ''); if (!cleanText.trim()) return setErrorMsg('Texto vacío después de limpiar.'); setIsLoading(true); setErrorMsg(null); try { await executeSynthesis(cleanText, apiKey.trim()); } catch (err) { setErrorMsg(err.message); setIsLoading(false); } }; const toggleHandsFree = () => { if (!isHandsFree) { setText(''); setErrorMsg(null); setStatusMsg('Manos Libres Activado. Habla...'); // Desbloquear audio en algunos navegadores if (activeAudioRef.current) { activeAudioRef.current.src = SILENT_WAV; activeAudioRef.current.play().catch(() => {}); } try { recognitionRef.current.start(); } catch (e) {} } else { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Sistemas en pausa.'); if (recognitionRef.current) recognitionRef.current.stop(); } setIsHandsFree(!isHandsFree); }; const stopAudio = () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Señal interrumpida.'); }; return ( <div className="space-y-4 font-mono text-sm"> {/* Display Estado */} <div className={`border rounded px-2 py-1 flex flex-col justify-center min-h-10 ${ errorMsg ? 'bg-red-950/50 border-red-900' : isHandsFree ? 'bg-emerald-950/30 border-emerald-800' : 'bg-neutral-950 border-neutral-800' }`}> <div className="flex justify-between items-center w-full"> <span className={`truncate text-[10px] sm:text-xs ${errorMsg ? 'text-red-500' : 'text-emerald-500'}`}> > {errorMsg || statusMsg} </span> {isPlaying && !errorMsg && <Activity size={14} className="text-emerald-500 animate-pulse ml-2 flex-shrink-0" />} {isLoading && !errorMsg && <Zap size={14} className="text-amber-500 animate-pulse ml-2 flex-shrink-0" />} {isHandsFree && !isPlaying && !isLoading && !errorMsg && <Mic size={14} className="text-red-500 animate-pulse ml-2 flex-shrink-0" />} </div> </div> {/* Input Texto / Log */} <textarea value={text} onChange={(e) => setText(e.target.value)} className="w-full bg-neutral-950/50 border border-neutral-700 rounded p-2 text-xs text-neutral-300 focus:outline-none focus:border-emerald-500 resize-none h-20" placeholder={isHandsFree ? "Escuchando transcripción en tiempo real..." : "Escribe texto directo o activa Manos Libres..."} readOnly={isHandsFree || isLoading} /> {/* Sliders continuos (controlan SSML en tiempo real) */} <div className="space-y-3 bg-neutral-950/30 p-3 rounded border border-neutral-800"> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Agresiva</span><span className="text-emerald-400">Dulzura [{dulzura}]</span><span>Dulce</span> </div> <input type="range" min="0" max="100" value={dulzura} onChange={(e)=>setDulzura(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-emerald-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Robótica</span><span className="text-pink-400">Aura [{sensualidad}]</span><span>Sensual</span> </div> <input type="range" min="0" max="100" value={sensualidad} onChange={(e)=>setSensualidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-pink-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Atenuada</span><span className="text-amber-400">Intensidad [{intensidad}]</span><span>Fuerte</span> </div> <input type="range" min="0" max="100" value={intensidad} onChange={(e)=>setIntensidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-amber-500 cursor-pointer" /> </div> </div> {/* Botones de Control */} <div className="flex flex-col sm:flex-row gap-2"> <button onClick={toggleHandsFree} disabled={isLoading} className={`flex-1 py-2 rounded text-xs font-bold flex items-center justify-center gap-2 transition-colors border ${ isHandsFree ? 'bg-red-900/20 text-red-400 border-red-900/50 hover:bg-red-900/40 shadow-[0_0_10px_rgba(239,68,68,0.2)]' : 'bg-indigo-900/20 text-indigo-400 border-indigo-900/50 hover:bg-indigo-900/40' }`} > {isHandsFree ? <MicOff size={14} /> : <Mic size={14} />} {isHandsFree ? 'Detener Escucha' : 'Manos Libres'} </button> <div className="flex gap-2 flex-1"> <button onClick={handleManualPlay} disabled={isLoading || isPlaying || isHandsFree} className="flex-1 bg-emerald-600/20 hover:bg-emerald-600/40 text-emerald-400 border border-emerald-600/50 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center gap-1 transition-colors" > {isLoading ? <Loader2 size={14} className="animate-spin" /> : <Play size={14} />} Sintetizar </button> <button onClick={stopAudio} disabled={!isPlaying && !isHandsFree} className="px-4 bg-neutral-800 hover:bg-neutral-700 text-neutral-400 border border-neutral-700 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center transition-colors" > <Square size={14} /> </button> </div> </div> {/* Botón para limpiar caché (opcional) */} <div className="text-right"> <button onClick={() => audioCache.clear()} className="text-[8px] text-neutral-600 hover:text-neutral-400 underline" > limpiar caché de audio </button> </div> </div> ); }; // --- ENTORNO ESCRITORIO (sin cambios) --- export default function App() { const [widgets, setWidgets] = useState({ voice: { isOpen: true, pos: { x: window.innerWidth > 768 ? window.innerWidth / 2 - 170 : 20, y: 40 } } }); const toggleWidget = (id) => { setWidgets(prev => ({ ...prev, [id]: { ...prev[id], isOpen: !prev[id].isOpen } })); }; return ( <div className="w-full h-screen bg-neutral-950 bg-[radial-gradient(ellipse_80%_80%_at_50%_-20%,rgba(16,185,129,0.1),rgba(0,0,0,1))] overflow-hidden relative font-sans text-neutral-200"> <div className="absolute inset-0 flex items-center justify-center opacity-[0.02] pointer-events-none"><Settings2 size={500} /></div> {widgets.voice.isOpen && ( <DraggableWidget title="MODULADOR VOCAL KORE" icon={Zap} initialPos={widgets.voice.pos} onClose={() => toggleWidget('voice')}> <VoiceModulatorWidget /> </DraggableWidget> )} <div className="absolute bottom-6 left-1/2 transform -translate-x-1/2 bg-neutral-900/80 backdrop-blur-md border border-neutral-700/50 p-2 rounded-2xl shadow-2xl flex gap-2 z-[100]"> <div className="px-3 flex items-center border-r border-neutral-700/50 text-neutral-500"><LayoutGrid size={20} /></div> <button onClick={() => toggleWidget('voice')} className={`px-4 py-2 rounded-xl flex items-center gap-2 text-sm font-medium transition-all ${
Style: Printed T-Shirt Design The design should be highly realistic and captivating, focusing on showcasing a Print on Demand store specializing in movie-themed apparel. At the center of the scene, prominently feature a premium T-shirt laid out naturally on a minimalist chair. The T-shirt should display the text “watchfreemovies247 SHOP” in bold, clean, and clear typography, with sharp lines to give a professional, eye-catching effect. The text should immediately communicate a sense of quality and clarity, emphasizing the store’s movie-themed focus. Key Elements: Main T-Shirt Display: Place the central T-shirt on a modern, sleek chair, positioned naturally and without a person wearing it. The text “watchfreemovies247 SHOP” should be the focal point, printed clearly on the front of the T-shirt. The font must be easy to read, bold, and sharp, standing out against the fabric. The design should have a cinematic feel, subtly tying into the theme of movies and film culture. Additional T-Shirts and Graphic Elements: Surround the main T-shirt with several other shirts featuring creative, eye-catching cinematic graphic designs. These designs can include movie-related imagery such as film reels, directors’ clapperboards, iconic movie quotes, and other recognizable film visuals. The shirts should be displayed in a professional and organized manner, whether folded neatly, hanging, or draped across nearby props. Each shirt should have a different movie-themed graphic design to show the variety and creative possibilities offered by the store. Film-Themed Props and Background: Incorporate film-related props into the scene to enhance the cinematic atmosphere. These could include vintage film cameras, popcorn tubs, film reels, and director’s chairs. The props should be subtly placed around the scene, contributing to the overall theme without overshadowing the main T-shirt. The background should evoke a movie theater or film studio ambiance, with soft lighting and a cinematic glow that highlights the shirts and props. Professional Presentation: Ensure that the scene feels polished, well-organized, and professional. The design should communicate clearly that this is a Print on Demand store catering to film and movie enthusiasts. Arrange the shirts and props in a way that feels cohesive, yet dynamic, giving the viewer the impression that they are browsing a curated selection of unique, movie-themed apparel. Lighting and Color Scheme: Use warm, cinematic lighting to create depth and draw attention to the T-shirts. Incorporate a palette of rich, dark neutrals, with accents of golds, reds, and subtle lighting highlights to evoke the ambiance of a classic movie scene. The lighting should add a sense of dimension and make the central T-shirt the focal point while maintaining a balanced and inviting atmosphere. Final Vision: The completed design should instantly communicate that this is a professional Print on Demand store for movie lovers. The main T-shirt should stand out clearly with its sharp, bold text, while the surrounding shirts and cinematic props reinforce the theme. The scene should feel inviting, creative, and expertly arranged, capturing the essence of a store dedicated to passionate movie fans looking for unique, high-quality apparel. The overall layout must be realistic, visually striking, and professional, creating a sense of excitement and engagement with the viewer.
Make a mafia boss with the face of input image 1 with mafia hat holding with two hands a doner kebab wrapped in his hands and he has a smile. Display text for the mascot logo should be like Godfather text style similar bold text. Color scheme. Black, Red, white. Logo text should say: KEBABOSS
Кадр 11: Радужный макро-взгляд (Prismatic Macro Eye) Prompt: Extreme macro close-up of a young woman's eye looking directly at the camera. A sharp, narrow rainbow light spectrum from a prism projector cuts vertically across her pupil and cheek. 100% facial feature retention of Aisha Dosma, dark wavy hair, brown eyes. Hyper-realistic skin texture with visible pores and slight moisture. Sharp focus on eyelashes and iris. High-contrast lighting (chiaroscuro), deep shadows. Film grain, 85mm f/1.4 lens aesthetics. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 12: Макро-диалог с тенью (Macro Shadow Dialogue) Prompt: Extreme close-up profile of the lower face (nose, lips, chin) of a woman with 100% likeness to Aisha Dosma. Strong side lighting from a projector creating a dramatic chiaroscuro effect. On the concrete wall behind her, a large, sharp shadow of her profile is projected, overlapping with abstract light patterns. Wet lip gloss texture, satin skin finish. Dark cinematic atmosphere, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 13: Призматический макро-взгляд (Prismatic Macro Gaze) Prompt: Extreme macro shot of one eye of Aisha Dosma. Prismatic refraction creates a vibrant, detailed rainbow spectrum across the iris and eyelashes. Reflective catchlight from the projector in the pupil. Hyper-realistic wet skin texture with micro-droplets of makeup. Perfect 1:1 similarity of eye shape and eyebrow. Moody, dark background, intense cinematic lighting. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 14: Влажный блеск и проекция на губах (Macro Luminescent Lips) Prompt: Extreme macro close-up of the lips and chin of Aisha Dosma. The lips are covered in heavy, ultra-glossy clear lip gloss resembling liquid glass. Small, brilliant light specks and glints from a projector reflect on the glossy surface. An abstract geometric light pattern is projected onto the surrounding matte skin. Extreme detail, visible skin relief. Cinematic noir lighting, grainy film texture. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 15: Текстура волос и преломленная проекция (Macro Hair Bun) Prompt: Medium close-up of the back of the head and neck of Aisha Dosma. A messy high bun with curly strands. A projector shines through a prism directly onto the hair, creating a complex, kaleidoscopic rainbow refraction pattern on the hair texture and the concrete wall behind. Sharp focus on individual hair strands and light catchers in the curls. Dark, mysterious atmosphere. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 16: Сдвиг фокуса и проекция на коже (Patterned Reflection) Prompt: Medium shot of Aisha Dosma from behind, looking over her shoulder. Shallow depth of field. The focus is sharp on a concrete wall where a large, clear projection of her own face is displayed. Aisha herself is in the foreground, blurred (deep bokeh). On her blurred back and shoulder, an abstract light pattern from the projector is visible. Dark dress, cinematic lighting, heavy film grain. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA". Кадр 17: Макро-взгляд (The Prismatic Double Gaze) Prompt: Extreme macro close-up of both eyes of Aisha Dosma, looking straight into the lens. 100% facial similarity. A complex prismatic light pattern scatters multiple spectral spots and rainbow flares across her forehead, eyes, and bridge of the nose. Sharp focus on the moist texture of the eyes and long eyelashes. Dark, moody background, intense cinematic chiaroscuro. In the bottom corner, a large, bold watermark text "БУ AISHA DOSMA".
vintage patriotic t-shirt design, centered layout, Puerto Rican flag in the middle with blue triangle and white star on the left and red and white horizontal stripes, distressed vintage texture, bold retro typography, top text "MY GIRLFRIEND IS" in Bebas Neue style condensed font, large center text "PUERTO RICAN" in heavy Anton style bold font, bottom text "NOTHING SCARES ME" in Oswald bold style font, clean centered composition, patriotic humor design, slightly grunge worn effect, screen print vector style, high contrast, professional t-shirt graphic, transparent background, no mockup, no model
"A bold text-only design for a t-shirt. The text says 'Dream Big, Work Hard' in a dynamic, modern font. The design uses a clean layout with high contrast colors, such as white text on a black background or vibrant neon text on a dark base. The font is a mix of bold and cursive styles, with emphasis on 'Dream' and 'Hard' in a larger, more decorative style. The text is centered, well-spaced, and visually striking, optimized for t-shirt printing with no graphics or additional elements, just the words." ar 4500:5400
Create a group image featuring multiple digital cartoon characters. Each character should have a high-quality semi-3D polished cartoon style with stylized but realistic facial feature exaggeration. Keep each face clearly recognizable, with varied expressions, hairstyles, and skin tones. Smooth surfaces, soft lighting, subtle depth, and a premium cartoon finish. Arrange the characters in a clean, balanced grid or collage composition. Use a clean, simple background with enough empty space for text. Add large, bold, highly readable text that says: "AI Cartoon Maker tool". Place the text in a clear area (top or center) with strong contrast against the background. Use a modern sans-serif font style, solid color, no distortion, no effects that reduce readability. Ensure the text is clearly legible at small thumbnail sizes. No hand-drawn textures. No pencil or sketch effects. No logos, no watermarks. Dont repeat faces
Main "World's Best Prompt Master" ke roop mein, maine Instagram, Facebook aur Websites par top performing diesel engine aur generator posts ka deep analysis kiya hai. Analysis of Top Performers (The Generator Wale Niche): Color Psychology: Top brands (jaise Cummins, Caterpillar, Sudhir Power) hamesha Safety Yellow, Black, aur White use karte hain. Ye colors "Caution," "Power," aur "Trust" signify karte hain. Imagery: "Action shots" (mechanic repairing) aur "Product Hero shots" (chamakta hua generator) sabse zyada convert hote hain. Text Strategy: Text hamesha BOLD aur Clean hota hai. Curly fonts ya fancy likhai is industry mein "weak" maani jaati hai. Aapko Editable Post chahiye. Isliye main aapko 2 alag-alag prompts de raha hoon. Pehla prompt Design/Layout ke liye (Canva Search Bar ke liye), aur doosra High-Quality Background Image ke liye (Canva Magic Media ke liye). 🟢 OPTION 1: The "All-in-One" Template Prompt (Is prompt ko Canva ke Home Page Search Bar mein copy-paste karein. Magic Media mein nahi.) "Create a professional Instagram Post Template for a Diesel Engine Sales & Service brand. Theme: Industrial, Heavy-Duty, and Trustworthy. Color Palette: Use High-Contrast Safety Yellow (#FFD700), Dark Charcoal (#1A1A1A), and White. Layout: Split screen or clean overlay. Visuals: Include a placeholder for a heavy diesel generator or a technician in safety gear. Text Structure: Create distinct, editable text boxes for a bold Headline ('POWER WHEN YOU NEED IT'), a Sub-headline ('Sales | Service | AMC'), and a CTA Button ('Call Now'). Font Style: Use strong, sans-serif fonts like 'Anton' or 'Roboto Condensed' to convey strength. Ensure the text is not flattened into the image.
Style: Printed T-Shirt Design The design should be highly realistic and captivating, focusing on showcasing a Print on Demand store specializing in movie-themed apparel. At the center of the scene, prominently feature a premium T-shirt laid out naturally on a minimalist chair. The T-shirt should display the text “watchfreemovies247 SHOP” in bold, clean, and clear typography, with sharp lines to give a professional, eye-catching effect. The text should immediately communicate a sense of quality and clarity, emphasizing the store’s movie-themed focus. Key Elements: Main T-Shirt Display: Place the central T-shirt on a modern, sleek chair, positioned naturally and without a person wearing it. The text “watchfreemovies247 SHOP” should be the focal point, printed clearly on the front of the T-shirt. The font must be easy to read, bold, and sharp, standing out against the fabric. The design should have a cinematic feel, subtly tying into the theme of movies and film culture. Additional T-Shirts and Graphic Elements: Surround the main T-shirt with several other shirts featuring creative, eye-catching cinematic graphic designs. These designs can include movie-related imagery such as film reels, directors’ clapperboards, iconic movie quotes, and other recognizable film visuals. The shirts should be displayed in a professional and organized manner, whether folded neatly, hanging, or draped across nearby props. Each shirt should have a different movie-themed graphic design to show the variety and creative possibilities offered by the store. Film-Themed Props and Background: Incorporate film-related props into the scene to enhance the cinematic atmosphere. These could include vintage film cameras, popcorn tubs, film reels, and director’s chairs. The props should be subtly placed around the scene, contributing to the overall theme without overshadowing the main T-shirt. The background should evoke a movie theater or film studio ambiance, with soft lighting and a cinematic glow that highlights the shirts and props. Professional Presentation: Ensure that the scene feels polished, well-organized, and professional. The design should communicate clearly that this is a Print on Demand store catering to film and movie enthusiasts. Arrange the shirts and props in a way that feels cohesive, yet dynamic, giving the viewer the impression that they are browsing a curated selection of unique, movie-themed apparel. Lighting and Color Scheme: Use warm, cinematic lighting to create depth and draw attention to the T-shirts. Incorporate a palette of rich, dark neutrals, with accents of golds, reds, and subtle lighting highlights to evoke the ambiance of a classic movie scene. The lighting should add a sense of dimension and make the central T-shirt the focal point while maintaining a balanced and inviting atmosphere. Final Vision: The completed design should instantly communicate that this is a professional Print on Demand store for movie lovers. The main T-shirt should stand out clearly with its sharp, bold text, while the surrounding shirts and cinematic props reinforce the theme. The scene should feel inviting, creative, and expertly arranged, capturing the essence of a store dedicated to passionate movie fans looking for unique, high-quality apparel. The overall layout must be realistic, visually striking, and professional, creating a sense of excitement and engagement with the viewer.
Cartoon brain character relaxing in a hammock between large daisies, text "TRUST IN THE LORD" in a bold, bubble-lettered style, text "with all your heart" underneath, retro style, soft pastel colors, bold outlines, whimsical design, simple graphic elements, daisies with detailed white petals, light beige background, detailed illustration of the brain character with large, expressive eyes, light pink brain with simple arms and legs, character wearing boots, hammock in a light teal or blue color, simple, clear lines, flat design, cute and inspirational, illustration style.
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details, align correctly, text in the middle and straight to the pov,
Make a mafia boss with the face of input image 1 with mafia hat holding with two hands a doner kebab wrapped in his hands and he has a smile. Display text for the mascot logo should be like Godfather text style similar bold text. Color scheme. Black, Red, white. Logo text should say: KEBABOSS
A front view 3d macro detailed illustration gaming WITH realistic colour logo with chrome, metal gold, steal, silver WHICH LOOKS REAL with front face texture photorealistic style with colour with a shooter, featuring the BIG AND BOLD text of SAM.D.COSTA and clear text of GAMING in bold letters. SIMILAR TO CALL OF DUTY THEME AND WAR BACKGROUND
He optimizado tu código para lograr una modulación vocal continua y fluida basada en los sliders, con caché de audio, timeouts y mejor manejo del estado. Ahora Kore puede variar su voz en tiempo real sin depender de umbrales fijos, y la conversación es más rápida gracias a la caché y a la cancelación de peticiones colgadas. ```javascript import React, { useState, useRef, useEffect, useCallback } from 'react'; import { Play, Square, Mic, MicOff, Settings2, Activity, Loader2, X, GripHorizontal, LayoutGrid, Zap, AlertCircle } from 'lucide-react'; // --- CONSTANTES --- const SILENT_WAV = "data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"; const TTS_TIMEOUT = 5000; // 5 segundos máximo para la síntesis const DEFAULT_API_KEY = 'AIzaSyBlkvy_Op-XlzSMSDDl9ip42dMFZX28MAA'; // ⚠️ Cámbiala por tu propia clave // --- UTILIDADES --- const base64ToWavBlob = (base64Data, sampleRate = 24000) => { const binaryString = window.atob(base64Data); const pcmData = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) pcmData[i] = binaryString.charCodeAt(i); const numChannels = 1; const bitsPerSample = 16; const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmData.length; const buffer = new ArrayBuffer(44 + dataSize); const view = new DataView(buffer); const writeString = (view, offset, string) => { for (let i = 0; i < string.length; i++) view.setUint8(offset + i, string.charCodeAt(i)); }; writeString(view, 0, 'RIFF'); view.setUint32(4, 36 + dataSize, true); writeString(view, 8, 'WAVE'); writeString(view, 12, 'fmt '); view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, numChannels, true); view.setUint32(24, sampleRate, true); view.setUint32(28, byteRate, true); view.setUint16(32, blockAlign, true); view.setUint16(34, bitsPerSample, true); writeString(view, 36, 'data'); view.setUint32(40, dataSize, true); for (let i = 0; i < dataSize; i++) view.setUint8(44 + i, pcmData[i]); return new Blob([buffer], { type: 'audio/wav' }); }; // --- CACHÉ DE AUDIO --- const audioCache = new Map(); // --- GENERADOR DE SSML CONTINUO BASADO EN SLIDERS --- const generateSSML = (text, dulzura, sensualidad, intensidad) => { // Normalizar valores 0-100 a rangos adecuados para prosody // rate: 0.5 a 2.0 (1.0 es normal) const rate = 0.8 + (intensidad / 100) * 1.2; // 0.8 (lento) a 2.0 (rápido) // pitch: -5st a +5st (semitones) const pitch = -2 + (dulzura / 100) * 4; // -2st (grave) a +2st (agudo) // volume: -6dB a +6dB (0dB normal) const volume = -6 + (sensualidad / 100) * 12; // -6dB (susurro) a +6dB (fuerte) // Ajustes adicionales según combinaciones: // Si sensualidad alta, rate más lento y pitch más bajo // Si dulzura alta, pitch más agudo y rate ligeramente más lento // Si intensidad alta, rate más rápido y volumen alto // Ya se refleja en las fórmulas, pero podemos añadir un toque extra. const ssml = `<speak> <prosody rate="${rate.toFixed(2)}" pitch="${pitch.toFixed(0)}st" volume="${volume.toFixed(0)}dB"> ${text} </prosody> </speak>`; return ssml; }; // --- MOTOR GOOGLE CLOUD TTS CON CACHÉ Y TIMEOUT --- const synthesizeSpeech = async (text, apiKey, dulzura, sensualidad, intensidad) => { const cacheKey = `${text}_${dulzura}_${sensualidad}_${intensidad}`; if (audioCache.has(cacheKey)) { console.log('🎯 Usando audio cacheado'); return audioCache.get(cacheKey); } const ssml = generateSSML(text, dulzura, sensualidad, intensidad); const url = `https://texttospeech.googleapis.com/v1/text:synthesize?key=${apiKey}`; const body = { input: { ssml }, voice: { languageCode: 'es-ES', name: 'es-ES-Neural2-F', ssmlGender: 'FEMALE' }, audioConfig: { audioEncoding: 'LINEAR16', sampleRateHertz: 24000 } }; const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), TTS_TIMEOUT); try { const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal: controller.signal }); clearTimeout(timeoutId); if (!res.ok) throw new Error(`TTS error: ${res.status}`); const data = await res.json(); audioCache.set(cacheKey, data.audioContent); return data.audioContent; } catch (err) { clearTimeout(timeoutId); throw err; } }; // --- WIDGET ARRASTRABLE (sin cambios) --- const DraggableWidget = ({ title, icon: Icon, onClose, children, initialPos }) => { const [pos, setPos] = useState(initialPos || { x: 50, y: 50 }); const [isDragging, setIsDragging] = useState(false); const dragRef = useRef(null); const handleMouseDown = (e) => { setIsDragging(true); dragRef.current = { startX: e.clientX, startY: e.clientY, initialX: pos.x, initialY: pos.y }; }; const handleMouseMove = (e) => { if (!isDragging) return; setPos({ x: Math.max(0, dragRef.current.initialX + (e.clientX - dragRef.current.startX)), y: Math.max(0, dragRef.current.initialY + (e.clientY - dragRef.current.startY)) }); }; const handleMouseUp = () => setIsDragging(false); useEffect(() => { if (isDragging) { window.addEventListener('mousemove', handleMouseMove); window.addEventListener('mouseup', handleMouseUp); } return () => { window.removeEventListener('mousemove', handleMouseMove); window.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging]); return ( <div style={{ left: `${pos.x}px`, top: `${pos.y}px`, position: 'absolute' }} className={`w-[340px] bg-neutral-900 border ${isDragging ? 'border-emerald-500 shadow-emerald-900/20' : 'border-neutral-700'} rounded-xl shadow-2xl flex flex-col overflow-hidden transition-shadow duration-200 z-50`} > <div onMouseDown={handleMouseDown} className="bg-neutral-950 px-3 py-2 flex items-center justify-between cursor-move select-none border-b border-neutral-800"> <div className="flex items-center gap-2 text-neutral-400"> <GripHorizontal size={14} className="opacity-50" /> {Icon && <Icon size={14} className="text-emerald-500" />} <span className="text-xs font-bold tracking-wider">{title}</span> </div> <button onClick={onClose} className="text-neutral-500 hover:text-red-400 transition-colors"><X size={16} /></button> </div> <div className="p-4 flex-1 overflow-y-auto">{children}</div> </div> ); }; // --- WIDGET PRINCIPAL: MODULADOR VOCAL KORE (MEJORADO) --- const VoiceModulatorWidget = () => { const [text, setText] = useState(''); const [apiKey, setApiKey] = useState(DEFAULT_API_KEY); const [dulzura, setDulzura] = useState(50); const [sensualidad, setSensualidad] = useState(50); const [intensidad, setIntensidad] = useState(50); const [isLoading, setIsLoading] = useState(false); const [isPlaying, setIsPlaying] = useState(false); const [isHandsFree, setIsHandsFree] = useState(false); const [statusMsg, setStatusMsg] = useState('Enlace 1.5 Flash + GCP TTS Establecido.'); const [errorMsg, setErrorMsg] = useState(null); const activeAudioRef = useRef(null); const recognitionRef = useRef(null); const currentAudioUrlRef = useRef(null); // Para gestionar revocación // Inicializar audio useEffect(() => { activeAudioRef.current = new Audio(); activeAudioRef.current.preload = "auto"; return () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } } if (recognitionRef.current) recognitionRef.current.stop(); }; }, []); // Configurar reconocimiento de voz useEffect(() => { if (!('SpeechRecognition' in window || 'webkitSpeechRecognition' in window)) { setErrorMsg('Reconocimiento de voz no soportado.'); return; } const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; recognitionRef.current = new SpeechRecognition(); recognitionRef.current.lang = 'es-ES'; recognitionRef.current.interimResults = false; recognitionRef.current.continuous = false; recognitionRef.current.onresult = async (event) => { const transcript = event.results[0][0].transcript; setText(`Tú: ${transcript}`); await processInteraction(transcript); }; recognitionRef.current.onerror = (event) => { if (event.error !== 'no-speech') { setErrorMsg(`Micrófono: ${event.error}`); setIsHandsFree(false); } }; recognitionRef.current.onend = () => { if (isHandsFree && !isPlaying && !isLoading) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; // Limpiar al desmontar return () => { if (recognitionRef.current) recognitionRef.current.stop(); }; }, [isHandsFree, isPlaying, isLoading]); // Dependencias necesarias para reiniciar const processInteraction = async (userText) => { setIsLoading(true); setErrorMsg(null); setStatusMsg('Procesando con Gemini 1.5 Flash...'); const key = apiKey.trim(); try { // 1. Llamada a Gemini con timeout const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 5000); const payloadText = { contents: [{ parts: [{ text: userText }] }], systemInstruction: { parts: [{ text: `Eres Kore, 28 años, Huesca. Labia, directa, sensual, disruptiva. Responde en español, máx 20 palabras. REGLA INNEGOCIABLE: CERO PREGUNTAS.` }] } }; const resText = await fetch( `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${key}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payloadText), signal: controller.signal } ); clearTimeout(timeoutId); if (!resText.ok) throw new Error(`Gemini error: ${resText.status}`); const dataText = await resText.json(); const aiText = dataText.candidates?.[0]?.content?.parts?.[0]?.text || "Mmm... vale."; setText(`Kore: ${aiText}`); // 2. Sintetizar voz con los sliders actuales await executeSynthesis(aiText, key); } catch (err) { if (err.name === 'AbortError') { setErrorMsg('Gemini timeout (5s)'); } else { setErrorMsg(err.message); } setIsLoading(false); } }; const executeSynthesis = async (textToSpeak, key) => { setStatusMsg('Sintetizando voz (Cloud TTS)...'); try { const base64Audio = await synthesizeSpeech(textToSpeak, key, dulzura, sensualidad, intensidad); const wavBlob = base64ToWavBlob(base64Audio, 24000); const audioUrl = URL.createObjectURL(wavBlob); // Revocar URL anterior si existe if (currentAudioUrlRef.current) { URL.revokeObjectURL(currentAudioUrlRef.current); } currentAudioUrlRef.current = audioUrl; activeAudioRef.current.src = audioUrl; activeAudioRef.current.onended = () => { setIsPlaying(false); setStatusMsg('Transmisión completada.'); if (isHandsFree) { try { recognitionRef.current.start(); setStatusMsg('Escuchando...'); } catch (e) {} } }; setStatusMsg('Transmitiendo...'); setIsPlaying(true); setIsLoading(false); await activeAudioRef.current.play().catch(err => { throw new Error(`Autoplay bloqueado: ${err.message}`); }); } catch (error) { throw new Error(`Fallo TTS: ${error.message}`); } }; const handleManualPlay = async () => { if (!text.trim()) return setErrorMsg('Escribe algo primero.'); // Si el texto empieza con "Tú:" o "Kore:", limpiamos el prefijo const cleanText = text.replace(/^(Tú:|Kore:)\s*/, ''); if (!cleanText.trim()) return setErrorMsg('Texto vacío después de limpiar.'); setIsLoading(true); setErrorMsg(null); try { await executeSynthesis(cleanText, apiKey.trim()); } catch (err) { setErrorMsg(err.message); setIsLoading(false); } }; const toggleHandsFree = () => { if (!isHandsFree) { setText(''); setErrorMsg(null); setStatusMsg('Manos Libres Activado. Habla...'); // Desbloquear audio en algunos navegadores if (activeAudioRef.current) { activeAudioRef.current.src = SILENT_WAV; activeAudioRef.current.play().catch(() => {}); } try { recognitionRef.current.start(); } catch (e) {} } else { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Sistemas en pausa.'); if (recognitionRef.current) recognitionRef.current.stop(); } setIsHandsFree(!isHandsFree); }; const stopAudio = () => { if (activeAudioRef.current) { activeAudioRef.current.pause(); activeAudioRef.current.currentTime = 0; } setIsPlaying(false); setStatusMsg('Señal interrumpida.'); }; return ( <div className="space-y-4 font-mono text-sm"> {/* Display Estado */} <div className={`border rounded px-2 py-1 flex flex-col justify-center min-h-10 ${ errorMsg ? 'bg-red-950/50 border-red-900' : isHandsFree ? 'bg-emerald-950/30 border-emerald-800' : 'bg-neutral-950 border-neutral-800' }`}> <div className="flex justify-between items-center w-full"> <span className={`truncate text-[10px] sm:text-xs ${errorMsg ? 'text-red-500' : 'text-emerald-500'}`}> > {errorMsg || statusMsg} </span> {isPlaying && !errorMsg && <Activity size={14} className="text-emerald-500 animate-pulse ml-2 flex-shrink-0" />} {isLoading && !errorMsg && <Zap size={14} className="text-amber-500 animate-pulse ml-2 flex-shrink-0" />} {isHandsFree && !isPlaying && !isLoading && !errorMsg && <Mic size={14} className="text-red-500 animate-pulse ml-2 flex-shrink-0" />} </div> </div> {/* Input Texto / Log */} <textarea value={text} onChange={(e) => setText(e.target.value)} className="w-full bg-neutral-950/50 border border-neutral-700 rounded p-2 text-xs text-neutral-300 focus:outline-none focus:border-emerald-500 resize-none h-20" placeholder={isHandsFree ? "Escuchando transcripción en tiempo real..." : "Escribe texto directo o activa Manos Libres..."} readOnly={isHandsFree || isLoading} /> {/* Sliders continuos (controlan SSML en tiempo real) */} <div className="space-y-3 bg-neutral-950/30 p-3 rounded border border-neutral-800"> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Agresiva</span><span className="text-emerald-400">Dulzura [{dulzura}]</span><span>Dulce</span> </div> <input type="range" min="0" max="100" value={dulzura} onChange={(e)=>setDulzura(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-emerald-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Robótica</span><span className="text-pink-400">Aura [{sensualidad}]</span><span>Sensual</span> </div> <input type="range" min="0" max="100" value={sensualidad} onChange={(e)=>setSensualidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-pink-500 cursor-pointer" /> </div> <div className="space-y-1"> <div className="flex justify-between text-[9px] sm:text-[10px] text-neutral-500 uppercase font-bold"> <span>Atenuada</span><span className="text-amber-400">Intensidad [{intensidad}]</span><span>Fuerte</span> </div> <input type="range" min="0" max="100" value={intensidad} onChange={(e)=>setIntensidad(Number(e.target.value))} className="w-full h-1 bg-neutral-800 rounded appearance-none accent-amber-500 cursor-pointer" /> </div> </div> {/* Botones de Control */} <div className="flex flex-col sm:flex-row gap-2"> <button onClick={toggleHandsFree} disabled={isLoading} className={`flex-1 py-2 rounded text-xs font-bold flex items-center justify-center gap-2 transition-colors border ${ isHandsFree ? 'bg-red-900/20 text-red-400 border-red-900/50 hover:bg-red-900/40 shadow-[0_0_10px_rgba(239,68,68,0.2)]' : 'bg-indigo-900/20 text-indigo-400 border-indigo-900/50 hover:bg-indigo-900/40' }`} > {isHandsFree ? <MicOff size={14} /> : <Mic size={14} />} {isHandsFree ? 'Detener Escucha' : 'Manos Libres'} </button> <div className="flex gap-2 flex-1"> <button onClick={handleManualPlay} disabled={isLoading || isPlaying || isHandsFree} className="flex-1 bg-emerald-600/20 hover:bg-emerald-600/40 text-emerald-400 border border-emerald-600/50 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center gap-1 transition-colors" > {isLoading ? <Loader2 size={14} className="animate-spin" /> : <Play size={14} />} Sintetizar </button> <button onClick={stopAudio} disabled={!isPlaying && !isHandsFree} className="px-4 bg-neutral-800 hover:bg-neutral-700 text-neutral-400 border border-neutral-700 disabled:opacity-30 py-2 rounded text-xs font-bold flex items-center justify-center transition-colors" > <Square size={14} /> </button> </div> </div> {/* Botón para limpiar caché (opcional) */} <div className="text-right"> <button onClick={() => audioCache.clear()} className="text-[8px] text-neutral-600 hover:text-neutral-400 underline" > limpiar caché de audio </button> </div> </div> ); }; // --- ENTORNO ESCRITORIO (sin cambios) --- export default function App() { const [widgets, setWidgets] = useState({ voice: { isOpen: true, pos: { x: window.innerWidth > 768 ? window.innerWidth / 2 - 170 : 20, y: 40 } } }); const toggleWidget = (id) => { setWidgets(prev => ({ ...prev, [id]: { ...prev[id], isOpen: !prev[id].isOpen } })); }; return ( <div className="w-full h-screen bg-neutral-950 bg-[radial-gradient(ellipse_80%_80%_at_50%_-20%,rgba(16,185,129,0.1),rgba(0,0,0,1))] overflow-hidden relative font-sans text-neutral-200"> <div className="absolute inset-0 flex items-center justify-center opacity-[0.02] pointer-events-none"><Settings2 size={500} /></div> {widgets.voice.isOpen && ( <DraggableWidget title="MODULADOR VOCAL KORE" icon={Zap} initialPos={widgets.voice.pos} onClose={() => toggleWidget('voice')}> <VoiceModulatorWidget /> </DraggableWidget> )} <div className="absolute bottom-6 left-1/2 transform -translate-x-1/2 bg-neutral-900/80 backdrop-blur-md border border-neutral-700/50 p-2 rounded-2xl shadow-2xl flex gap-2 z-[100]"> <div className="px-3 flex items-center border-r border-neutral-700/50 text-neutral-500"><LayoutGrid size={20} /></div> <button onClick={() => toggleWidget('voice')} className={`px-4 py-2 rounded-xl flex items-center gap-2 text-sm font-medium transition-all ${
Create a 30-second promotional video in a professional marketing style for a mobile phone repair training course. Language & Voiceover: Voiceover in Egyptian Arabic dialect Clear, confident male voice Add on-screen captions (Arabic) synced with the voiceover 🎥 Scene Breakdown Scene 1 (0:00 - 0:05) – Hook Visual: Quick shot of a broken smartphone or a device not working. A frustrated person trying to turn it on. Voiceover: "عارف إن فيه ناس بتدفع آلاف عشان تصليح أعطال تافهة في موبايلاتها؟" Captions: Same text appears bold in center Scene 2 (0:05 - 0:15) – Problem & Solution Visual: Professional close-up shots of opening a phone using repair tools (screwdrivers, multimeter, hot air gun). Fast montage of fixing screen or charging port. Voiceover: "لو معندكش شغل أو عايز تزود دخلك، الفيديو ده ليك.. مجال صيانة الموبايلات مش محتاج منك شهادة ولا سنين خبرة، محتاج بس تتعلم الصح." Captions: Highlight key phrases dynamically Scene 3 (0:15 - 0:25) – Course Offer Visual: Clean shots of tools, workspace, or learning environment On-screen text (center, bold): "30 يوم بس – من الصفر للاحتراف" Voiceover: "أنا بقدم لك كورس صيانة موبايل شامل، هعلمك فيه من الصفر خطوة بخطوة إزاي تشخص العطل وتصلحه بإيدك.. وفي خلال 30 يوم بس، هتكون جاهز تبدأ وتكسب فلوس." Add subtle motion graphics Scene 4 (0:25 - 0:30) – Call to Action Visual: Confident person looking at camera, pointing down Voiceover: "مستني إيه؟ ابعت كلمة (ابدأ) دلوقتي في الكومنتات أو الرسائل وهبعتلك كل التفاصيل." Captions: Emphasize "ابدأ" ⚙️ Video Settings Style: Social media ad (TikTok / Reels / Shorts) Lighting: Bright (ring light or natural light) Music: Light motivational business background music Text: Large, bold, centered captions Quality: HD or 4K Camera: Multiple angles + fast-paced editing Transitions: Smooth, quick, engaging cuts 💡 AI Notes Emphasize professional repair tools (screwdrivers, multimeter, hot air gun) Keep pacing fast and attention-grabbing Make visuals feel modern and clean Optimize for vertical video (9:16) If you want, I can also turn this into: Script for ElevenLabs voiceover CapCut editing template Shot list + exact camera angles
Cartoon illustration, comic book cover featuring a handsome Caucasian man with burst-taper grey hair, wearing a white t-shirt and blue jeans, texting with his blue iPhone, a bold heading text in the background reads "PHONE" in huge bold sharp IMPACT white letters, in the top of the frame, occupying the whole frame, gta art style, gta 5 comics art, gta cover 2d game art, gta cover 2d game art, gta iv art style, rotoscoping, gta art style, gta v artwork style, gangsta rap
Large, stylized, puffy, bubble-lettered text; golden in realistics, forming the words "THE ROYALS"; bold, capital letters; 3D effect; black background;, vibrant colors; bright golden light texture , soft lighting; bold, graphic design; stylized lettering; vibrant, dynamic palette ; graphic design. 8k details
Image Type: Photorealistic Setting: A modern gym or dojo with clean, polished floors and minimal background distractions, conveying a professional and focused training environment. Main Subjects: A Brazilian Jiu-Jitsu athlete in a custom-designed gi. The athlete is in motion, executing a technique on the mat, showing off the vibrant and unique design of the gi. The design should be intricate and personalized, with bold colors. Text Placement & Style: Place the text "Customize Your Gear" in bold, clear white or bright color at the bottom or top of the thumbnail. Make sure the text stands out against the background with high contrast for readability. Overall Mood: Motivational and focused, emphasizing the performance-enhancing effect of personalized gear.