A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
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 fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
A large 3D glossy Arabic letter "أ" (Alif with hamza above), designed in a soft gummy toy style. The letter is smooth, rounded, and slightly inflated, with warm golden-orange color, shiny highlights, and soft reflections. Minimal cute design, centered composition, pastel background with soft star shapes, studio lighting, high detail, Pixar-style 3D render, clean and child-friendly educational illustration, 4k resolution.
Create a clean, modern AI tool thumbnail. Text: Add large, blue bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Face Analysis Overlay (key change): Overlay subtle facial measurement graphics directly on the face: - small glowing or solid dots at key landmarks (eyes corners, nose tip, mouth corners, jawline) - thin clean lines connecting landmarks - a very light face-mesh / mapping effect Keep it minimal, elegant, and readable at thumbnail size. No numbers, no labels, no text on the overlay. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title "AI Face Rater". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks. No sci-fi HUD elements, no aggressive neon effects.
Create a clean, modern AI tool thumbnail. Text: Add large, bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title \"AI Face Rater\". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks.
a close up of the word cora on a pink background, simple 2d flat design, goro, android format, as photograph, skincare, of a youthful japanese beauty, golden ratio jewelry lights, wear's beige shirt, splash screen, with merchant logo, witch academia, interconnections, korean typography, the
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
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 fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
Create a clean, modern AI tool thumbnail. Text: Add large, blue bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Face Analysis Overlay (key change): Overlay subtle facial measurement graphics directly on the face: - small glowing or solid dots at key landmarks (eyes corners, nose tip, mouth corners, jawline) - thin clean lines connecting landmarks - a very light face-mesh / mapping effect Keep it minimal, elegant, and readable at thumbnail size. No numbers, no labels, no text on the overlay. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title "AI Face Rater". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks. No sci-fi HUD elements, no aggressive neon effects.
a close up of the word cora on a pink background, simple 2d flat design, goro, android format, as photograph, skincare, of a youthful japanese beauty, golden ratio jewelry lights, wear's beige shirt, splash screen, with merchant logo, witch academia, interconnections, korean typography, the
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
A large 3D glossy Arabic letter "أ" (Alif with hamza above), designed in a soft gummy toy style. The letter is smooth, rounded, and slightly inflated, with warm golden-orange color, shiny highlights, and soft reflections. Minimal cute design, centered composition, pastel background with soft star shapes, studio lighting, high detail, Pixar-style 3D render, clean and child-friendly educational illustration, 4k resolution.
Create a clean, modern AI tool thumbnail. Text: Add large, bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title \"AI Face Rater\". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks.
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
A large 3D glossy Arabic letter "أ" (Alif with hamza above), designed in a soft gummy toy style. The letter is smooth, rounded, and slightly inflated, with warm golden-orange color, shiny highlights, and soft reflections. Minimal cute design, centered composition, pastel background with soft star shapes, studio lighting, high detail, Pixar-style 3D render, clean and child-friendly educational illustration, 4k resolution.
Create a clean, modern AI tool thumbnail. Text: Add large, blue bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Face Analysis Overlay (key change): Overlay subtle facial measurement graphics directly on the face: - small glowing or solid dots at key landmarks (eyes corners, nose tip, mouth corners, jawline) - thin clean lines connecting landmarks - a very light face-mesh / mapping effect Keep it minimal, elegant, and readable at thumbnail size. No numbers, no labels, no text on the overlay. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title "AI Face Rater". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks. No sci-fi HUD elements, no aggressive neon effects.
Create a clean, modern AI tool thumbnail. Text: Add large, bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title \"AI Face Rater\". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks.
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
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 close up of the word cora on a pink background, simple 2d flat design, goro, android format, as photograph, skincare, of a youthful japanese beauty, golden ratio jewelry lights, wear's beige shirt, splash screen, with merchant logo, witch academia, interconnections, korean typography, the
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
A large 3D glossy Arabic letter "أ" (Alif with hamza above), designed in a soft gummy toy style. The letter is smooth, rounded, and slightly inflated, with warm golden-orange color, shiny highlights, and soft reflections. Minimal cute design, centered composition, pastel background with soft star shapes, studio lighting, high detail, Pixar-style 3D render, clean and child-friendly educational illustration, 4k resolution.
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 clean, modern AI tool thumbnail. Text: Add large, bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title \"AI Face Rater\". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks.
Create a clean, modern AI tool thumbnail. Text: Add large, blue bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Face Analysis Overlay (key change): Overlay subtle facial measurement graphics directly on the face: - small glowing or solid dots at key landmarks (eyes corners, nose tip, mouth corners, jawline) - thin clean lines connecting landmarks - a very light face-mesh / mapping effect Keep it minimal, elegant, and readable at thumbnail size. No numbers, no labels, no text on the overlay. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title "AI Face Rater". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks. No sci-fi HUD elements, no aggressive neon effects.
a close up of the word cora on a pink background, simple 2d flat design, goro, android format, as photograph, skincare, of a youthful japanese beauty, golden ratio jewelry lights, wear's beige shirt, splash screen, with merchant logo, witch academia, interconnections, korean typography, the
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
Create a clean, modern AI tool thumbnail. Text: Add large, bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title \"AI Face Rater\". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks.
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
A large 3D glossy Arabic letter "أ" (Alif with hamza above), designed in a soft gummy toy style. The letter is smooth, rounded, and slightly inflated, with warm golden-orange color, shiny highlights, and soft reflections. Minimal cute design, centered composition, pastel background with soft star shapes, studio lighting, high detail, Pixar-style 3D render, clean and child-friendly educational illustration, 4k resolution.
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 close up of the word cora on a pink background, simple 2d flat design, goro, android format, as photograph, skincare, of a youthful japanese beauty, golden ratio jewelry lights, wear's beige shirt, splash screen, with merchant logo, witch academia, interconnections, korean typography, the
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
Create a clean, modern AI tool thumbnail. Text: Add large, blue bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Face Analysis Overlay (key change): Overlay subtle facial measurement graphics directly on the face: - small glowing or solid dots at key landmarks (eyes corners, nose tip, mouth corners, jawline) - thin clean lines connecting landmarks - a very light face-mesh / mapping effect Keep it minimal, elegant, and readable at thumbnail size. No numbers, no labels, no text on the overlay. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title "AI Face Rater". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks. No sci-fi HUD elements, no aggressive neon effects.
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
Create a clean, modern AI tool thumbnail. Text: Add large, bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title \"AI Face Rater\". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks.
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike
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 large 3D glossy Arabic letter "أ" (Alif with hamza above), designed in a soft gummy toy style. The letter is smooth, rounded, and slightly inflated, with warm golden-orange color, shiny highlights, and soft reflections. Minimal cute design, centered composition, pastel background with soft star shapes, studio lighting, high detail, Pixar-style 3D render, clean and child-friendly educational illustration, 4k resolution.
Create a clean, modern AI tool thumbnail. Text: Add large, blue bold headline text at the very top that says: "AI Face Rater" Use a rounded, friendly modern sans-serif font. Same font style, weight, and spacing as a typical AI cartoon maker tool thumbnail. Solid dark color, high contrast. No shadows, no outlines, no extra effects. Subject: One realistic human face, centered. Professional portrait photography style. Soft studio lighting, natural skin texture. Neutral or confident expression. AI Face Analysis Overlay (key change): Overlay subtle facial measurement graphics directly on the face: - small glowing or solid dots at key landmarks (eyes corners, nose tip, mouth corners, jawline) - thin clean lines connecting landmarks - a very light face-mesh / mapping effect Keep it minimal, elegant, and readable at thumbnail size. No numbers, no labels, no text on the overlay. AI Rating Elements: Below the face (or to the side), add exactly four horizontal rating bars. Bars are simple rounded rectangles with different fill lengths. No labels, no numbers, no icons. Purely visual rating indicators. Background & Style: Light blue soft gradient background. Rounded cards and UI elements. Clean, friendly, premium SaaS aesthetic. Composition: Clear hierarchy: title at top, face centered, bars below. Balanced spacing for thumbnail readability. Restrictions: No text anywhere except the title "AI Face Rater". No cartoon or illustrated face. No hand-drawn textures. No sketch effects. No logos, no watermarks. No sci-fi HUD elements, no aggressive neon effects.
a close up of the word cora on a pink background, simple 2d flat design, goro, android format, as photograph, skincare, of a youthful japanese beauty, golden ratio jewelry lights, wear's beige shirt, splash screen, with merchant logo, witch academia, interconnections, korean typography, the
A fun, engaging, and high-quality children's coloring book cover designed in a **cartoon-style with thick black outlines**, matching the exact design of the animals featured inside the book. The cover should be **bright, playful, and visually appealing to children aged 4-8**, with a well-balanced layout that is simple yet exciting. #### **📖 Title & Text Elements** * The title **'50 Animals Coloring Book & Fun Facts for Kids'** should be displayed prominently at the top in **a large, bold, rounded font**, making it easy for kids and parents to read. * Below the title, add a **cheerful tagline** that says: **'Discover a Colorful World of Amazing Animals!'** in a friendly, fun font. * Include a **bright yellow badge** or sticker on the side that says: **'50 Cute Animals to Color!'** #### **🎨 Background & Composition** * The background should be bright and cheerful, using **soft pastel colors** with a **nature-inspired scene**: * **Blue sky with fluffy white clouds** * **Rolling green hills, grass, and a few simple flowers** * A **playful, cartoon-style sun** in the top corner * The animals should be placed in a **semi-circle or group formation**, appearing friendly and inviting. #### **🐾 Featured Cartoon-Style Animals (Matching Inside Designs)** The cover must feature a **selection of the cutest animals from inside the book**, drawn in the same **simple, thick-lined cartoon style**. The animals should be arranged to **interact playfully**, making them look fun and engaging. The featured animals include: 🦁 **A smiling lion sitting proudly** in the center with a fluffy mane 🐘 **A cheerful elephant** with big ears, raising its trunk playfully 🦒 **A gentle giraffe** tilting its head with a friendly expression 🐬 **A happy dolphin** leaping from a small wave, adding a fun ocean element 🦊 **A cute fox sitting with perked-up ears**, looking curious 🐵 **A silly monkey hanging from a tree branch**, waving 🐢 **A small, happy turtle walking** on the grass with a big smile 🦉 **A wise owl perched on a branch**, looking friendly 🐄 **A joyful cow standing in the field**, giving a warm expression 🦜 **A colorful parrot spreading its wings**, appearing excited Each animal should have **a thick black outline with no shading**, keeping the **same consistency** as the book’s **interior pages**. #### **🌟 Extra Elements for Appeal** * A **cute, playful border or frame** around the main image to give a polished look. * Keep the **focus on the animals**, ensuring they stand out with a **clean and uncluttered layout**. * **Bright and bold colors** but not overly saturated to maintain a **kid-friendly aesthetic**. * The back cover can include a **"Thank you for choosing this book!"** message with **a small preview of additional pages** inside. ### **🔹 Important Design Notes:** * Maintain the **same art style** as the book’s interior animals (thick black outlines, cartoon-style). * The title and elements should be **high contrast and easy to read**. * Ensure **high resolution (300 DPI) for print quality** if publishing. * Design should be **balanced**, with **no overcrowding of elements**. This cover should **instantly attract** both children and parents by looking fun, educational, and engaging!"\* In the foreground, an assortment of adorable, cartoon-style animals is prominently displayed. The characters should include a **smiling lion, a happy elephant, a cheerful giraffe, a playful dolphin leaping, and a cute fox sitting with a curious expression**. Each animal is drawn with **thick black outlines** and a simple, friendly design suited for young children (ages 4-8). The animals should be arranged in a semi-circle, inviting young artists to explore their creativity. The title should be placed at the top in large, colorful text, while a small tagline below reads, **'Discover a Colorful World of Amazing Animals!'** in a fun, bubbly font. A **round, yellow badge** in one corner highlights ‘50 Animals to Color!’ to grab attention. A small, fun, handwritten-style callout at the bottom says, **'Color, Learn, and Explore!'** for extra excitement. A vibrant, engaging children's coloring book cover featuring a playful, cartoon-style design. The title, **'50 Animals Coloring Book & Fun Facts for Kids,'** is large, bold, and colorful, using a fun, rounded font suitable for young children. The background is bright and cheerful, featuring a **soft blue sky with fluffy white clouds** and **rolling green grasslands**, making the cover visually inviting. The foreground showcases **adorable, cartoon-style animals**, carefully chosen to match those inside the book. The featured animals should include: 🦁 **A friendly lion** sitting with a happy expression 🐘 **A joyful elephant** with big ears and a raised trunk 🦒 **A cheerful giraffe** with a long neck and gentle smile 🐬 **A playful dolphin** jumping from the water 🦊 **A curious fox** sitting with perked-up ears 🐵 **A mischievous monkey** hanging from a tree 🐢 **A cute turtle** with a rounded shell and happy eyes 🦉 **A wise owl** perched on a branch, looking friendly 🐄 **A smiling cow** standing in a field 🦜 **A colorful parrot** spreading its wings Each animal is drawn with **thick black outlines** and a simple, friendly design, making them appealing for children ages **4-8**. They should be arranged in a **semi-circle**, making them look as if they are happily posing for a group picture, ready for kids to color. The **title** is placed at the top in large, colorful text, while a **small tagline below reads**: **'Discover a Colorful World of Amazing Animals!'** in a playful, bubbly font. A **bright yellow badge** on one side highlights **‘50 Animals to Color!’** to grab attention. At the bottom, a small fun callout says, **'Color, Learn, and Explore!'** for extra excitement. The overall design should be **clean, balanced, and high-quality**, ensuring **vibrant but not overly saturated colors** for a visually appealing book cover. Only cheerful, inviting expressions on the animals to make it engaging for kids and parents alike