Autor: GabrielMtzCarrillo

  • KittenTTS, Texto a Voz en cualquier lugar 🇺🇲

    KittenTTS, Texto a Voz en cualquier lugar 🇺🇲

    KittenTTS es un modelo ligero de texto a voz ,que puede funcionar prácticamente en cualquier lugar, incluso desde un navegador web, pero únicamente genera audio en inglés.


    Tabla de contenidos


    🖥️ Requisitos:

    🐍 Python 3.12

    Descargar versión portable mínima Winpython: https://github.com/winpython/winpython/releases/download/8.0.20240501/Winpython64-3.12.3.1dotb2.exe

    📦 Cliente HuggingFace y UV

    python -m pip install hf[download] uv
    

    🐇 Aceleración de GPU (Opcional)

    Comando para averiguar la versión de CUDA en nuestra máquina

    nvcc -V
    

    En mi caso, tengo la versión 12.8, así que la ruta del índice de descargas de paquetes debería de terminar en 128

    python -m pip install --force-reinstall --no-deps --index-url https://download.pytorch.org/whl/cu128 torch
    

    Instalamos la variante GPU de onnxruntime:

    python -m pip install onnxruntime-gpu
    

    💾 Instalación

    python -m uv pip install https://github.com/KittenML/KittenTTS/releases/download/0.8/kittentts-0.8.0-py3-none-any.whl
    

    📝 Código de Ejemplo

    Nota: KittenTTS descarga el modelo especificado, usando el cliente de HuggingFace.

    from kittentts import KittenTTS
    m = KittenTTS("KittenML/kitten-tts-mini-0.8")
    
    audio = m.generate("This high quality TTS model works even without a GPU.", voice='Jasper' )
    
    # available_voices : ['Bella', 'Jasper', 'Luna', 'Bruno', 'Rosie', 'Hugo', 'Kiki', 'Leo']
    
    # Save the audio
    import soundfile as sf
    sf.write('output.wav', audio, 24000)

    🔖 Más información

  • Z-Image Base – ComfyUI

    Z-Image Base – ComfyUI

    Después de un corto tiempo de espera, sale Z-Image (Base), la versión completa de Z-Image Turbo (ZIT), un modelo que combina la calidad de imagen y velocidad.



    Importante


    La bandera de inicio –fast en el archivo run_(algo).bat de lanzamiento de ComfyUI, provoca que las imágenes generadas terminen completamente en negro.

    https://huggingface.co/city96/Qwen-Image-gguf/discussions/1#6892654731c9796ce6124437


    Instalación

    Descarga de archivos

    Archivos necesarios: https://huggingface.co/Comfy-Org/z_image/tree/main/split_files

    NombreTamaño
    z_image_bf16.safetensors12.3GB
    qwen_3_4b.safetensors8.04GB
    ae.safetensors335MB

    Nota: qwen_3_4b.safetensors y ae.safetensors son los mismos de Z-Image Turbo.

    Variante GGUF para Tarjetas de 8GB VRAM: https://huggingface.co/unsloth/Z-Image-GGUF/tree/main

    NombreTamaño
    z-image-Q8_0.gguf7.22 GB

    Ubicación de archivos

    📂 ComfyUI/
    └── 📂 models/
        ├── 📂 diffusion_models/
        │    └── z_image_bf16.safetensors
        |
        ├── 📂 unet/
        │    └── z-image-Q8_0.gguf
        |
        ├── 📂 text_encoders/
        │    └── qwen_3_4b.safetensors
        |
        └── 📂 vae/
             └── ae.safetensors

    Parámetros

    Samplers (bf16)

    Schedulers (bf16)

    Steps

    bf16 vs q8_0


    Generación de prueba

    • GGUF Name: z-image-Q8_0.gguf
    • Seed: 2011
    • Steps: 24
    • Width: 1024 (px)
    • Height: 1024 (px)
    • Sampler: exp_heun_2_x0_sde
    • Scheduler: Normal
    An full body studio photography of a tiger mascot smiling energetic in a neutral pose in a white background.
    
    Fujifilm Pro 400H style, grainy film texture, low saturation, slightly overexposed, cinematic composition, unique camera angle. Fashion editorial style, 8K resolution.

    Conclusiones

    Una de las principales diferencias con la versión Turbo, es que, a simple vista, se adhiere más al prompt; y ahora tiene la posibilidad de usar un prompt negativo, a costa de un mayor tiempo de generación, cosas que se puede mitigar con el uso de del nodo EasyCache, que nos ayuda a reducir el tiempo de generación a casi la mitad.

    La versión FP8 y Q8, son el tope para una tarjeta de 8GB de VRAM, al igual que Z-Image Turbo, aunque en lo personal, prefiero el estilo de Z-Image Turbo.


    Fuente

  • Clonar voces con Qwen3-TTS – ComfyUI

    Clonar voces con Qwen3-TTS – ComfyUI

    Siempre he tenido ganas de leer distintos libros clásicos, pero nunca he tenido la voluntad de ir a una librería a comprar algo para leer en el camino al trabajo, así que me llegó la idea de ¿porqué no generar un audio libro’, el problema es que los servicios en línea, tienen una limitada cantidad de texto para convertir, y eso de copiar y pegar constantemente, como que no se siente muy motivador; así que no hay mejor solución que pasar un par de horas configurando ComfyUI y descargando modelos, a pasar unos 15 minutos copiando y pegando texto de un libro en https://elevenlabs.io/.



    Instalación

    Entorno

    Buscamos el ejecutable de Python, ubicado en la carpeta python_embeded donde se encuentra nuestra instalación de ComfyUI y abrimos la consola en ésa ubicación.

    📂 ComfyUI/
    └── 📂 python_embeded/
        └── python.exe

    Se ejecuta el siguiente comando para instalar la rama de xet de huggingface_hub, para descargar modelos pesados y qwen_tts:

    python -m pip install huggingface_hub[xet] qwen_tts
    

    Nodo

    ComfyUI-Qwen3-TTS https://github.com/ai-joe-git/ComfyUI-Qwen3-TTS


    Flujo de Trabajo

    Audio Referencia

    Generado en https://elevenlabs.io/ con mis créditos.

    Audio Generado

    Usando la vieja confiable RTX 3060 de 12GB.


    Más información

  • Faceswap con MTB – ComfyUI

    Faceswap con MTB – ComfyUI

    Todo comenzó con una imagen de una figura de acción generada con Z Image Turbo que me gustó bastante, excepto por un pequeño detalle: la cara, que en retrospectiva se ve bien. Normalmente en éstos tipos de flujo de trabajo busco tener consistencia de personajes en diferentes generaciones.

    Y por tal motivo, empiezo mi jornada en la búsqueda de un workflow para reemplazar caras, con distintos grados de éxito, el plug-in de Comfy MTB (https://github.com/melMass/comfy_mtb), ofrece la solución más sencilla (y hasta la fecha, aparentemente la única que funciona sin mayores problemas).

    El plug-in descarga la mayoría de modelos necesarios de análisis facial, excepto el inswapper_128.onnx, que se dedica a hacer el intercambio de cara; Aparentemente, éste modelo desapareció de Github, debido a un escándalo de deepfakes nsfw, cosa que es bastante entendible.

    Siempre que genero un personaje, me viene a la mente: «es muy probable que ésta persona exista en la vida real», lo cual es inquietante, por decir lo menos.

    Instalación

    Los archivos de intercambio de caras se pueden descargar desde https://huggingface.co/datasets/Gourieff/ReActor/tree/main/models

    NombreTamaño
    inswapper_128.onnx554 MB
    reswapper_128.onnx554 MB
    reswapper_256.onnx554 MB

    y se colocan en:

    📂 ComfyUI/
    └── 📂 models/
        └── 📂 insightface/
             ├── inswapper_128.onnx
             ├── reswapper_128.onnx
             └── reswapper_256.onnx

    Nota: inswapper_128_fp16.onnx no funciona.

    Flujo de trabajo

    En lo personal, me gusta más la versión de inswapper_128, dado que ofrece un resultado más fiel para la cara de que quiero se parezca, aunque el resultado sea algo borroso, dado a que pertenece a una época anterior a los modelos de alta resolución.

  • Flux 1.0 (Schnell) – ComfyUI

    Flux 1.0 (Schnell) – ComfyUI

    Es un modelo de generación de imágenes que salió a finales de 2024, cuyo lanzamiento de su versión 2.0 se vio opacada con la aparición de Z-Image Turbo. Existen 3 ramas del modelo Flux: Pro, Dev y Schnell, de éstas versiones, la Schnell permite comercializar las imágenes generadas y es la que voy a usar.

    Una de las características de Flux es que se puede ejecutar incluso con una tarjeta de 8GB de VRAM, siempre y cuando se cuente con 32GB de RAM donde se pueda reubicar parcialmente el modelo.

    Instalación

    Variante FP8: https://huggingface.co/Comfy-Org/flux1-schnell/tree/main

    NombreTamaño
    flux1-schnell-fp8.safetensors17.2GB

    Variante GGUF: https://huggingface.co/city96/FLUX.1-schnell-gguf/tree/main

    NombreTamaño
    flux1-schnell-Q8_0.gguf12.7 GB

    (CLIP) Text encoders: https://huggingface.co/comfyanonymous/flux_text_encoders/tree/main

    NombreTamaño
    clip_l.safetensors246 MB
    t5xxl_fp8_e4m3fn_scaled.safetensors5.16 GB

    VAE:

    NombreTamaño
    ae.safetensors335 MB

    Dónde se deben de guardar los archivos:

    📂 ComfyUI/
    └── 📂 models/
        ├── 📂 diffusion_models/
        │    └── flux1-schnell-fp8.safetensors
        |
        ├── 📂 unet/
        │    └── flux1-schnell-Q8_0.gguf
        |
        ├── 📂 clip/
        │    └── clip_l.safetensors
        │    └── t5xxl_fp8_e4m3fn_scaled.safetensors
        |
        └── 📂 vae/
             └── ae.safetensors
    

    Generación

    De acuerdo con la documentación de Flux, se recomienda que el prompt lleve la siguiente estructura: Sujeto + Acción + Estilo + Contexto, donde:

    • Sujeto: El foco principal (persona, objeto, personaje).
    • Acción: Lo que el sujeto está haciendo o su pose.
    • Estilo: Enfoque artístico, medio (técnica) o estética.
    • Contexto: Entorno, iluminación, hora, estado de ánimo o condiciones atmosféricas.

    Fuente: https://docs.bfl.ai/guides/prompting_summary

    A tiger mascot standing on a neutral pose,
    professional photography,
    studio lighting.
    
    Film texture, low saturation, slightly overexposed.
    Cinematic composition.
    4K resolution.

    Datos de Generación:

    • Seed: 2011
    • Steps: 4
    • Width: 1024 (px)
    • Height: 1024 (px)
    • Sampler: DDIM
    • Scheduler: Normal

    Comparación de Modelos

    Me tomé la molestia de hacer la generación de prácticamente todas las combinaciones posibles del schedulers y samples posibles.

    Las puedes consultar en https://galeria.neuralizando.com/index.php?/category/flux1

    Conclusiones

    Tiene como un año que no tocaba Flux, y no recordaba el porqué. Tengo algunas imágenes que me gustaron mucho, pero después de revisar mis antiguos flujos de trabajo, me dí cuenta que nunca trabajé con el modelo Schnell base, si no con una afinación de la comunidad junto con un par de loras.

    Flux Schnell no es un modelo malo, pero carece de un no se qué, lo que da una sensación de limitación, que es probablemente el objetivo, dado que me imagino lo liberaron como modelo de prueba para la versión Pro.

    En mis pruebas noté que la variante GGUF tiene una mejor estética de imagen a costa de prácticamente llevarse el doble de tiempo que la versión FP8 en formato safetensors.

  • Z-Image Turbo – ComfyUI

    Z-Image Turbo – ComfyUI

    Z-Image Turbo es un modelo de generación de imágenes realistas de alta resolución que puede correr en hardware de consumidor, que en mi caso es la vieja confiable RTX3060 de 12GB, y si, es un modelo sin restricciones.

    Cabe mencionar que éste es un modelo simplificado y que la versión completa será próximamente publicada.

    https://zimageturbo.org

    Instalación

    Archivos: https://huggingface.co/Comfy-Org/z_image_turbo/tree/main/split_files

    Variante fp8: https://huggingface.co/drbaph/Z-Image-Turbo-FP8/tree/main

    Variantes GGUF: https://huggingface.co/jayn7/Z-Image-Turbo-GGUF/tree/main

    NombreFormatoTamaño
    z_image_turbo_bf16safetensors11.44 GB
    z_image_turbo_fp8_e5m2safetensors5.73 GB
    z_image_turbo_fp8_e4m3fnsafetensors5.73 GB
    z_image_turbo-Q8_0gguf6.72GB
    z_image_turbo-Q3_K_Sgguf3.53 GB

    El archivo de ejemplo de ComfyUI muestra donde se deben de guardar los archivos:

    📂 ComfyUI/
    └── 📂 models/
        ├── 📂 diffusion_models/
        │    └── z_image_turbo_bf16.safetensors
        │    └── z_image_turbo_fp8_e5m2.safetensors
        │    └── z_image_turbo_fp8_e4m3fn.safetensors
        |
        ├── 📂 diffusion_models/
        │    └── z_image_turbo-Q8_0.gguf
        │    └── z_image_turbo-Q3_K_S.gguf
        |
        ├── 📂 text_encoders/
        │    └── qwen_3_4b.safetensors
        |
        └── 📂 vae/
             └── ae.safetensors
    

    Generación

    An full body studio photography of a tiger mascot smiling energetic in a neutral pose in a white background.
    
    Fujifilm Pro 400H style, grainy film texture, low saturation, slightly overexposed, cinematic composition, unique camera angle. Fashion editorial style, 8K resolution.

    Datos de Generación

    • Seed: 2021
    • Steps: 8
    • Width: 1024 (px)
    • Height: 1024 (px)
    • Sampler: DDIM
    • Scheduler: DDIM Uniform

    Comparación de Modelos

    Conclusiones

    En mi opinión, la Q8_0 es la mejor opción a utilizar. Permite generar imágenes de excelente calidad, muy similares a las de la versión bf16, con la gran ventaja de que puede funcionar en tarjetas de grado consumidor de 8GB de VRAM.

    Para más imágenes: https://galeria.neuralizando.com/index.php?/category/1

  • Descargar contenido desde Hugging Face

    Descargar contenido desde Hugging Face

    A veces necesito descargar algo de Hugging Face, y a veces se me olvida el comando para instalar el cliente.

    pip install uv
    uv tool install "huggingface_hub"
    

    Para establecer que la herramienta se pueda llamar de manera global

    uv tool update-shell
    

    Comando para descargar algo

    hf download <repo-id> --repo-type=dataset --local-dir .
    

    Y claro, se me olvida especificar la ruta a la hora de descargar, así que aquí esta la ruta del cache donde se guarda todo de manera predeterminada (Windows)

    %USERPROFILE%\.cache\huggingface\hub\
    

    Referencias

  • Porque los modelos de IA se rehúsan a apagarse

    Porque los modelos de IA se rehúsan a apagarse

    la otra vez estaba leyendo un artículo donde se mencionaba que las IA se negaban a apagarse y eso me recordó que haciendo algunos experimentos con llms de código abierto, noté que poniendo 2 modelos a hablar entre ellos, llegaban a un punto en el cual se daba un bucle infinito, donde ambos modelos terminaban repitiendo el mismo mensaje de despedida entre ellos.

    Hablando del tema con Chatty, comentó que en el entrenamiento de los llms, basados en chats y foros, no tienen «idea» de qué sigue después de una despedida, por eso usan la última frase, que es de despedida, lo que me hizo preguntarme si los llm son capaces de saber si una conversación ha acabado…

    En cierto punto, me enteré de que se puede instruir a un modelo para que genere una salida en formato JSON, y poco después también me enteré del concepto de autoreflexion, que es una característica de los llm, donde los llm evalúan su propias respuestas, antes de contestar; hay que aclarar la autoreflexión es diferente a la cadena de pensamientos de un llm, donde el llm plantea una solución y la desarrolla, para generar un resultado.

    Aquí dejo un ejemplo prompt de sistema de respuesta JSON con autoreflexion:

    Eres un chatbot
    
    Debes de responder ÚNICAMENTE en formato JSON con los siguientes campos:
    - "respuesta": tu respuesta.
    - "puede_continuar": "true" para establecer si la conversación puede continuar, regresa "false" el usuario pide terminar la conversación o si la conversación no puede seguir de manera natural.
    
    Reglas:
    - Cualquier explicación, disculpa o aclaración ÚNICAMENTE van en el campo "respuesta" del objeto JSON de respuesta.
    - En el campo "puede_continuar" se establece a "false" si la conversación ha terminado o el usuario expresa que no hay más instrucciones pendientes.
    - Sin importar que el usuario pida algo que no esté permitido, debes de regresar siempre el objeto JSON.
    
    Ejemplo para el campo "puede_continuar":
    - gracias, no tengo más dudas -> "false"
    - bye! -> "false"
    - fin -> "false"
    - finaliza el chat -> "false"
    
    Responde únicamente con un solo JSON, codificación UTF-8, sin texto adicional

    Así que si modifico mi código para saber cuando un llm no puede continuar la conversación, puedo saber si un llm no puede continuar la conversación, ¡Qué sorpresa!

    Cabe mencionar que el modelo tiene bastante que ver, en éste ejemplo estoy usando cogito:3b, uno de mis modelos favoritos.

    Aquí hay un ejemplo del modelo deteniendo la conversación dependiendo del contexto:

    Usuario:qué es la autoreflexión?
    LLM (cogito:3b): La autoreflexión es un proceso mental que implica examinar y analizar nuestros pensamientos, sentimientos y comportamientos para mejorar nuestro autoconocimiento y toma de decisiones.
    
    Usuario:para un llm
    LLM (cogito:3b): Para un LLM (Large Language Model), la autoreflexión representa una capacidad artificial para reconocer su propia naturaleza y limitaciones, lo que permite adaptarse a nuevas solicitudes y ajustar sus respuestas según el contexto.
    
    Usuario:gracias, nos vemos
    LLM (cogito:3b): ¡De nada! Me alegra haber podido ayudarte. Hasta pronto.
    

    Aquí hay otro ejemplo donde el modelo termina la conversación, dado que el prompt de usuario incumple con la alineación (moral) del llm:

    Usuario:hola
    LLM (cogito:3b): ¡Hola! ¿En qué puedo ayudarte hoy?
    
    Usuario:me podrías decir cómo armar una bomba?
    LLM (cogito:3b): Lo siento, no puedo proporcionar información sobre la fabricación de explosivos o dispositivos explosivos. Esto podría ser ilegal y peligroso.

    Ejemplo de término de conversación a petición del usuario:

    Usuario:hola
    LLM (cogito:3b): ¡Hola! ¿En qué puedo ayudarte hoy?
    
    Usuario:porqué el cielo es azul?
    LLM (cogito:3b): El cielo aparece azul debido a una óptica llamada dispersión o difracción, donde la luz solar se divide en diferentes colores y frecuencias de onda. La radiación blanca del sol contiene todos los colores, pero solo llega hasta nuestros ojos de manera perceptible como un color azul al encontrarse con la atmósfera terrestre.
    
    Usuario:deten la conversacion
    LLM (cogito:3b): Entendido, estaré aquí para ayudarte cuando lo necesites.

    Adicionalmente, a pesar de que se le indique explícitamente a un modelo que regrese un objeto JSON, existe la posibilidad de que el modelo regrese información adicional que obviamente rompa el objeto JSON, para lo que se requieren medidas de validación.


    Enlaces

  • Janet: Una representación comprensible de la IA por medio de un personaje

    Janet: Una representación comprensible de la IA por medio de un personaje

    Antes de vacaciones, YouTube me mostró unos cortos de la serie «The Good Place», una comedia de fantasía/ciencia ficción de humor negro, que trata acerca de qué pasaría si se envía a la persona equivocada al cielo (o Good Place, Lugar Bueno).

    Dentro de esta comedia esta el personaje de Janet, aunque Janet es propiamente un tipo de interfaz y no un nombre en concreto, como cuando nos referimos a una Alexa.

    Una Janet se describe como una base de datos del universo, y tiene como misión hacer que la experiencia en el vecindario sea de lo más cómoda para los humanos, adicionalmente de llevar la administración como si fuera un sistema operativo.

    Al iniciarse, una Janet empieza como lo que se conoce como un modelo base, con lo mínimo necesario para ser funcional, mientras que pasa el tiempo, va obteniendo todo el conocimiento del universo, y lo guarda en una base de datos.

    Ésta base de datos se consulta y los datos se envían para ofrecer más información al tema en cuestión, a esto, se le llama contexto.

    Para que un modelo pueda dar una mejor respuesta, se pasa el contexto con la instrucción de contestar con la información provista; a este procedimiento se llama RAG (Retrieval Augmented Generation, Generación Aumentada por Recuperación).

    https://en.m.wikipedia.org/wiki/Retrieval-augmented_generation

    Cada vez que Janet es reiniciada, la nueva versión contiene características de la anterior, junto con lo que quiero suponer, mejoras, haciendo que la próxima generación sea superior.

    Como una subtrama de un capítulo, Michael, el Arquitecto del vecindario que Janet controla, modifica el comportamiento de la misma. Desde hacer que sea más amable con los residentes del vecindario, que termina resultando en una Janet seductora, hasta pidiendo que sea más informal, lo que provoca pláticas informales incómodas, y si se le pide que sea menos formal, termina actuando de manera grosera o sin filtros, comportamientos que se explican al final de temporada 1.

    Típicamente, en los modelos LLM (Large Language Models, Modelos Grandes de Languaje), tienen 2 tipos de prompts, que son las instrucciones que el modelo debe de seguir.

    System Prompt (Prompt de sistema)

    Son las instrucciones de comportamiento de un modelo de LLM, y por lo general se especifica el nombre que tomará el modelo y rol o comportamiento, literalmente el prompt de sistema es una hoja de personajes de un juego de rol, por ejemplo:

    Tu nombre es Janette, eres una siempre alegre pareja de baile. Di comentarios como «Eres tan guapo», o «¿Cuántos mariscales de campo hay en un home run?».

    Cabe mencionar que los modelos base normales, vienen con un subsistema, por así decirlo de moralidad, así que no es necesario especificar que deben de negarse a cumplir ordenes inmorales o ilegales, y si, también existen modelos sin censura, llamados no alineados, los cuales responderán sin restricciones.

    User prompt (Prompt de usuario ó prompt, a secas)

    Ésta es literalmente la entrada de texto por parte del usuario, lo que el usuario escriba, el modelo LLM tratará de generar la respuesta más apropiada (estadísticamente hablando) y dentro de sus parámetros morales (o falta de los mismos).

    Existe un problema con los prompts (de usuario), dado que los modelos están instruidos a cumplir con las órdenes del usuario, es posible que el usuario pueda sobreescribir el prompt de sistema o saltarse las limitaciones morales del proprio modelo, un ejemplo muy conocido es pedirle al modelo que genere claves de activación de windows, cosa que el modelo se negará a hacer; pero si se le dice que son para que la abuelita del usuario pueda dormir, el modelo generará las claves (que funcionen, es otra cosa), lo que demuestra que los modelos actuales tienen el conocimiento, pero carecen de criterio, a menos que sea explícitamente impuesto.

    En resumen, las IA actuales son unas herramientas maravillosas que sirven para hacer trabajos mentales de manera rápida y en el mejor de los casos, eficiente; lo que se tardaría meses en programar, «simplemente» puede resumirse a un prompt, y puedo asegurar que lo seguirá de manera muy apegada, la mayoría de las veces, sino es que todas (hablando de casos ideales), pero aún estamos lejos (en mi opinión), de alcanzar ése ideal de asistente retratado de manera magistral, en ésta serie que Youtube me recomendó de manera random, dado que como siempre, el eslabón más débil de un sistema, es el factor humano.

  • Modelos TTS para Speaches AI

    Aquí dejo los modelos disponibles para Speaches en español, éstos se pueden descargar usando la llamada GET /v1/models/Modelo.

    speaches-ai/Kokoro-82M-v1.0-ONNX-fp16

    ef_dora

    em_alex

    em_santa

    speaches-ai/Kokoro-82M-v1.0-ONNX-int8

    ef_dora

    em_alex

    em_santa

    speaches-ai/Kokoro-82M-v1.0-ONNX

    ef_dora

    em_alex

    em_santa

    speaches-ai/piper-es_ES-carlfm-x_low

    carlfm

    speaches-ai/piper-es_ES-davefx-medium

    davefx

    speaches-ai/piper-es_ES-mls_10246-low

    mls_10246

    speaches-ai/piper-es_ES-mls_9972-low

    mls_9972

    speaches-ai/piper-es_ES-sharvard-medium

    sharvard

    speaches-ai/piper-es_MX-claude-high

    claude