[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-justUmen--Bjornulf_custom_nodes":3,"tool-justUmen--Bjornulf_custom_nodes":62},[4,18,26,35,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",109154,2,"2026-04-18T11:18:24",[14,15,13],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":32,"last_commit_at":41,"category_tags":42,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[43,13,15,14],"插件",{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":10,"last_commit_at":50,"category_tags":51,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[52,15,13,14],"语言模型",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4292,"Deep-Live-Cam","hacksider\u002FDeep-Live-Cam","Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具，用户仅需一张静态照片，即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点，让高质量的数字内容创作变得触手可及。\n\n这款工具不仅适合开发者和技术研究人员探索算法边界，更因其极简的操作逻辑（仅需三步：选脸、选摄像头、启动），广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换，还是制作趣味短视频和直播互动，Deep-Live-Cam 都能提供流畅的支持。\n\n其核心技术亮点在于强大的实时处理能力，支持口型遮罩（Mouth Mask）以保留使用者原始的嘴部动作，确保表情自然精准；同时具备“人脸映射”功能，可同时对画面中的多个主体应用不同面孔。此外，项目内置了严格的内容安全过滤机制，自动拦截涉及裸露、暴力等不当素材，并倡导用户在获得授权及明确标注的前提下合规使用，体现了技术发展与伦理责任的平衡。",88924,"2026-04-06T03:28:53",[14,15,13,61],"视频",{"id":63,"github_repo":64,"name":65,"description_en":66,"description_zh":67,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":76,"owner_company":77,"owner_location":77,"owner_email":78,"owner_twitter":77,"owner_website":77,"owner_url":79,"languages":80,"stars":89,"forks":90,"last_commit_at":91,"license":77,"difficulty_score":10,"env_os":92,"env_gpu":92,"env_ram":92,"env_deps":93,"category_tags":96,"github_topics":97,"view_count":32,"oss_zip_url":77,"oss_zip_packed_at":77,"status":17,"created_at":100,"updated_at":101,"faqs":102,"releases":138},9049,"justUmen\u002FBjornulf_custom_nodes","Bjornulf_custom_nodes","ComfyUI : 163 nodes : Display, manipulate, and edit text, images, videos, loras and more. Manage looping operations, generate randomized content, use logical conditions and work with external AI tools, like Ollama or Text To Speech.","Bjornulf_custom_nodes 是一套专为 ComfyUI 打造的高效扩展插件包，集成了超过 160 个自定义节点，旨在全面提升用户在文本、图像、视频及 LoRA 模型处理上的工作流能力。它主要解决了原生 ComfyUI 在复杂逻辑控制、内容随机化生成以及多模态数据交互方面的局限性，让用户能够轻松实现循环操作、条件判断、手动流程暂停以及与 Ollama、文字转语音等外部 AI 工具的无缝对接。\n\n这套工具特别适合希望突破基础绘图限制的设计师、需要构建复杂自动化流程的开发者，以及热衷于探索 AI 创作边界的进阶用户。其独特亮点在于提供了极其丰富的文本操控功能，从简单的字符替换、随机行选择，到专业的角色描述生成器和全局变量管理，应有尽有。此外，它还增强了可视化调试能力，支持多种数据类型（如 JSON、浮点数）的实时预览与笔记标注，让复杂的节点连接一目了然。作为一个持续快速迭代的项目，Bjornulf_custom_nodes 正不断引入新特性，帮助用户将创意更灵活、更精准地转化为现实作品。","# 🔗 Comfyui : Bjornulf_custom_nodes v1.1.8 🔗\n\nA list of 170 custom nodes for Comfyui : Display, manipulate, create and edit text, images, videos, loras, generate characters and more.  \nYou can manage looping operations, generate randomized content, trigger logical conditions, pause and manually control your workflows and even work with external AI tools, like Ollama or Text To Speech.  \n\n⚠️ Warning : Very active development. Work in progress. 🏗  \n\nLast update video :  \n[![Watch the video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6cad461b6990.jpg)](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=YiGgyh7nQRg)  \n\n# Watch Video (Quick overview 28 minutes) + Updates in video playlist :\n[![Watch the video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3b8e14b0c659.jpg)](https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PL_hRi_PPLLWvUNfG_np_d3K0nBCabM3iQ)\n\n# Coffee : ☕☕☕☕☕ 5\u002F5\n\nVery active development, new nodes, new features, new ideas, new possibilities...  \nLet me know if you have any issues, they must be solved for everyone !  \n\nSupport me, this project and my other AI exciting projects : ❤️❤️❤️ \u003Chttps:\u002F\u002Fko-fi.com\u002Fbjornulf> ❤️❤️❤️\n\n# ☘ This project is part of my AI trio. ☘\n\n1 - 📝 Text\u002FChat AI generation : [Bjornulf Lobe Chat Fork](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_lobe-chat)  \n2 - 🔊 Speech AI generation : [Bjornulf Text To Speech](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_XTTS)  \n\u003Cu>**3 - 🎨 Image AI generation :** [Bjornulf Comfyui custom nodes](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes) (you are here)\u003C\u002Fu>  \n\n# 📋 Nodes menu by category\n\n## 👁 Display and Show 👁\n`1.` [👁 Show (Text, Int, Float)](#1----show-text-int-float)  \n`49.` [📹👁 Video Preview](#49----video-preview)  \n`68.` [🔢 Add line numbers](#68----add-line-numbers)  \n`71.` [👁 Show (Int)](#71----show-int)  \n`72.` [👁 Show (Float)](#72----show-float)  \n`73.` [👁 Show (String\u002FText)](#73----show-stringtext)  \n`74.` [👁 Show (JSON)](#74----show-json)  \n`126.` [📒 Note](#126----note)  \n`127.` [🖼📒 Image Note (Load image)](#130----image-note-load-image)  \n`128.` [🖼👁 Preview (first) image](#128----preview-first-image)  \n`130.` [📥🖼📒 Image Note (Load image)](#130----image-note-load-image)  \n`133.` [🖼👁 Preview 1-4 images (compare)](#128----preview-first-image)  \n\n## ✒ Text ✒\n`2.` [✒ Write Text](#2----write-text)  \n`3.` [✒🗔🅰️ Advanced Write Text (+ 🎲 random option)](#3---🅰%EF%B8%8F-advanced-write-text---random-option)  \n`4.` [🔗 Combine Texts](#4----combine-texts)  \n`15.` [💾 Save Text](#15----save-text)  \n`26.` [🎲 Random line from input](#26----random-line-from-input)  \n`28.` [🔢🎲 Text with random Seed](#28----text-with-random-seed)  \n`32.` [🧑📝 Character Description Generator](#32----character-description-generator)  \n`48.` [🔀🎲 Text scrambler (🧑 Character)](#48----text-scrambler--character)  \n`67.` [📝➜✨ Text to Anything](#67----text-to-anything)  \n`68.` [✨➜📝 Anything to Text](#68----anything-to-text)  \n`75.` [📝➜📝 Replace text](#75----replace-text)  \n`111.` [✨➜🔢 Anything to Int](#111----anything-to-int)  \n`112.` [✨➜🔢 Anything to Float](#112----anything-to-float)  \n`113.` [📝🔪 Text split in 5](#113----text-split-in-5)  \n`132.` [📝🔪 Text split in 10](#132----text-split-in-10)  \n`115.` [📥 Load Text From Bjornulf Folder](#115----load-text-from-bjornulf-folder)  \n`116.` [📥 Load Text From Path](#116----load-text-from-path)  \n`117.` [📝👈🅰️ Line selector (🎲 or ♻ or ♻📑)](#117---🅰%EF%B8%8F-line-selector--or--or-)  \n`131.` [✒👉 Write Pick Me Chain](#131----write-pick-me-chain)  \n`136.` [🔛📝 Text Switch On\u002FOff](#136----text-switch-onoff)  \n`138.` [📑👈 Select from List](#138----select-from-list)  \n`141.` [🌎✒👉 Global Write Pick Me](#141----global-write-pick-me)  \n`142.` [🌎📥 Load Global Pick Me](#142----load-global-pick-me)  \n`144` [📊🔍 Text Analyzer](#)  \n\n## 🔥 Text Generator 🔥\n`81.` [🔥📝🖼 Image Text Generator 🖼📝🔥](#81----text-generator-)  \n`82.` [👩‍🦰📝 Text Generator (Character Female)](#82----text-generator-character-female)  \n`83.` [👨‍🦰📝 Text Generator (Character Male)](#83----text-generator-character-male)  \n`84.` [👾📝 Text Generator (Character Creature)](#84----text-generator-character-creature)  \n`85.` [💃🕺📝 Text Generator (Character Pose)](#85----text-generator-character-pose)  \n`86.` [🔧👨‍🔧📝 Text Generator (Object for Character)](#86----text-generator-object-for-character)  \n`87.` [🌄📝 Text Generator (Scene)](#87----text-generator-scene)  \n`88.` [🎨📝 Text Generator (Style)](#88----text-generator-style)  \n`89.` [👗 Text Generator (Outfit Female)](#89----text-generator-outfit-female)  \n`90.` [👚 Text Generator (Outfit Male)](#90----text-generator-outfit-male)  \n`91.` [♻🔥📝 List Looper (Text Generator)](#91----list-looper-text-generator)  \n`92.` [♻🌄📝 List Looper (Text Generator Scenes)](#92----list-looper-text-generator-scenes)  \n`93.` [♻🎨📝 List Looper (Text Generator Styles)](#93----list-looper-text-generator-styles)  \n`94.` [♻💃🕺📝 List Looper (Text Generator Poses)](#94----list-looper-text-generator-poses)  \n`95.` [♻👨‍🦰👩‍🦰👾 List Looper (Text Generator Characters)](#95----list-looper-text-generator-characters)  \n`96.` [♻👚 List Looper (Text Generator Outfits Male)](#96----list-looper-text-generator-outfits-male)  \n`97.` [♻👗 List Looper (Text Generator Outfits Female)](#97----list-looper-text-generator-outfits-female)  \n\n## ♻ Loop ♻\n`6.` [♻ Loop](#6----loop)  \n`7.` [♻ Loop Texts](#7----loop-texts)  \n`8.` [♻ Loop Integer](#8----loop-integer)  \n`9.` [♻ Loop Float](#9----loop-float)  \n`10.` [♻ Loop All Samplers](#10----loop-all-samplers)  \n`11.` [♻ Loop All Schedulers](#11----loop-all-schedulers)  \n`12.` [♻ Loop Combos](#12----loop-combos)  \n`27.` [♻ Loop (All Lines from input)](#27----loop-all-lines-from-input)  \n`33.` [♻ Loop (All Lines from input 🔗 combine by lines)](#33----loop-all-lines-from-input--combine-by-lines)  \n`38.` [♻🖼 Loop (Images)](#38----loop-images)  \n`39.` [♻ Loop (✒🗔🅰️ Advanced Write Text)](#39----loop-🅰%EF%B8%8F-advanced-write-text)  \n`42.` [♻ Loop (Model+Clip+Vae) - aka Checkpoint \u002F Model](#42----loop-modelclipvae---aka-checkpoint--model)  \n`53.` [♻ Loop Load checkpoint (Model Selector)](#53----loop-load-checkpoint-model-selector)  \n`54.` [♻👑 Loop Lora Selector](#54----loop-lora-selector)  \n`56.` [♻📑 Loop Sequential (Integer)](#56----loop-sequential-integer)  \n`57.` [♻📑 Loop Sequential (input Lines)](#57----loop-sequential-input-lines)  \n`90.` [♻🔥📝 List Looper (Text Generator)](#8)  \n`91.` [♻🌄📝 List Looper (Text Generator Scenes)](#8)  \n`92.` [♻🎨📝 List Looper (Text Generator Styles)](#8)  \n`93.` [♻💃🕺📝 List Looper (Text Generator Poses)](#8)  \n`94.` [♻👨‍🦰👩‍🦰📝 List Looper (Text Generator Characters)](#8)  \n`95.` [♻👚 List Looper (Text Generator Outfits Male)](#8)  \n`96.` [♻👗 List Looper (Text Generator Outfits Female)](#8)  \n\n## 🎲 Randomization 🎲\n`3.` [✒🗔🅰️ Advanced Write Text (+ 🎲 random option)](#3---🅰%EF%B8%8F-advanced-write-text---random-option)  \n`5.` [🎲 Random (Texts)](#5----random-texts)  \n`26.` [🎲 Random line from input](#26----random-line-from-input)  \n`28.` [🔢🎲 Text with random Seed](#28----text-with-random-seed)  \n`37.` [🎲🖼 Random Image](#37----random-image)  \n`40.` [🎲 Random (Model+Clip+Vae) - aka Checkpoint \u002F Model](#40----random-modelclipvae---aka-checkpoint--model)  \n`41.` [🎲 Random Load checkpoint (Model Selector)](#41----random-load-checkpoint-model-selector)  \n`48.` [🔀🎲 Text scrambler (🧑 Character)](#48----text-scrambler--character)  \n`55.` [🎲👑 Random Lora Selector](#55----random-lora-selector)  \n`117.` [📝👈🅰️ Line selector (🎲 or ♻ or ♻📑)](#117---🅰%EF%B8%8F-line-selector--or--or-)  \n`139.` [🎲 Random Integer](#139----random-integer)  \n`140.` [🎲 Random Float](#140----random-float)  \n\n## 🖼💾 Save Image \u002F Text 💾🖼\n`16.` [💾🖼💬 Save image for Bjornulf LobeChat](#16----save-image-for-bjornulf-lobechat-for-my-custom-lobe-chat)  \n`17.` [💾🖼 Save image as `tmp_api.png` Temporary API](#17----save-image-as-tmp_apipng-temporary-api-%EF%B8%8F)  \n`18.` [💾🖼📁 Save image to a chosen folder name](#18----save-image-to-a-chosen-folder-name)  \n`14.` [💾🖼 Save Exact name](#1314------resize-and-save-exact-name-%EF%B8%8F)  \n`123.` [💾🅰️ Save Global Variables](#123---🅰%EF%B8%8F-save-global-variables)  \n\n## 🖼📥 Load Image \u002F Text 📥🖼\n`29.` [📥🖼 Load Image with Transparency ▢](#29----load-image-with-transparency-)  \n`43.` [📥🖼📂 Load Images from output folder](#43----load-images-from-output-folder)  \n`124.` [📥🅰️ Load Global Variables](#124---🅰%EF%B8%8F-load-global-variables)  \n\n## 🖼 Image - others 🖼\n`13.` [📏 Resize Image](#1314------resize-and-save-exact-name-%EF%B8%8F)  \n`22.` [🔲 Remove image Transparency (alpha)](#22----remove-image-transparency-alpha)  \n`23.` [🔲 Image to grayscale (black & white)](#23----image-to-grayscale-black--white)  \n`24.` [🖼+🖼 Stack two images (Background + Overlay)](#24----stack-two-images-background--overlay)  \n`25.` [🟩➜▢ Green Screen to Transparency](#25----green-screen-to-transparency)  \n`29.` [⬇️🖼 Load Image with Transparency ▢](#29----load-image-with-transparency-)  \n`30.` [🖼✂ Cut image with a mask](#30----cut-image-with-a-mask)  \n`37.` [🎲🖼 Random Image](#37----random-image)  \n`38.` [♻🖼 Loop (Images)](#38----loop-images)  \n`43.` [⬇️📂🖼 Load Images from output folder](#43----load-images-from-output-folder)  \n`44.` [🖼👈 Select an Image, Pick](#44----select-an-image-pick)  \n`46.` [🖼🔍 Image Details](#46----image-details)  \n`47.` [🖼 Combine Images](#47----combine-images)  \n`60.` [🖼🖼 Merge Images\u002FVideos 📹📹 (Horizontally)](#60----merge-imagesvideos--horizontally)  \n`61.` [🖼🖼 Merge Images\u002FVideos 📹📹 (Vertically)](#61----merge-imagesvideos--vertically)  \n`62.` [🦙👁 Ollama Vision](#62----ollama-vision)  \n`70.` [📏 Resize Image Percentage](#70----resize-image-percentage)  \n`80.` [🩷 Empty Latent Selector](#80----empty-latent-selector)  \n`146` [🖼📹🔪 Split Image\u002FVideo Grid](#146----split-imagevideo-grid)  \n`147` [🖼📹🔨 Reassemble Image\u002FVideo Grid](#147----reassemble-imagevideo-grid)  \n`160.` [🦙👁 Ollama Vision Prompt Selector](#160----ollama-vision-prompt-selector)  \n\n## 🅰️ Variables 🅰️\n`3.` [✒🗔🅰️ Advanced Write Text (+ 🎲 random option)](#3---🅰%EF%B8%8F-advanced-write-text---random-option)  \n`117.` [📝👈🅰️ Line selector (🎲 or ♻ or ♻📑)](#117---🅰%EF%B8%8F-line-selector--or--or-)  \n`123.` [💾🅰️ Save Global Variables](#123---🅰%EF%B8%8F-save-global-variables)  \n`124.` [📥🅰️ Load Global Variables](#124---🅰%EF%B8%8F-load-global-variables)  \n`129.` [📌🅰️ Set Variable from Text](#129---🅰%EF%B8%8F-set-variable-from-text)  \n\n## 🚀 Load checkpoints 🚀\n`40.` [🎲 Random (Model+Clip+Vae) - aka Checkpoint \u002F Model](#40----random-modelclipvae---aka-checkpoint--model)  \n`41.` [🎲 Random Load checkpoint (Model Selector)](#41----random-load-checkpoint-model-selector)  \n`42.` [♻ Loop (Model+Clip+Vae) - aka Checkpoint \u002F Model](#42----loop-modelclipvae---aka-checkpoint--model)  \n`53.` [♻ Loop Load checkpoint (Model Selector)](#53----loop-load-checkpoint-model-selector)  \n`125.` [📝👈 Model-Clip-Vae selector (🎲 or ♻ or ♻📑)](#125----model-clip-vae-selector--or--or-)  \n\n## 🚀 Load loras 🚀\n`54.` [♻ Loop Lora Selector](#54----loop-lora-selector)  \n`55.` [🎲 Random Lora@ Selector](#55----random-lora-selector)  \n`114.` [📥👑 Load Lora with Path](#114----load-lora-with-path)  \n`122.` [👑 Combine Loras, Lora stack](#122----combine-loras-lora-stack)  \n\n## ☁ Image Creation : API \u002F cloud \u002F remote ☁\n`106.` [☁🎨 API Image Generator (FalAI) ☁](#106----api-image-generator-falai-)  \n`107.` [☁🎨 API Image Generator (CivitAI) ☁](#107----api-image-generator-civitai-)  \n`108.` [☁👑 Add Lora (API ONLY - CivitAI) 👑☁](#108----add-lora-api-only---civitai-)  \n`109.` [☁🎨 API Image Generator (Black Forest Labs - Flux) ☁](#109----api-image-generator-black-forest-labs---flux-)  \n`110.` [☁🎨 API Image Generator (Stability - Stable Diffusion) ☁](#110----api-image-generator-stability---stable-diffusion-)  \n`151` [📥🕑🤖 Load CivitAI Links](#151----load-civitai-links)  \n`163` [☁🎨 API Image Generator (openai, gpt-image-1)](#163----api-image-generator-openai-gpt-image-1)  \n\n## 📥 Take from CivitAI \u002F Hugginface 📥\n`98.` [📥 Load checkpoint SD1.5 (+Download from CivitAi)](#98----load-checkpoint-sd15-download-from-civitai)  \n`99.` [📥 Load checkpoint SDXL (+Download from CivitAi)](#99----load-checkpoint-sdxl-download-from-civitai)  \n`100.` [📥 Load checkpoint Pony (+Download from CivitAi)](#100----load-checkpoint-pony-download-from-civitai)  \n`101.` [📥 Load checkpoint FLUX Dev (+Download from CivitAi)](#101----load-checkpoint-flux-dev-download-from-civitai)  \n`102.` [📥 Load checkpoint FLUX Schnell (+Download from CivitAi)](#102----load-checkpoint-flux-schnell-download-from-civitai)  \n`103.` [📥👑 Load Lora SD1.5 (+Download from CivitAi)](#103----load-lora-sd15-download-from-civitai)  \n`104.` [📥👑 Load Lora SDXL (+Download from CivitAi)](#104----load-lora-sdxl-download-from-civitai)  \n`105.` [📥👑 Load Lora Pony (+Download from CivitAi)](#105----load-lora-pony-download-from-civitai)  \n`119.` [📥👑📹 Load Lora Hunyuan Video (+Download from CivitAi)](#119----load-lora-hunyuan-video-download-from-civitai)  \n`121.` [💾 Huggingface Downloader](#121----huggingface-downloader)  \n\n## 📹 Video 📹\n`20.` [📹 Video Ping Pong](#20----video-ping-pong)  \n`21.` [🖼➜📹 Images to Video (FFmpeg Save Video)](#21----images-to-video-ffmpeg-save-video)  \n`49.` [📹👁 Video Preview](#49----video-preview)  \n`50.` [🖼➜📹 Images to Video path (tmp video)](#50----images-to-video-path-tmp-video)  \n`51.` [📹➜🖼 Video Path to Images](#51----video-path-to-images)  \n`52.` [🔊📹 Audio Video Sync](#52----audio-video-sync)  \n`58.` [📹🔗 Concat Videos](#58----concat-videos)  \n`59.` [📹🔊 Combine Video + Audio](#59----combine-video--audio)  \n`60.` [🖼🖼 Merge Images\u002FVideos 📹📹 (Horizontally)](#60----merge-imagesvideos--horizontally)  \n`61.` [🖼🖼 Merge Images\u002FVideos 📹📹 (Vertically)](#61----merge-imagesvideos--vertically)  \n`76.` [⚙📹 FFmpeg Configuration 📹⚙](#76----ffmpeg-configuration-)  \n`77.` [📹🔍 Video details ⚙](#77----video-details-)  \n`78.` [📹➜📹 Convert Video](#78----convert-video)  \n`79.` [📹🔗 Concat Videos from list](#79----concat-videos-from-list)  \n`119.` [📥👑📹 Load Lora Hunyuan Video (+Download from CivitAi)](#119----load-lora-hunyuan-video-download-from-civitai)  \n`146` [🖼📹🔪 Split Image\u002FVideo Grid](#146----split-imagevideo-grid)  \n`147` [🖼📹🔨 Reassemble Image\u002FVideo Grid](#147----reassemble-imagevideo-grid)  \n`149` [💾📹 Save Video (tmp_api.mp4\u002Fmkv\u002Fwebm) ⚠️💣](#149----save-video-tmp_apimp4mkvwebm-%EF%B8%8F)  \n\n## 🤖 AI 🤖\n`19.` [🦙💬 Ollama Talk](#19----ollama-talk)  \n`31.` [📝➜🔊 TTS - Text to Speech](#31----tts---text-to-speech-100-local-any-voice-you-want-any-language)  \n`62.` [🦙👁 Ollama Vision](#62----ollama-vision)  \n`63.` [🦙 Ollama Configuration ⚙](#63----ollama-configuration-)  \n`64.` [🦙 Ollama Job Selector 💼](#64----ollama-job-selector-)  \n`65.` [🦙 Ollama Persona Selector 🧑](#65----ollama-persona-selector-)  \n`66.` [🔊➜📝 STT - Speech to Text](#66----stt---speech-to-text)  \n`118.` [🔊 TTS Configuration ⚙](#118----tts-configuration-)  \n`160.` [🦙👁 Ollama Vision Prompt Selector](#160----ollama-vision-prompt-selector)  \n\n## 🔊 Audio 🔊\n`31.` [📝➜🔊 TTS - Text to Speech](#31----tts---text-to-speech-100-local-any-voice-you-want-any-language)  \n`52.` [🔊📹 Audio Video Sync](#52----audio-video-sync)  \n`59.` [📹🔊 Combine Video + Audio](#59----combine-video--audio)  \n`66.` [🔊➜📝 STT - Speech to Text](#66----stt---speech-to-text)  \n`118.` [🔊 TTS Configuration ⚙](#118----tts-configuration-)  \n`120.` [📝➜🔊 Kokoro - Text to Speech](#120----kokoro---text-to-speech)  \n`134.` [134 - 🔊▶ Play Audio](#134----play-audio)  \n`145` [🔊▶ Audio Preview (Audio player)](#145----audio-preview-audio-player)  \n`148` [💾🔊 Save Audio (tmp_api.wav\u002Fmp3) ⚠️💣](#148----save-audio-tmp_apiwavmp3-%EF%B8%8F)  \n\n## 💻 General \u002F System 💻\n`34.` [🧹 Free VRAM hack](#34----free-vram-hack)  \n`137.` [🌎🎲 Global Seed Manager](#137----global-seed-manager)  \n`143` [🧮 Basic Math](#)  \n\n## 🧍 Manual user Control 🧍\n`35.` [⏸️ Paused. Resume or Stop, Pick 👇](#35---%EF%B8%8F-paused-resume-or-stop-)  \n`36.` [⏸️ Paused. Select input, Pick 👇](#36---%EF%B8%8F-paused-select-input-pick-one)  \n`117.` [📝👈🅰️ Line selector (🎲 or ♻ or ♻📑)](#117---🅰%EF%B8%8F-line-selector--or--or-)  \n`135.` [🔛✨ Anything Switch On\u002FOff](#135----anything-switch-onoff)  \n`136.` [🔛📝 Text Switch On\u002FOff](#136----text-switch-onoff)  \n\n## 🧠 Logic \u002F Conditional Operations 🧠\n`45.` [🔀 If-Else (input \u002F compare_with)](#45----if-else-input--compare_with)  \n\n## [Coming soon] - not sorted in the categories above yet...\n`150` [[Coming soon] 🎨📜 Style Selector (🎲 or ♻ or ♻📑) + Civitai urn](#150----style-selector--or--or---civitai-urn)  \n`152` [[Coming soon] 💾 Save Tensors (tmp_api.pt) ⚠️💣](#)  \n`153` [[Coming soon] 📥 Load Tensor (tmp_api.pt)](#)  \n`154` [[Coming soon] 🔮 Remote VAE Decoder](#)  \n`155` [[Coming soon] 🔮 Remote VAE Decoder (Tiled)](#)  \n`156` [[Coming soon] 📥🔮 Load from Base64](#)  \n`157` [[Coming soon] 🔮⚡ Execute Workflow](#)  \n`158` [[Coming soon] 📥🔮📝 Text Manager Api (Execute Workflow)](#)  \n`159` [[Coming soon] 🔥📝📹 Video Text Generator 📹📝🔥](#)  \n`161` [[Coming soon] 🔧🧑 Fix Face](#)  \n`162` [[Coming soon] 🧑 Face Settings [Fix Face] ⚙](#)  \n\n# ☁ Usage in cloud : \n\nComfyui is great for local usage, but I sometimes need more power than what I have...  \nI have a computer with a 4070 super with 12GB and flux fp8 simple wokflow take about ~40 seconds. With a 4090 in the cloud I can run flux fp16 in ~12 seconds. (There are of course also some workflow that I can't even run locally.)  \n\nMy referal link for Runpod : \u003Chttps:\u002F\u002Frunpod.io?ref=tkowk7g5> (If you use that i will have a commission, at no extra cost for you.)  \nIf you want to use my nodes and comfyui in the cloud (and can install more stuff), I'm managing an optimized ready-to-use template on runpod : \u003Chttps:\u002F\u002Frunpod.io\u002Fconsole\u002Fdeploy?template=r32dtr35u1&ref=tkowk7g5>  \nTemplate name : `bjornulf-comfyui-allin-workspace`, can be operational in ~3 minutes. (Depending on your pod, setup and download of extra models or whatever not included.)  \nYou need to create and select a network volume before using that, size is up to you, i have 50Gb Storage because i use cloud only for Flux or lora training on a 4090. (~0.7$\u002Fhour)  \n⚠️ When pod is ready, you need to open a terminal in browser (After clicking on `connect` from your pod) and use this to launch ComfyUI manually : `cd \u002Fworkspace\u002FComfyUI && python main.py --listen 0.0.0.0 --port 3000` or the alias `start_comfy` (Much better to control it with a terminal, check logs, etc...)  \nAfter that you can just click on the `Connect to port 3000` button.  \nAs file manager, you can use the included `JupyterLab` on port 8888.  \nIf you have any issues with it, please let me know.  \nIt will manage everything in Runpod network storage (`\u002Fworkspace\u002FComfyUI`), so you can stop and start the cloud GPU without losing anything, change GPU or whatever.  \nZone : I recommend `EU-RO-1`, but up to you.  \nTop-up your Runpod account with minimum 10$ to start.  \n⚠️ Warning, you will pay by the minute, so not recommended for testing or learning comfyui. Do that locally !!!  \nRun cloud GPU only when you already have your workflow ready to run.  \nAdvice : take a cheap GPU for testing, downloading models or settings things up.  \nTo download checkpoint or anything else, you need to use the terminal.  \nFor downloading from Huggingface (get token here \u003Chttps:\u002F\u002Fhuggingface.co\u002Fsettings\u002Ftokens>).  \nHere is example for everything you need for flux dev :  \n```\nhuggingface-cli login --token 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\nhuggingface-cli download black-forest-labs\u002FFLUX.1-dev flux1-dev.safetensors --local-dir \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Funet\nhuggingface-cli download comfyanonymous\u002Fflux_text_encoders clip_l.safetensors --local-dir \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Fclip\nhuggingface-cli download comfyanonymous\u002Fflux_text_encoders t5xxl_fp16.safetensors --local-dir \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Fclip\nhuggingface-cli download black-forest-labs\u002FFLUX.1-dev ae.safetensors --local-dir \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Fvae\n```\nTo use Flux you can just drag and drop in your browser comfyui interface the .json from my github repo : `workflows\u002FFLUX_dev_troll.json`, direct link : \u003Chttps:\u002F\u002Fgithub.com\u002FjustUmen\u002FComfyUI-BjornulfNodes\u002Fblob\u002Fmain\u002Fworkflows\u002FFLUX_dev_troll.json>.  \n\nFor downloading from civitai (get token here \u003Chttps:\u002F\u002Fcivitai.com\u002Fuser\u002Faccount>), just copy\u002Fpaste the link of checkpoint you want to download and use something like that, with your token in URL :  \n```\nCIVITAI=\"8b275fada679ba5812b3da2bf35016f6\"\nwget --content-disposition -P \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Fcheckpoints \"https:\u002F\u002Fcivitai.com\u002Fapi\u002Fdownload\u002Fmodels\u002F272376?type=Model&format=SafeTensor&size=pruned&fp=fp16&token=$CIVITAI\"\n```\n\nIf you want to download for example the entire output folder, you can just compress it : \n```\ncd \u002Fworkspace\u002FComfyUI\u002Foutput && tar -czvf \u002Fworkspace\u002Foutput.tar.gz .\n```\n\nThen you can download it from the file manager JupyterLab.  \n\nIf you have any issues with this template from Runpod, please let me know, I'm here to help. 😊  \n\n# 🏗 Dependencies (nothing to do for my runpod ☁)\n\nCheck `requirements.txt` for the latest dependencies.  \n\n## 🪟🐍 Windows : Install dependencies on windows with embedded python (portable version)\n\nFirst you need to find this python_embedded `python.exe`, then you can right click or shift + right click inside the folder in your file manager to open a terminal there.  \n\nThis is where I have it, with the command you need :  \n`H:\\ComfyUI_windows_portable\\python_embeded> .\\python.exe -m pip install ollama pydub opencv-python ffmpeg-python civitai-py fal_client sounddevice langdetect spacy textblob dill`  \n\nWhen you have to install something else, you can retake the same code and install the dependency you want :  \n`.\\python.exe -m pip install whateveryouwant`  \n\nYou can then run comfyui.  \n\n## 🐧🐍 Linux : Install dependencies (without venv, not recommended)\n\nMove to the custom_node folder and do :  `pip install -r requirements.txt`\n\nOR\n\n- `pip install ollama` (you can also install ollama if you want :  https:\u002F\u002Follama.com\u002Fdownload) - You don't need to really install it if you don't want to use my ollama node. (BUT you need to run `pip install ollama`)\n- `pip install pydub` (for TTS node)\n- `pip install opencv-python`\n- etc...\n\n## 🐧🐍 Linux : Install dependencies with python virtual environment (venv)\n\nIf you want to use a python virtual environment only for comfyUI, which I recommended, you can do that for example (also pre-install pip) :  \n\n```\nsudo apt-get install python3-venv python3-pip\npython3 -m venv \u002Fthe\u002Fpath\u002Fyou\u002Fwant\u002Fvenv\u002Fbjornulf_comfyui\n```\n\nOnce you have your environment in this new folder, you can activate it with and install dependencies inside :  \n\n```\nsource \u002Fthe\u002Fpath\u002Fyou\u002Fwant\u002Fvenv\u002Fbjornulf_comfyui\u002Fbin\u002Factivate\ncd custom_nodes\u002FBjornulf_custom_nodes\npip install -r requirements.txt\n```\n\nThen you can start comfyui with this environment (notice that you need to re-activate it each time you want to launch comfyui) :  \n\n```\ncd \u002Fwhere\u002Fyou\u002Finstalled\u002FComfyUI && python main.py\n```\n\n# 📝 Changelog\n\n- **v0.2**: Improve ollama node with system prompt + model selection.\n- **v0.3**: Add a new node : Save image to a chosen folder.\n- **v0.3**: Add comfyui Metadata \u002F workflow to all my image-related nodes.\n- **v0.4**: Support transparency option with webm format, options encoders. As well as input for audio stream. \n- **v0.5**: New node : Remove image transparency (alpha) - Fill alpha channel with solid color.\n- **v0.5**: New node : Image to grayscale (black & white) - Convert an image to grayscale.\n- **v0.6**: New node : Combine images (Background + Overlay) - Combine two images into a single image.\n- **v0.7**: Replace Save API node with Save Bjornulf Lobechat node. (For my custom lobe-chat)\n- **v0.8**: Combine images : add an option to put image top, bottom or center.\n- **v0.8**: Combine texts : add option for slashes \u002F\n- **v0.8**: Add basic node to transform greenscreen in to transparency.\n- **v0.9**: Add a new node : Return one random line from input.\n- **v0.10**: Add a new node : Loop (All Lines from input) - Iterate over all lines from an input text.\n- **v0.11**: Add a new node : Text with random Seed - Generate a random seed, along with text.\n- **v0.12**: Combine images : Add option to move vertically and horizontally. (from -50% to 150%)\n- **v0.13**: Add a new node: Load image with transparency (alpha) - Load an image with transparency.\n- **v0.14**: Add a new node: Cut image from a mask\n- **v0.15**: Add two new nodes: TTS - Text to Speech and Character Description Generator\n- **v0.16**: Big changes on Character Description Generator\n- **v0.17**: New loop node, combine by lines.\n- **v0.18**: New loop node, Free VRAM hack\n- **v0.19**: Changes for save to folder node : ignore missing images filenames, will use the highest number found + 1.\n- **v0.20**: Changes for lobechat save image : include the code of free VRAM hack + ignore missing images filenames\n- **v0.21**: Add a new write text node that also display the text in the comfyui console (good for debugging)\n- **v0.22**: Allow write text node to use random selection like this {hood|helmet} will randomly choose between hood or helmet.\n- **v0.23**: Add a new node: Pause, resume or stop workflow.\n- **v0.24**: Add a new node: Pause, select input, pick one.\n- **v0.25**: Two new nodes: Loop Images and Random image.\n- **v0.26**: New node : Loop write Text. Also increase nb of inputs allowed for most nodes. (+ update some breaking changes)\n- **v0.27**: Two new nodes : Loop (Model+Clip+Vae) and Random (Model+Clip+Vae) - aka Checkpoint \u002F Model\n- **v0.28**: Fix random texts and add a lot of screenshots examples for several nodes.\n- **v0.29**: Fix floating points issues with loop float node.\n- **v0.30**: Update the basic Loop node with optional input.\n- **v0.31**: ❗Sorry, Breaking changes for Write\u002FShow text nodes, cleaner system : 1 simple write text and the other is 1 advanced with console and special syntax. Also Show can now manage INT, FLOAT, TEXT.\n- **v0.32**: Quick rename to avoid breaking loop_text node.\n- **v0.33**: Control random on paused nodes, fix pydub sound bug permissions on Windows.\n- **v0.34**: Two new nodes : Load Images from output folder and Select an Image, Pick.\n- **v0.35**: Great improvements of the TTS node 31. It will also save the audio file in the \"ComfyUI\u002FBjornulf_TTS\u002F\" folder. - Not tested on windows yet -\n- **v0.36**: Fix random model.\n- **v0.37**: New node : Random Load checkpoint (Model Selector). Alternative to the random checkpoint node. (Not preloading all checkpoints in memory, slower to switch between checkpoints, but more outputs to decide where to store your results.)\n- **v0.38**: New node : If-Else logic. (input == compare_with), examples with different latent space size. +fix some deserialization issues.\n- **v0.39**: Add variables management to Advanced Write Text node.\n- **v0.40**: Add variables management to Loop Advanced Write Text node. Add menu for all nodes to the README.\n- **v0.41**: Two new nodes : image details and combine images. Also ❗ Big changes to the If-Else node. (+many minor changes)\n- **v0.42**: Better README with category nodes, changes some node titles\n- **v0.43**: Add control_after_generate to Ollama and allow to keep in VRAM for 1 minute if needed. (For chaining quick generations.) Add fallback to 0.0.0.0\n- **v0.44**: Allow ollama to have a custom url in the file `ollama_ip.txt` in the comfyui custom nodes folder. Minor changes, add details\u002Fupdates to README.\n- **v0.45**: Add a new node : Text scrambler (Character), change text randomly using the file `scrambler\u002Fscrambler_character.json` in the comfyui custom nodes folder.\n- **v0.46**: ❗ A lot of changes to Video nodes. Save to video is now using FLOAT for fps, not INT. (A lot of other custom nodes do that as well...) Add node to preview video, add node to convert a video path to a list of images. add node to convert a list of images to a temporary video + video_path. add node to synchronize duration of audio with video. (useful for MuseTalk) change TTS node with many new outputs (\"audio_path\", \"full_path\", \"duration\") to reuse with other nodes like MuseTalk, also TTS rename input to \"connect_to_workflow\", to avoid mistakes sending text to it.\n- **v0.47**: New node : Loop Load checkpoint (Model Selector).\n- **v0.48**: Two new nodes for loras : Random Lora Selector and Loop Lora Selector.\n- **v0.49**: New node : Loop Sequential (Integer) - Loop through a range of integer values. (But once per workflow run), audio sync is smarter and adapt the video duration to the audio duration.\n- **v0.50**: allow audio in Images to Video path (tmp video). Add three new nodes : Concat Videos, combine video\u002Faudio and Loop Sequential (input Lines). save text changes to write inside Comfyui folder. Fix random line from input outputing LIST. ❗ Breaking change to audio\u002Fvideo sync node, allowing different types as input.\n- **v0.51**: Fix some issues with audio\u002Fvideo sync node. Add two new nodes : merge images\u002Fvideos vertical and horizontal. add requirements.txt and ollama_ip.txt\n- **v0.52-53**: Revert name git to Bjornulf_custom_nodes, match registry comfy\n- **v0.54-55**: add opencv-python to requirements.txt\n- **0.56**: ❗Breaking changes : ollama node simplified, no ollama_ip.txt needed, waiting for collection ollama nodes to be ready.\n- **0.57**: ❗❗Huge changes, new Ollama node \"Ollama Chat\" with real functionalities. 5 Ollama nodes total. (Model selector + Job selector + Persona selector + Ollama vision + Ollama Talk) Ollama talk use context and can use context file. Add number of lines \u002F current counter + next to sequential nodes. Add new node STT. (+ faster_whisper dep) better management of empty loras\u002Fcheckpoints on selectors. (list preset) Add \"default_for_language\" for TTS node, taking the default voice for a language (ex: fr\u002Fdefault.wav) Otherwise take the first wav with the selected language.\n- **0.58**: small fix in model selector default value. (Set to None by default)\n- **0.59**: A lot of Javascript fixing to avoid resizing and better properties mangement \u002F recoveries\n- **0.60**: Revert changes from ollama_talk (implement _user mode later \u002F another node)\n- **0.61**: Add\u002Fmodify a bunch of Ffmpeg \u002F video nodes. With a global configuration system and toggle python-ffmpeg \u002F system.\n- **0.62**: MASSIVE update, Text Generator nodes. (15 nodes), API nodes generate (civitai \u002F black forest labs \u002F fal.ai), API civit ai download models nodes, lora\n- **0.63**: delete long file, useless\n- **0.64**: remove \"import wget\", added some keywords to text generators.\n- **0.65**: ❗Breaking changes : Combine Text inputs are now all optional (PLease remake your nodes, sorry.) Add 6 new nodes : any2int, any2float, load text from folder, load text from path, load lora from path. Also upgraded the Save text node.\n- **0.66**: Add lora hunyuan CIVIT ai + download, add TTS configuration node, edit requirements.txt\n- **0.67**: Add kokoro TTS node.\n- **0.68**: Update kokoro TTS node with connect_to_workflow and same outputs as XTTS.\n- **0.69**: Small fixes\n- **0.70**: ❗Breaking changes : \"Line Selector Node\" is now a \"universal node\" : manual selection, random, and LOOP + Sequential.\nText replace now have multine option for regex. (https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes\u002Fissues\u002F17) - can remove \u003Cthink> tag from ollama.  \n8 new nodes : \"🖼👁 Preview (first) image\", \"💾 Huggingface Downloader\", \"👑 Combine Loras, Lora stack\", \"📥 Load Global Variables\", \"💾 Save Global Variables\", \"📝👈 Model-Clip-Vae selector (🎲 or ♻ or ♻📑)\", \"📒 Note\", \"🖼📒 Image Note\".\nFix a lot of code everywhere, a little better logging system, etc...  \nWIP : Rewrite of all my ffmpeg nodes. (Still need improvements and fixes, will do that in 0.71?) Maybe don't use them yet...\n- **0.71**: ❗Breaking changes for Global variable nodes. (add to global variable system a \"filename\", which is a a separate global variable file.) bug fix speech to text node, 5 new nodes 129-133. combine text limit raised to 100. improve Save image in folder node.\n- **0.71-0.75**: Many bug fixing. Civitai nodes are working on windows. (encoding, links problem are solved ? - at least on my machines...)\n- **0.76**: Removed kokoro_onnx from requirements.txt due to some conflict with other nodes, like Impact-Pack, with old version of numpy... (kokoro_onnx need to be installed manually if you want to use this node.)  \nNew syntaxes for advanced text\u002Fline selector, ex: {left|right|middle|group=LMR}+{left|right|middle|group=LMR}+{left|right|middle|group=LMR} and {A(80%)|B(15%)|C(5%)}  \n2 new nodes switch : 🔛✨ Anything Switch On\u002FOff (compatible with combine images) AND 🔛📝 Text Switch On\u002FOff (Compatible with combine texts)  \n2 new pick Me global nodes, using an identifier instead of chain : 🌎✒👉 Global Write Pick Me AND 🌎📥 Load Global Pick Me  \n3 random nodes : 🌎🎲 Global Random Seed, 🎲 Random Integer, 🎲 Random Float (Each return their value but also TEXT version of it.) \"Seed node\" more advanced.  \n1 new node to quickly select element from list : 📑👈 Select from List  \n1 new audio node : 🔊▶ Play Audio (Just play an audio file, will default to bell.m4a if none provided.) Can take AUDIO format or audio_path.  \n❗Breaking changes. Large rewrite for all FFMPEG related nodes. With options for video preview. (Still have few changes to make, next version.)  \n- **0.77**: Add Refresh button to Load image from folder.  \nAdd new syntax for advanced write \u002F line selector : 2 {apple|orange|banana|static_group=FRUIT}s, one {apple|orange|banana|static_group=FRUIT} on the left, one {apple|orange|banana|static_group=FRUIT} on the right.  \nTTS fix request voices.  \n❗Breaking changes. New vision model for Ollama.  \n20 new nodes (143 - 162), Text Analyzer, basic math, audio preview, etc..... (10 not realesed yet, but included as a public \"roadmap\".)  \nRemove faster-whisper from requirements.txt for people using python 3.13. (Need to install manually.)  \nFix preview image node for the new comfyui layout.  \nRewrite of FFMPEG nodes, COnfiguration and Video preview.  \nMany other bug fixes and improvements on many nodes, thx for the reports.  \n- **0.78**: Fix Line selector Reset button javascript. (not showing on refresh)  \n- **0.79**: Fix Ollama Talk  \n- **0.780**: gtp-image-1 api node  \n\n# 📝 Nodes descriptions\n\n## 1 - 👁 Show (Text, Int, Float)\n\n**Description:**  \nThe show node will only display text, or a list of several texts. (read only node)  \n3 types are managed : Green is for STRING type, Orange is for FLOAT type and blue is for INT type. I put colors so I\u002Fyou don't try to edit them. 🤣  \n\nUpdate 0.61 : You now also have 4 other nodes to display format specific values : INT, FLOAT, STRING and JSON (STRING)  \nThese are convenient because these are automatically recommended on drag and drop.  \n\n![Show Text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a44788cb510a.png)\n\n## 2 - ✒ Write Text\n\n**Description:**  \nSimple node to write text \u002F send text to another node.  \n\nBelow is a simple example of how to use the write text node with a show node :  \n\n![write Text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_20a953d1e7ae.png)\n\n## 3 - ✒🗔🅰️ Advanced Write Text (+ 🎲 random option)\n\n**Description:**  \nAdvanced Write Text node allows for special syntax to accept random variants, like `{hood|helmet}` will randomly choose between hood or helmet.  \nYou also have `seed` and `control_after_generate` to manage the randomness.  \nIt is also displaying the text in the comfyui console. (Useful for debugging)  \nExample of console logs :  \n```\nRaw text: photo of a {green|blue|red|orange|yellow} {cat|rat|house}\nPicked text: photo of a green house\n```\n\n![write Text Advanced](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ee090337f8f5.png)\n\nYou can also create and reuse variables with this syntax : `\u003Cname>`.\nUsage example : \n\n![variables](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9890cdc9afe1.png)\n\n❗ 0.76 - New syntax available :  \nGroups, with no duplicate, example : {left|right|middle|group=LMR}+{left|right|middle|group=LMR}+{left|right|middle|group=LMR}  \nRandom based on percentage : {A(80%)|B(15%)|C(5%)}  \n\n❗ 0.77 - New syntax available :  \n2 {apple|orange|banana|static_group=FRUIT}s, one {apple|orange|banana|static_group=FRUIT} on the left, one {apple|orange|banana|static_group=FRUIT} on the right\n\n## 4 - 🔗 Combine Texts\n\n**Description:**  \nCombine multiple text inputs into a single output. (can have separation with : comma, space, new line or nothing.)\n\n![Combine Texts](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f31ead86c257.png)\n\n## 5 - 🎲 Random (Texts)\n\n**Description:**  \nGenerate and display random text from a predefined list. Great for creating random prompts.  \nYou also have `control_after_generate` to manage the randomness.  \n\n![Random Text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_0a3c4e25d116.png)\n\n## 6 - ♻ Loop\n\n**Description:**  \n\n⚠️ Warning : DEPRECATED, this node doesn't work anymore.  \nLatest comfyui version just refuse to output 2 times the same value.  \n\nGeneral-purpose loop node, you can connect that in between anything.  \n\n![Loop](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ad5cd74c33d5.png)\n\nIt has an optional input, if no input is given, it will loop over the value of the STRING \"if_no_input\" (take you can edit).  \n❗ Careful this node accept everything as input and output, so you can use it with texts, integers, images, mask, segs etc... but be consistent with your inputs\u002Foutputs.  \nDo not use this Loop if you can do otherwise.  \n\nThis is an example together with my node 28, to force a different seed for each iteration :   \n![Loop](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b668bf3940e5.png)\n\n## 7 - ♻ Loop Texts\n\n**Description:**  \nCycle through a list of text inputs.  \n\n![Loop Texts](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ade97ebd3cbb.png)\n\nHere is an example of usage with combine texts and flux :  \n![Loop Texts example](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7831290c7325.png)\n\n## 8 - ♻ Loop Integer\n\n**Description:**  \nIterate through a range of integer values, good for `steps` in ksampler, etc...\n\n![Loop Integer](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_80bea6b28a0b.png)\n![Loop Int + Show Text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_12d52145c91a.png)\n\n❗ Don't forget that you can convert ksampler widgets to input by right-clicking the ksampler node :  \n![Widget to Input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f271e7147942.png)\n\nHere is an example of usage with ksampler (Notice that with \"steps\" this node isn't optimized, but good enough for quick testing.) :  \n![Widget to Input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b908eee71aa6.png)\n\n## 9 - ♻ Loop Float\n\n**Description:**  \nLoop through a range of floating-point numbers, good for `cfg`, `denoise`, etc...  \n\n![Loop Float + Show Text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2b9f5c16d8dc.png)\n![Loop Float](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_75cb1d5692cd.png)\n\nHere is an example with controlnet, trying to make a red cat based on a blue rabbit :  \n![Loop All Samplers](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_faf9496bc2f4.png)\n\n## 10 - ♻ Loop All Samplers\n\n**Description:**  \nIterate over all available samplers to apply them one by one. Ideal for testing.  \n\n![Loop All Samplers](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5c2dc12f18c9.png)\n\nHere is an example of looping over all the samplers with the normal scheduler :  \n![Loop All Samplers](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e16fc1d32566.png)\n\n## 11 - ♻ Loop All Schedulers\n\n**Description:**  \nIterate over all available schedulers to apply them one by one. Ideal for testing. (same idea as sampler above, but for schedulers)  \n\n![Loop All Schedulers](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f25778193db3.png)\n\n## 12 - ♻ Loop Combos\n\n**Description:**  \nGenerate a loop from a list of my own custom combinations (scheduler+sampler), or select one combo manually.  \nGood for testing.\n\n![Loop Combos](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c4c6e592306d.png)\n\nExample of usage to see the differences between different combinations :    \n![example combos](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e7043bf867db.png)\n\n## 13\u002F14 - 📏 + 🖼 Resize and Save Exact name ⚠️💣\n\n**Description:**  \nResize an image to exact dimensions. If height or width is set to 0, it will keep the aspect ratio.  \n\nThe other node will save the image to the exact path.  \n⚠️💣 Warning : The image will be overwritten if it already exists.\n\n![Resize and Save Exact](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7209c85cdf92.png)\n\n## 15 - 💾 Save Text\n\n**Description:**  \nSave the given text input to a file. Useful for logging and storing text data.  \nIf the file already exist, it will add the text at the end of the file.  \nI recommend you to keep saving them in \"Bjornulf\u002FText\" (Which is in the Comfyui folder, next to output), this is where the node 116 `Load text from folder` is looking for text files.  \n\n![Save Text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_afa6e0f2943f.png)\n\n## 16 - 💾🖼💬 Save image for Bjornulf LobeChat (❗For my custom [lobe-chat](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_lobe-chat)❗)\n\n**Description:**  \n❓ I made that node for my custom lobe-chat to send+receive images from Comfyui API : [lobe-chat](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_lobe-chat)  \nIt will save the image in the folder `output\u002FBJORNULF_LOBECHAT\u002F`. \nThe name will start at `api_00001.png`, then `api_00002.png`, etc...  \nIt will also create a link to the last generated image at the location `output\u002FBJORNULF_API_LAST_IMAGE.png`.  \nThis link will be used by my custom lobe-chat to copy the image inside the lobe-chat project.  \n\n![Save Bjornulf Lobechat](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_48f926751b15.png)\n\n## 17 - 💾🖼 Save image as `tmp_api.png` Temporary API ⚠️💣\n\n**Description:**  \nSave image for short-term use : .\u002Foutput\u002Ftmp_api.png ⚠️💣  \n\n![Save Temporary API](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_bade847a067e.png)\n\n## 18 - 💾🖼📁 Save image to a chosen folder name\n\n**Description:**  \nSave image in a specific folder : `my_folder\u002F00001.png`, `my_folder\u002F00002.png`, etc...  \nAlso allow multiple nested folders, like for example : `animal\u002Fdog\u002Fsmall`.\n\n![Save Temporary API](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3e0ab0bf3b4f.png)\n\n## 19 - 🦙💬 Ollama Talk\n\n**Description:**  \nUse Ollama inside Comfyui. (Require the backend Ollama to be installed and currently running.)  \nUse by default the model `llama3.2:3b` and the URL `http:\u002F\u002F0.0.0.0:11434`. (For custom configuration, use node 63)  \n\nExample of basic usage :  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1bb04e6818a4.png)  \n\nExample of usage with context, notice that with context you can follow up a conversation, \"there\" is clearly understood as \"Bucharest\" :  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a084682e46f9.png)  \n\nYou can also use `use_context_file` (set to True), this will save the context in a file : `ComfyUI\u002FBjornulf\u002Follama_context.txt`.  \nThis way you can keep using the context without having to connect many nodes connected to each other, just run the same workflow several times.  \n\n### Example in 3 steps of context file conversation\n\nStep 1 : Notice that for now context is empty, so it will be the first message in `ComfyUI\u002FBjornulf\u002Follama_context.txt` :  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df1e6c8c30bc.png)  \n\nStep 2 : Notice that now the number of lines in context file has changed (These are the same as the `updated_context`):  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8092d775ce90.png)  \n\nStep 3 : Notice that the number of lines keep incrementing.  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_08bf2ce96897.png)  \n\nWhen clicking the `reset Button`, it will also save the context in : `ComfyUI\u002FBjornulf\u002Follama_context_001.txt`, `ComfyUI\u002FBjornulf\u002Follama_context_002.txt`, etc...  \n\n⚠️ If you want to have an \"interactive\" conversation, you can enable the option `waiting_for_prompt`.  \nWhen set to True, it will create a `Resume` button, use this to unpause the node and process the prompt.  \n\n### Example in 3 steps of waiting_for_prompt interactive conversation\n\nStep 1: I run the workflow, notice that Show node is empty, the node is pausing the workflow and is waiting for you to edit the prompt. (Notice that at this moment, it is asking for the capital of France.)  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5461167255b8.png)  \n\nStep 2: I edit the prompt to change France into China, but the node won't process the request until you click on Resume.    \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a46341b62611.png)  \n\nStep 3: I click on Resume button, this is when the request is done. Notice that it used China and not France.  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_49144f27770c.png)  \n\nOther options :  \n- You also have `control_after_generate` to force the node to rerun for every workflow run. (Even if there is no modification of the node or its inputs.)  \n- You can set `max_tokens` to reduce the size of the answer, a token is about 3 english characters.  \n- You can force the answer to be on a single line, can be useful.  \n- You have the option to keep the mode in VRAM. (If you plan having to generate many times with the same prompt) - Each run will be significantly faster, but not free your VRAM for something else.  \n\n⚠️ Warning : Using `vram_retention_minutes` might be a bit heavy on your VRAM. Think about if you really need it or not. Most of the time, when using `vram_retention_minutes`, you don't want to have also a generation of image or anything else in the same time.  \n\n## 20 - 📹 Video Ping Pong\n\n**Description:**  \nCreate a ping-pong effect from a list of images (from a video) by reversing the playback direction when reaching the last frame. Good for an \"infinity loop\" effect.\n\n![Video Ping Pong](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_512c3d7af77e.png)\n\n## 21 - 🖼➜📹 Images to Video (FFMPEG Save Video)\n\n**Description:**  \nCombine a sequence of images into a video file.  \n\n![Images to Video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df1ebe75c50a.png)\n\n❓ I made this node because it supports transparency with webm format. (Needed for rembg)  \nTemporary images are stored in the folder `ComfyUI\u002Ftemp_images_imgs2video\u002F` as well as the wav audio file.\n\n## 22 - 🔲 Remove image Transparency (alpha)\n\n**Description:**  \nRemove transparency from an image by filling the alpha channel with a solid color. (black, white or greenscreen)  \nOf course it takes in an image with transparency, like from rembg nodes.  \nNecessary for some nodes that don't support transparency.  \n\n![Remove Alpha](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_159939f8f3c3.png)\n\n## 23 - 🔲 Image to grayscale (black & white)\n\n**Description:**  \nConvert an image to grayscale (black & white)  \n\n![Image to Grayscale](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_cb5d50ba2f17.png)\n\nExample : I sometimes use it with Ipadapter to disable color influence.  \nBut you can sometimes also want a black and white image... \n\n## 24 - 🖼+🖼 Stack two images (Background + Overlay)\n\n**Description:**  \nStack two images into a single image : a background and one (or several) transparent overlay. (allow to have a video there, just send all the frames and recombine them after.)  \n\n![Superpose Images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8fe90c42df85.png)\n\nUpdate 0.11 : Add option to move vertically and horizontally. (from -50% to 150%)  \n❗ Warning : For now, `background` is a static image. (I will allow video there later too.)  \n⚠️ Warning : If you want to directly load the image with transparency, use my node `🖼 Load Image with Transparency ▢` instead of the `Load Image` node.  \n\n## 25 - 🟩➜▢ Green Screen to Transparency\n\n**Description:**  \nTransform greenscreen into transparency.  \nNeed clean greenscreen ofc. (Can adjust threshold but very basic node.)\n\n![Greenscreen to Transparency](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_54a30b363664.png)\n\n## 26 - 🎲 Random line from input\n\n**Description:**  \nTake a random line from an input text. (When using multiple \"Write Text\" nodes is annoying for example, you can use that and just copy\u002Fpaste a list from outside.)  \nYou can change fixed\u002Frandomize for `control_after_generate` to have a different text each time you run the workflow. (or not)  \n\n![Random line from input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_24c285eaa78d.png)\n\n## 27 - ♻ Loop (All Lines from input)\n\n**Description:**  \nIterate over all lines from an input text. (Good for testing multiple lines of text.)\n\n![Loop input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_efcf28b1d422.png)\n\n## 28 - 🔢 Text with random Seed\n\n**Description:**  \n❗ This node is used to force to generate a random seed, along with text.  \nBut what does that mean ???  \nWhen you use a loop (♻), the loop will use the same seed for each iteration. (That is the point, it will keep the same seed to compare results.)  \nEven with `randomize` for `control_after_generate`, it is still using the same seed for every loop, it will change it only when the workflow is done.  \nSimple example without using random seed node : (Both images have different prompt, but same seed)  \n\n![Text with random Seed 1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6b9d93c9bd07.png)\n\nSo if you want to force using another seed for each iteration, you can use this node in the middle.\nFor example, if you want to generate a different image every time. (aka : You use loop nodes not to compare or test results but to generate multiple images.)  \nUse it like that for example : (Both images have different prompt AND different seed)  \n\n![Text with random Seed 2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a7c952cea916.png)\n\nHere is an example of the similarities that you want to avoid with FLUX with different prompt (hood\u002Fhelmet) but same seed :\n\n![Text with random Seed 3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c07e390faf63.png)\n\nHere is an example of the similarities that you want to avoid with SDXL with different prompt (blue\u002Fred) but same seed :\n\n![Text with random Seed 4](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_29ade3016187.png)\n\nFLUX : Here is an example of 4 images without Random Seed node on the left, and on the right 4 images with Random Seed node :\n\n![Text with random Seed 5](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_57354e7ef5fd.png)\n\n## 29 - 🖼 Load Image with Transparency ▢\n\n**Description:**  \nLoad an image with transparency.  \nThe default `Load Image` node will not load the transparency.  \n\n![Load image Alpha](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2a31957fb5c1.png)\n\n## 30 - 🖼✂ Cut image with a mask\n\n**Description:**  \nCut an image from a mask.  \n\n![Cut image](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5edc4eb10ab3.png)\n\n## 31 - 🔊 TTS - Text to Speech (100% local, any voice you want, any language)\n\n**Description:**  \nUse my TTS server to generate high quality speech from text, with any voice you want, any language.  \n[Listen to the audio example](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F5a4a67ff-cf70-4092-8f3b-1ccc8023d8c6)  \n\n![TTS](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_139e296ad855.png)\n\n❗ Node never tested on windows, only on linux for now. ❗  \n\nUse my TTS server to generate speech from text, based on XTTS v2.  \n❗ Of course to use this comfyui node (frontend) you need to use my TTS server (backend) : \u003Chttps:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_XTTS>  \nI made this backend for \u003Chttps:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_lobe-chat>, but you can use it with comfyui too with this node.  \nAfter having `Bjornulf_XTTS` installed, you NEED to create a link in my Comfyui custom node folder called `speakers` : `ComfyUI\u002Fcustom_nodes\u002FBjornulf_custom_nodes\u002Fspeakers`  \nThat link must be a link to the folder where you installed\u002Fstored the voice samples you use for my TTS, like `default.wav`.  \nIf my TTS server is running on port 8020 (You can test in browser with the link \u003Chttp:\u002F\u002Flocalhost:8020\u002Ftts_stream?language=en&speaker_wav=default&text=Hello>) and voice samples are good, you can use this node to generate speech from text.  \n\n**Details**  \nThis node should always be connected to a core node : `Preview audio`.  \n\nMy node will generate and save the audio files in the `ComfyUI\u002FBjornulf_TTS\u002F` folder, followed by the language selected, the name of the voice sample, and the text.  \nExample of audio file from the screenshot above : `ComfyUI\u002FBjornulf_TTS\u002FChinese\u002Fdefault.wav\u002F你吃了吗.wav`  \nYou can notice that you don't NEED to select a chinese voice to speak chinese. Yes it will work, you can record yourself and make yourself speak whatever language you want.  \nAlso, when you select a voice with this format `fr\u002Ffake_Bjornulf.wav`, it will create an extra folder `fr` of course. : `ComfyUI\u002FBjornulf_TTS\u002FEnglish\u002Ffr\u002Ffake_Bjornulf.wav\u002Fhello_im_me.wav`. Easy to see that you are using a french voice sample for an english recording.  \n\n`control_after_generate` as usual, it is used to force the node to rerun for every workflow run. (Even if there is no modification of the node or its inputs.)  \n`overwrite` is used to overwrite the audio file if it already exists. (For example if you don't like the generation, just set overwrite to True and run the workflow again, until you have a good result. After you can set it to back to False. (Paraphrasing : without overwrite set to True, It won't generate the audio file again if it already exists in the `Bjornulf_TTS` folder.)  \n`autoplay` is used to play the audio file inside the node when it is executed. (Manual replay or save is done in the `preview audio` node.)  \n\nSo... note that if you know you have an audio file ready to play, you can still use my node but you do NOT need my TTS server to be running.\nMy node will just play the audio file if it can find it, won't try to connect th backend TTS server.  \nLet's say you already use this node to create an audio file saying `workflow is done` with the Attenborough voice  :  \n\n![TTS](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6b4a291653aa.png)  \n\nAs long as you keep exactly the same settings, it will not use my server to play the audio file! You can safely turn the TTS server off, so it won't use your precious VRAM Duh. (TTS server should be using ~3GB of VRAM.)  \n\nAlso `connect_to_workflow` is optional, it means that you can make a workflow with ONLY my TTS node to pre-generate the audio files with the sentences you want to use later, example :  \n![TTS](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_69586e9801ae.png)  \n\nIf you want to run my TTS nodes along side image generation, i recommend you to use my PAUSE node so you can manually stop the TTS server after my TTS node. When the VRAM is freed, you can the click on the RESUME button to continue the workflow.  \nIf you can afford to run both at the same time, good for you, but Locally I can't run my TTS server and FLUX at the same time, so I use this trick. :  \n\n![TTS](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e4c7e90c44bd.png)  \n\n### 32 - 🧑📝 Character Description Generator\n\n**Description:**  \nGenerate a character description based on a json file in the folder `characters` : `ComfyUI\u002Fcustom_nodes\u002FBjornulf_custom_nodes\u002Fcharacters`  \nMake your own json file with your own characters, and use this node to generate a description.  \n\n![characters](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ae6974837dd1.png)\n![characters](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ec3f4d7f37bd.png)\n\n❗ For now it's very basic node, a lot of things are going to be added and changed !!!  \nSome details are unusable for some checkpoints, very much a work in progress, the json structure isn't set in stone either.  \nSome characters are included.  \n\n### 33 - ♻ Loop (All Lines from input 🔗 combine by lines)\n\n**Description:**  \nSometimes you want to loop over several inputs but you also want to separate different lines of your output.  \nSo with this node, you can have the number of inputs and outputs you want. See example for usage.  \n\n![loop combined](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2677da25a51c.png)\n\n### 34 - 🧹 Free VRAM hack\n\n**Description:**  \nSo this is my attempt at freeing up VRAM after usage, I will try to improve that.  \n\n![free vram](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f68edfe180f5.png)\n![free vram](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4e24498ed0ea.png)\n\nFor me, on launch ComfyUI is using 180MB of VRAM, after my clean up VRAM node it can go back down to 376MB.  \nI don't think there is a clean way to do that, so I'm using a hacky way.  \nSo, not perfect but better than being stuck at 6GB of VRAM used if I know I won't be using it again...  \nJust connect this node with your workflow, it takes anything as input and return it as output.\nYou can therefore put it anywhere you want.  \n❗ Comfyui is using cache to run faster (like not reloading checkpoints), so only use this free VRAM node when you need it.  \n❗ For this node to work properly, you need to enable the dev\u002Fapi mode in ComfyUI. (You can do that in the settings)  \nIt is also running an \"empty\u002Fdummy\" workflow to free up the VRAM, so it might take a few seconds to take effect after the end of the workflow.  \n\n### 35 - ⏸️ Paused. Resume or Stop ?\n\n**Description:**  \nAutomatically pause the workflow, and rings a bell when it does. (play the audio `bell.m4a` file provided)  \n\n![pause resume stop](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_84d28e7c80b4.png)\n![pause resume stop](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1c081d21c7c1.png)\n![pause resume stop](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2869e578210b.png)\n\nYou can then manually resume or stop the workflow by clicking on the node's buttons.  \nI do that let's say for example if I have a very long upscaling process, I can check if the input is good before continuing. Sometimes I might stop the workflow and restart it with another seed.  \nYou can connect any type of node to the pause node, above is an example with text, but you can send an IMAGE or whatever else, in the node `input = output`. (Of course you need to send the output to something that has the correct format...)  \n\n### 36 - ⏸️🔍 Paused. Select input, Pick one\n\n**Description:**  \nAutomatically pause the workflow, and rings a bell when it does. (play the audio `bell.m4a` file provided)  \n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b07a3dd2c676.png)\n\nYou can then manually select the input you want to use, and resume the workflow with it.  \nYou can connect this node to anything you want, above is an example with IMAGE. But you can pick whatever you want, in the node `input = output`.  \n\n### 37 - 🎲🖼 Random Image\n\n**Description:**  \nJust take a random image from a list of images.  \n\n![random image](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e9a88cca9417.png)\n\n### 38 - ♻🖼 Loop (Images)\n\n**Description:**  \nLoop over a list of images.  \n\n![loop images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2792bf26f380.png)\n\nUsage example : You have a list of images, and you want to apply the same process to all of them.  \nAbove is an example of the loop images node sending them to an Ipadapter workflow. (Same seed of course.)  \n\n### 39 - ♻ Loop (✒🗔🅰️ Advanced Write Text)\n\n**Description:**  \nIf you need a quick loop but you don't want something too complex with a loop node, you can use this combined write text + loop.  \n\n![loop write text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ec4ec512c06b.png)\n\nIt will take the same special syntax as the Advanced write text node `{blue|red}`, but it will loop over ALL the possibilities instead of taking one at random.  \n0.40 : You can also use variables `\u003Cname>` in the loop.  \n\n### 40 - 🎲 Random (Model+Clip+Vae) - aka Checkpoint \u002F Model\n\n**Description:**  \nJust simply take a trio at random from a load checkpoint node.  \n\n![random checkpoint](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c5ed7d3a1ae9.png)\n\nNotice that it is using the core Load checkpoint node. It means that all checkpoint will be preloaded in memory.  \n\nDetails :  \n- It will take more VRAM, but it will be faster to switch between checkpoints.  \n- It can't give you the currently loaded checkpoint name's.  \n\nCheck node number 41 before deciding which one to use.  \n\n### 41 - 🎲 Random Load checkpoint (Model Selector)\n\n**Description:**  \nThis is another way to select a load checkpoint node randomly.  \n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f50a1e5f33cf.png)\n\nIt will not preload all the checkpoints in memory, so it will be slower to switch between checkpoints.  \nBut you can use more outputs to decide where to store your results. (`model_folder` is returning the last folder name of the checkpoint.)  \nI always store my checkpoints in a folder with the type of the model like `SD1.5`, `SDXL`, etc... So it's a good way for me to recover that information quickly.  \n\nDetails :  \n- Note that compared to node 40, you can't have separate configuration depending of the selected checkpoint. (For example `CLIP Set Last Layer` node set at -2 for a specific model, or a separate vae or clip.) Aka : All models are going to share the exact same workflow.  \n\nCheck node number 40 before deciding which one to use.  \nNode 53 is the loop version of this node.  \n\nNOTE : If you want to load a single checkpoint but want to extract its folder name (To use the checkpoint name as a folder name for example, or with if\u002Felse node), you can use my node 41 with only one checkpoint. (It will take one at random, so... always the same one.)    \n\n### 42 - ♻ Loop (Model+Clip+Vae) - aka Checkpoint \u002F Model\n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8de78266f191.png)\n\n**Description:**  \nLoop over all the trios from several checkpoint node.  \n\n### 43 - 📥🖼📂 Load Images from output folder\n\n**Description:**  \nQuickly select all images from a folder inside the output folder. (Not recursively.)  \n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_51fcd302c15d.png)\n\nSo... As you can see from the screenshot the images are split based on their resolution.  \nIt's also not possible to edit dynamically the number of outputs, so I just picked a number : 4.  \nThe node will separate the images based on their resolution, so with this node you can have 4 different resolutions per folder. (If you have more than that, maybe you should have another folder...)  \nTo avoid error or crash if you have less than 4 resolutions in a folder, the node will just output white tensors. (white square image.)  \nSo this node is a little hacky for now, but i can select my different characters in less than a second.  \nIf you want to know how i personnaly save my images for a specific character, here is part of my workflow (Notice that i personnaly use \u002F for folders because I'm on linux) :  \n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2c1b305c37b9.png)  \nIn this example I put \"character\u002F\" as a string and then combine with \"nothing\". But it's the same if you do \"character\" and then combine with \"\u002F\". (I just like having a \u002F at the end of my folder's name...)  \n\nIf you are satisfied with this logic, you can then select all these nodes, right click and `Convert to Group Node`, you can then have your own customized \"save character node\" :  \n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ccf5051d6a09.png)\n\nHere is another example of the same thing but excluding the save folder node :  \n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_545b2279ce0f.png)\n\n⚠️ If you really want to regroup all the images in one flow, you can use my node 47 `Combine images` to put them all together.  \n\n### 44 - 🖼👈 Select an Image, Pick\n\n**Description:**  \nSelect an image from a list of images.  \n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b05187738925.png)  \n\nUseful in combination with my Load images from folder and preview image nodes.  \n\nYou can also of course make a group node, like this one, which is the same as the screenshot above :  \n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_57a3d58db1a2.png)\n\n### 45 - 🔀 If-Else (input \u002F compare_with)\n\n**Description:**  \nComplex logic node if\u002Felse system.  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8a9bb68b4a0d.png)  \n\nIf the `input` given is equal to the `compare_with` given in the widget, it will forward `send_if_true`, otherwise it will forward `send_if_false`. (If no `send_if_false` it will return `None`.)  \nYou can forward anything, below is an example of forwarding a different size of latent space depending if it's SDXL or not.  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d8f740c4851c.png)\n\nHere is an example of the node with all outputs displayed with Show text nodes :  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6a28d5947c9b.png)\n\n`send_if_false` is optional, if not connected, it will be replaced by `None`.  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e438f542eaac.png)\n\nIf-Else are chainables, just connect `output` to `send_if_false`.  \n⚠️ Always simply test `input` with `compare_with`, and connect the desired value to `send_if_true`. ⚠️  \nHere a simple example with 2 If-Else nodes (choose between 3 different resolutions).  \n❗ Notice that the same write text node is connected to both If-Else nodes input :  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_57dc89a1f7d4.png)\n\nLet's take a similar example but let's use my Write loop text node to display all 3 types once :  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8a7ceb2c1912.png)\n\nIf you understood the previous examples, here is a complete example that will create 3 images, landscape, portrait and square :  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d4ee9b281913.png)\n\nWorkflow is hidden for simplicity, but is very basic, just connect latent to Ksampler, nothing special.)  \nYou can also connect the same advanced loop write text node with my save folder node to save the images (landscape\u002Fportrait\u002Fsquare) in separate folders, but you do you...  \n\n### 46 - 🖼🔍 Image Details\n\n**Description:**  \nDisplay the details of an image. (width, height, has_transparency, orientation, type)  \n`RGBA` is considered as having transparency, `RGB` is not.  \n`orientation` can be `landscape`, `portrait` or `square`.  \n\n![image details](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b7de7f64a078.png)\n\n### 47 - 🖼🔗 Combine Images\n\n**Description:**  \nCombine multiple images (A single image or a list of images.)  \nIf you want to merge several images into a single image, check node 60 or 61.  \n\nThere are two types of logic to \"combine images\". With \"all_in_one\" enabled, it will combine all the images into one tensor.  \nOtherwise it will send the images one by one. (check examples below) :  \n\nThis is an example of the \"all_in_one\" option disabled (Note that there are 2 images, these are NOT side by side, they are combined in a list.) :  \n\n![combine images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ae92470e49a8.png)\n\nBut for example, if you want to use my node `select an image, pick`, you need to enable `all_in_one` and the images must all have the same resolution.  \n\n![combine images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4cc6678b5785.png)\n\nYou can notice that there is no visible difference when you use `all_in_one` with `preview image` node. (this is why I added the `show text` node, note that show text will make it blue, because it's an image\u002Ftensor.)  \n\nWhen you use `combine image` node, you can actually also send many images at once, it will combine them all.  \nHere is an example with `Load images from folder` node, `Image details` node and `Combine images` node. (Of course it can't have `all_in_one` set to True in this situation because the images have different resolutions) :  \n\n![combine images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5e84531204c5.png)\n\nHere another simple example taking a few selected images from a folder and combining them (For later processing for example) :  \n\n![combine images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2065d57f87d0.png)\n\n### 48 - 🔀🎲 Text scrambler (🧑 Character)\n\n**Description:**  \nTake text as input and scramble (randomize) the text by using the file `scrambler\u002Fcharacter_scrambler.json` in the comfyui custom nodes folder.  \n\n![scrambler character](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_914826487bc0.png)\n\n### 49 - 📹👁 Video Preview\n\n**Description:**  \nThis node takes a video path as input and displays the video.  \n\n![video preview](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1713c77a49b3.png)\n\n### 50 - 🖼➜📹 Images to Video path (tmp video)\n\n**Description:**  \nThis node will take a list of images and convert them to a temporary video file.  \n❗ Update 0.50 : You can now send audio to the video. (audio_path OR audio TYPE)  \n\n![image to video path](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8345bb58779d.png)\n\n### 51 - 📹➜🖼 Video Path to Images\n\n**Description:**  \nThis node will take a video path as input and convert it to a list of images.  \n\n![video path to image](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_487d44d87cc5.png)\n\nIn the above example, I also take half of the frames by setting `frame_interval` to 2.  \nNote that i had 16 frames, on the top right preview you can see 8 images.  \n\n### 52 - 🔊📹 Audio Video Sync\n\n**Description:**  \n\nThis node is an overengineered node that will try to synchronize the duration of an audio file with a video file.  \n❗ Video ideally needs to be a loop, check my ping pong video node if needed.\nThe main goal of this synchronization is to have a clean transition between the end and the beginning of the video. (same frame)  \nYou can then chain up several video and they will transition smoothly.\n\nSome details, this node will :  \n- If video slightly too long : add silence to the audio file.  \n- If video way too long : will slow down the video up to 0.50x the speed + add silence to the audio. (now editable)  \n- If audio slightly too long : will speed up video up to 1.5x the speed. (now editable)  \n- If video way too long : will speed up video up to 1.5x the speed + add silence to the audio.  \n\nIt is good like for example with MuseTalk \u003Chttps:\u002F\u002Fgithub.com\u002Fchaojie\u002FComfyUI-MuseTalk>\n\nHere is an example of the `Audio Video Sync` node, notice that it is also convenient to recover the frames per second of the video, and send that to other nodes. (Spaghettis..., deal with it. 😎 If you don't understand it, you can test it.) :  \n\n![audio sync video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d6aac27835e5.png)\n\n❗ Update 0.50 : audio_duration is now optional, if not connected it will take it from the audio.  \n❗ Update 0.50 : You can now send the video with a list of images OR a video_path, same for audio : AUDIO or audio_path.  \n\nNew v0.50 layout, same logic :  \n\n![audio sync video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_54c4965b1d8d.png)\n\n### 53 - ♻ Loop Load checkpoint (Model Selector)\n\n**Description:**  \nThis is the loop version of node 41. (check there for similar details)  \nIt will loop over all the selected checkpoints.  \n\n❗ The big difference with 41 is that checkpoints are preloaded in memory. You can run them all faster all at once.  \nIt is a good way to test multiple checkpoints quickly.  \n\n![loop model selector](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4e173f6e147d.png)\n\n### 54 - ♻ Loop Lora Selector\n\n**Description:**  \nLoop over all the selected Loras.  \n\n![loop lora selector](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e138d064d18f.png)  \n\nAbove is an example with Pony and several styles of Lora.  \n\nBelow is another example, here with flux, to test if your Lora training was undertrained, overtrained or just right :  \n\n![loop lora selector](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a1a43172f0b7.png)\n\n### 55 - 🎲 Random Lora Selector\n\n**Description:**  \nJust take a single Lora at random from a list of Loras.  \n\n![random lora selector](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3ec61f07c9ce.png)\n\n### 56 - ♻📑📝 Loop Sequential (Integer)\n\n**Description:**  \nThis loop works like a normal loop, BUT it is sequential : It will run only once for each workflow run !!!  \nThe first time it will output the first integer, the second time the second integer, etc...  \nWhen the last is reached, the node will STOP the workflow, preventing anything else to run after it.  \nUnder the hood it is using a single file `counter_integer.txt` in the `ComfyUI\u002FBjornulf` folder.  \n❗ Do not use more than one node like this one in a workflow, because they will share the same `counter_integer.txt` file. (unexpected behaviour.)\nUpdate 0.57: Now also contains the next counter in the reset button.  \n\n![loop sequential integer](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_74bb9de83d31.png)  \n![loop sequential integer](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3f4cf7a5ad9d.png)  \n![loop sequential integer](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4bfef1ff02c5.png)  \n![loop sequential integer](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4f4730784dc5.png)  \n\n### 57 - ♻📑 Loop Sequential (input Lines)\n\n**Description:**  \nThis loop works like a normal loop, BUT it is sequential : It will run only once for each workflow run !!!  \nThe first time it will output the first line, the second time the second line, etc...  \nYou also have control of the line with +1 \u002F -1 buttons.  \nWhen the last is reached, the node will STOP the workflow, preventing anything else to run after it.  \nUnder the hood it is using the file `counter_lines.txt` in the `ComfyUI\u002FBjornulf` folder.  \n\nHere is an example of usage with my TTS node : when I have a list of sentences to process, if i don't like a version, I can just click on the -1 button, tick \"overwrite\" on TTS node and it will generate the same sentence again, repeat until good.  \n❗ Do not use more than one node like this one in a workflow, because they will share the same `counter_lines.txt` file. (unexpected behaviour.)\n\n![loop sequential line](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a28b699e6aec.png)  \n\nUpdate 0.57: Now also contains the next counter in the reset button.  \nIf you want to be able to predict the next line, you can use node 68, to Add line numbers.\n\n### 58 - 📹🔗 Concat Videos\n\n**Description:**  \nTake two videos and concatenate them. (One after the other in the same video.)  \nConvert a video, can use FFMPEG_CONFIG_JSON. (From node 76 \u002F 77)    \n\n![concat video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df5f3f4b824b.png)  \n\n### 59 - 📹🔊 Combine Video + Audio\n\n**Description:**  \nSimply combine video and audio together.  \nVideo : Use list of images or video path.   \nAudio : Use audio path or audio type.  \n\n![combine video audio](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_15422dd3ca7c.png)  \n\n### 60 - 🖼🖼 Merge Images\u002FVideos 📹📹 (Horizontally)\n\n**Description:**  \nMerge images or videos horizontally.  \n\n![merge images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4dea0a594202.png)  \n\nHere is one possible example for videos with node 60 and 61 :  \n\n![merge videos](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e32bf2e6a516.png)  \n\n### 61 - 🖼🖼 Merge Images\u002FVideos 📹📹 (Vertically)\n\n**Description:**  \nMerge images or videos vertically.  \n\n![merge images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_464336d30324.png)  \n\nHere is one possible example for videos with node 60 and 61 :  \n\n![merge videos](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e32bf2e6a516.png)  \n\n### 62 - 🦙👁 Ollama Vision\n\n**Description:**  \nTake an image as input and will describe the image. Uses `moondream` by default, but can select anything with node 63, and a custom prompt with node 161.  \n\n![ollama vision](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_97bad0b277ee.png)  \n\n### 63 - 🦙 Ollama Configuration ⚙\n\n**Description:**  \nUse custom configurations for Ollama Talk and Vision.  \nYou can change the ollama Url and the model used.  \nSome vision models can also do text to a certain extent.  \nExample of a `Ollama Vision Node` and `Ollama Talk Node` using the same `Ollama Configuration Node` :  \n\n![ollama config](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_fd876d84ae4d.png)  \n\n### 64 - 🦙 Ollama Job Selector 💼\n\n**Description:**  \nSelect a personnality for your Ollama Talk Node, set it to `None` for just chat.  \nIf you want to write your own, just set it to `None` and write your prompt as prefix.  \n\n![ollama job](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_539e5255c70d.png)  \n\n### 65 - 🦙 Ollama Persona Selector 🧑\n\n**Description:**  \nSelect a personnality for your Ollama Talk Node.  \nIf you want to write your own, just set it to `None` and write your prompt as prefix.  \nBelow, an example of a crazy scientist explaining gravity. (Notice that the LLM was smart enough to understand the typo) :  \n\n![ollama persona](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d6f6ad9892ab.png)  \n\n### 66 - 🔊➜📝 STT - Speech to Text\n\n**Description:**  \nUse `faster-whisper` to transform an AUDIO type or audio_path into text. (Autodetect language)  \n\n⚠️ Warning, this node is not compatible with python `3.13`, you need to use `3.12`. (As a gereneral rule, comfyui ecosystem still recommend you to use 3.12 : https:\u002F\u002Fgithub.com\u002Fcomfyanonymous\u002FComfyUI?tab=readme-ov-file#manual-install-windows-linux.)  \n(faster-whisper was removed from requirements.txt and must be installed manually.)  \nIf you really want to use that node, you are responsible for installing that manually : `pip install faster-whisper`.  \n\n![stt](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3406fe3c9f98.png)  \n![stt](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_99785d5eced2.png)  \n\n### 67 - 📝➜✨ Text to Anything\n\n**Description:**  \nSometimes you want to force a node to accept a STRING.  \nYou can't do that for example if the node is taking a LIST as input.  \nThis node can be used in the middle to force a STRING to be used anyway.  \nBelow is an example of that with my TTS node.  \n\n![text to anything](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f6913c09d3f1.png)  \n\n### 68 - ✨➜📝 Anything to Text\n\n**Description:**  \nSometimes you want to force something to be a STRING.  \nMost outputs are indeed text, even though they might be unusable.  \nThis node ignore this fact and simply convert the input to a simple STRING.  \n\n### 69 - 🔢 Add line numbers\n\n**Description:**  \n\nThis node will just add line numbers to text.  \nUseful when you want to use node 57 that will loop over input lines. (You can read\u002Fpredict the next line.)  \n\n![add line numbers](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7438a7e42ca3.png)  \n\n### 70 - 📏 Resize Image Percentage\n\n**Description:**  \n\nResize an image by percentage.  \n\n![resize percentage](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d7123645f0bf.png)  \n\n### 71 - 👁 Show (Int)\n\n**Description:**  \nBasic node, show an INT. (You can simply drag any INT node and it will be recommended.)  \n\n![show int](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_fb77c91e5832.png)  \n\n### 72 - 👁 Show (Float)\n\n**Description:**  \nBasic node, show a FLOAT. (You can simply drag any FLOAT node and it will be recommended.)  \n\n![show float](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_70c310d3ead6.png)  \n\n### 73 - 👁 Show (String\u002FText)\n\n**Description:**  \nBasic node, show a STRING. (You can simply drag any STRING node and it will be recommended.)  \n\n![show string](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ee763e480a4e.png)  \n![show string](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7360b5f796be.png)  \n\n### 74 - 👁 Show (JSON)\n\n**Description:**  \nThis node will take a STRING and format it as a readable JSON. (and pink)  \n\n![show json](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d09d0838eb34.png)  \n![show json](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_0772b673f8de.png)  \n\n### 75 - 📝➜📝 Replace text\n\n**Description:**  \nReplace text with another text, allow regex and more options, check examples below :  \n\n![text replace](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_704bad51f0af.png)  \n![text replace](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e5d3d5b185e0.png)  \n![text replace](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_993a70ed3d3e.png)  \n\n0.70 ： Text replace now have multiline option for regex.\n\n### 76 - ⚙📹 FFmpeg Configuration 📹⚙\n\n**Description:**  \nCreate a FFMPEG_CONFIG_JSON, it will contains a JSON that can be used by other nodes :\n- Convert video\n- Concat videos\n- Concat video from list\n\n![text replace](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c45ddc75e422.png)  \n\n### 77 - 📹🔍 Video details ⚙\n\n**Description:**  \nExtract details from a video_path.  \nYou can use the all-in-one FFMPEG_CONFIG_JSON with other nodes or just use the other variables as your want.  \n\n![video details](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7288b33f6f80.png)  \n\n### 78 - 📹➜📹 Convert Video\n\n**Description:**  \nConvert a video, can use FFMPEG_CONFIG_JSON.  \n\n![convert video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d39938bc4f15.png)  \n\n#### 79 - 📹🔗 Concat Videos from list\n\n**Description:**  \nTake a list of videos (one per line) and concatenate them. (One after the other in the same video.)  \nCan use FFMPEG_CONFIG_JSON. (From node 76 \u002F 77)    \n\n![concat video list](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_044f06740e4a.png)  \n\n#### 80 - 🩷 Empty Latent Selector\n\n**Description:**  \nTired of setting up latent space manually ?  \nSelect one from my custom list of formats.  \nJust connect that to your KSampler.  \n\n![empty_latent](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6aeca9e4e67b.png)  \n\n#### 81 - 🔥📝🖼 Image Text Generator 🖼📝🔥\n\n**Description:**  \nMain node to generate content, doesn't really do much by itself, just `camera angle` and `multicharacter action`. (For example : `... eat picnic, view from above.`)  \nBUT, you can connect others `Text Generator Nodes` to it.  \n\n⚠️ Warning for \"Text Generator\" : This node is JUST writing text, text is then interpreted by a checkpoint (SD1.5, SDXL, Flux...) to generate an image.  \nSome models are very bad at doing some things, so DON'T EXPECT for everything you do to work properly all the time with every checkpoints or loras. (This node was made with FLUX in mind.)  \n\nBelow is a Tutorial on how to use all my `Text Generator nodes`. I did that small tutorial in 8 steps:  \n\nStep 1 : You use the main Text Generator node, it will write general details about the image (here `camera_angle` and `shot_type`) - For now I just combine the text to a simple \"write text\" that will send `swamp monster` :  \n![textgen](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f91aafdb2497.png)  \n\nStep 2 : Add a specific style to your image :  \n![textgen_style](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c67dc97d56c7.png)  \n\nStep 3 : Add scene\u002Fbackground to your image :  \n![textgen_scene](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3d0545743178.png)  \n\nStep 4 : Add a character to the scene using a character node, instead of the Write text Node.  \nI will remove the \"swamp monster\" from the \"write text node\" and use my Character Node instead, I will use it to create an agressive dragon with lighting powers :  \n![textgen_char](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c92b066f52c5.png)  \n\nStep 5 : Character nodes (Male\u002FFemale and creatures) can contain more than one character. (But they will share the same characteristics)  \nBelow I removed the dragon and I created 2 \"Character male\" fighting by using the `multi_char_action` from the main node. (You can set it to CUSTOM and write your own action too.)  \n![textgen_2chars](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b4d040d776e2.png)  \n\nStep 5 : Let's try to add a location for the character, I want to put it on the left of the image. Here is a failure with the SDXL model I have been using all along :    \n![textgen_charposition_FAIL_sdxl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1dcac42f692b.png)  \n\nStep 6 : Switch to FLUX to test the `location_on_image` feature (which is working) :  \n![textgen_location_on_image_flux](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_038fc6e9b94b.png)  \n\nStep 7 : Switch to API black Forest Lab with FLUX Ultra, using my API custom node 109.  \nIf you want several characters with different characteristics (like `location_on_image` or whatever), you can chain several Character Nodes together by connecting them to each other.  \nYou can see below that I asked for 2 tiny dragons on the left and a zombie on the right.  \n![textgen_Complex_ULTRA](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9d8d4fcfcf5f.png)  \n\nStep 8 : And to end this tutorial, I will disable the Zombie, I will add an outfit (here a `floral armor`), I will also add a `pose` node for the character and also connect this pose node to an `object` node. (They will together make the character `hold a book` and put his `hand on chin`)  \n![textgen_final](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_53863dc80c4f.png)  \n\n#### 82 - 👩‍🦰📝 Text Generator (Character Female)\n\n**Description:**  \nGenerate text related to female characters.  \nNeed to be connected to \"Text Generator\" main node.  \n\n⚠️ For \"Text Generator\" tutorial see node 81.  \n\n#### 83 - 👨‍🦰📝 Text Generator (Character Male)\n\n**Description:**  \nGenerate text related to male characters.  \n\n⚠️ For \"Text Generator\" tutorial see node 81.  \n\n#### 84 - 👾📝 Text Generator (Character Creature)\n\n**Description:**  \nGenerate text related to creatures. (characters)  \n\n⚠️ For \"Text Generator\" tutorial see node 81.  \n\n#### 85 - 💃🕺📝 Text Generator (Character Pose)\n\n**Description:**  \nGenerate text related to the pose of characters.  \n\n⚠️ For \"Text Generator\" tutorial see node 81.  \n\n#### 86 - 🔧👨‍🔧📝 Text Generator (Object for Character)\n\n**Description:**  \nGenerate text related to an object connected to a pose, that is connected to a character.  \n\n⚠️ For \"Text Generator\" tutorial see node 81.  \n\n#### 87 - 🌄📝 Text Generator (Scene)\n\n**Description:**  \nGenerate text related to a specific scene, connects directly to the main text generator.  \n\n⚠️ For \"Text Generator\" tutorial see node 81.  \n\n#### 88 - 🎨📝 Text Generator (Style)\n\n**Description:**  \nGenerate text related to a specific style, connects directly to the main text generator.  \n\n⚠️ For \"Text Generator\" tutorial see node 81.  \n\n#### 89 - 👗 Text Generator (Outfit Female)\n\n**Description:**  \nGenerate text related to a specific female outfit.  \n\n⚠️ For \"Text Generator\" tutorial see node 81.  \n\n#### 90 - 👚 Text Generator (Outfit Male)\n\n**Description:**  \nGenerate text related to a specific male outfit.  \n\n⚠️ For \"Text Generator\" tutorial see node 81.  \n\n#### 91 - ♻🔥📝 List Looper (Text Generator)\n\n**Description:**  \nLoop made to loop over elements for the main node text generator.  \n\nAll the `List Looper` nodes have the same logic, you should be able to use them all the same way.  \nHere is an example with node 92 (list looper scenes), looping over all the different `weather_condition` :  \n\n![listlooper_USE](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_96b5d9490ced.png)  \n\n⚠️ Note, if you want to Loop over the elements `One by One`, Not all-in one, DO NOT use this `list looper nodes` !!  \nYou can just convert the element you want as input and double click to create a new node that you can set to \"increment\".  \n\nExample, here you can see that the value was \"incremented\", aka changed to the next from the list, the next run will then have the next value from the list (and so on) :  \n![listlooper_notUSE](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d336ba88b804.png)  \n\n#### 92 - ♻🌄📝 List Looper (Text Generator Scenes)\n\n**Description:**  \nLoop made to loop over elements for the node scenes.  \n\n⚠️ For \"List Looper\" tutorial see node 91.  \n\n#### 93 - ♻🎨📝 List Looper (Text Generator Styles)\n\n**Description:**  \nLoop made to loop over elements for the node style.  \n\n⚠️ For \"List Looper\" tutorial see node 91.  \n\n#### 94 - ♻💃🕺📝 List Looper (Text Generator Poses)\n\n**Description:**  \nLoop made to loop over elements for the node poses.  \n\n⚠️ For \"List Looper\" tutorial see node 91.  \n\n#### 95 - ♻👨‍🦰👩‍🦰👾 List Looper (Text Generator Characters)\n\n**Description:**  \nLoop made to loop over elements for the node charceter (male\u002Ffemale\u002Fcreature).  \n\n⚠️ For \"List Looper\" tutorial see node 91.  \n\n#### 96 - ♻👚 List Looper (Text Generator Outfits Male)\n\n**Description:**  \nLoop made to loop over elements for the node for male outfits.  \n\n⚠️ For \"List Looper\" tutorial see node 91.  \n\n#### 97 - ♻👗 List Looper (Text Generator Outfits Female)\n\n**Description:**  \nLoop made to loop over elements for the node for female outfits.  \n\n⚠️ For \"List Looper\" tutorial see node 91.  \n\n#### 98 - 📥 Load checkpoint SD1.5 (+Download from CivitAi)\n\n**Description:**  \nThis is the same as a basic \"Load checkpoint\" node, but the list is from civitai (not your local folder).  \nIt will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)  \nThis is the `sd1.5` version, it will download the models in : `ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fsd1.5`  \nAfter downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic \"Load checkpoint\" node.  \n\n![civitai_load_sd15](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8eec8fb9ebca.png)  \n\n#### 99 - 📥 Load checkpoint SDXL (+Download from CivitAi)\n\n**Description:**  \nThis is the same as a basic \"Load checkpoint\" node, but the list is from civitai (not your local folder).  \nIt will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)  \nThis is the `sdxl_1.0` version, it will download the models in : `ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fsdxl_1.0`  \nAfter downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic \"Load checkpoint\" node.  \n\n![civitai_load_sdxl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_58d8d3d17003.png)  \n\n#### 100 - 📥 Load checkpoint Pony (+Download from CivitAi)\n\n**Description:**  \nThis is the same as a basic \"Load checkpoint\" node, but the list is from civitai (not your local folder).  \nIt will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)  \nThis is the `pony` version, it will download the models in : `ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fpony`  \nAfter downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic \"Load checkpoint\" node.  \n\n![civitai_load_pony](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8d2345a555b0.png)  \n\n#### 101 - 📥 Load checkpoint FLUX Dev (+Download from CivitAi)\n\n**Description:**  \nThis is the same as a basic \"Load checkpoint\" node, but the list is from civitai (not your local folder).  \nIt will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)  \nThis is the `flux_d` version, it will download the models in : `ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fflux_d`  \nAfter downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic \"Load checkpoint\" node.  \n\n🚧 Work in progress, need to manually clean up list, diffusers, etc.. ? 🚧\n\n#### 102 - 📥 Load checkpoint FLUX Schnell (+Download from CivitAi)\n\n**Description:**  \nThis is the same as a basic \"Load checkpoint\" node, but the list is from civitai (not your local folder).  \nIt will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)  \nThis is the `flux_s` version, it will download the models in : `ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fflux_s`  \nAfter downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic \"Load checkpoint\" node.  \n\n🚧 Work in progress, need to manually clean up list, diffusers, etc.. ? 🚧\n\n#### 103 - 📥👑 Load Lora SD1.5 (+Download from CivitAi)\n\n**Description:**  \nThis is the same as a basic \"Load lora\" node, but the list is from civitai (not your local folder).  \nIt will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)  \nThis is the `sd_1.5` version, it will download the lora in : `ComfyUI\u002Fmodels\u002Floras\u002FBjornulf_civitAI\u002Fsd_1.5`  \nAfter downloading, you can keep using this node as is to load your lora, or use the downloaded lora from a basic \"Load lora\" node.  \n\nBelow is an example with Lora \"Colorize\" :  \n\n![civitai_lora_sd15](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9ab782b29d69.png)  \n\n#### 104 - 📥👑 Load Lora SDXL (+Download from CivitAi)\n\n**Description:**  \nThis is the same as a basic \"Load lora\" node, but the list is from civitai (not your local folder).  \nIt will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)  \nThis is the `sdxl_1.0` version, it will download the lora in : `ComfyUI\u002Fmodels\u002Floras\u002FBjornulf_civitAI\u002Fsdxl_1.0`  \nAfter downloading, you can keep using this node as is to load your lora, or use the downloaded lora from a basic \"Load lora\" node.  \n\nBelow is an example with Lora \"Better faces\" :  \n\n![civitai_lora_sdxl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d0a30275e3b9.png)  \n\n#### 105 - 📥👑 Load Lora Pony (+Download from CivitAi)\n\n**Description:**  \nThis is the same as a basic \"Load lora\" node, but the list is from civitai (not your local folder).  \nIt will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)  \nThis is the `pony` version, it will download the lora in : `ComfyUI\u002Fmodels\u002Floras\u002FBjornulf_civitAI\u002Fpony`  \nAfter downloading, you can keep using this node as is to load your lora, or use the downloaded lora from a basic \"Load lora\" node.  \n\n![civitai_lora_pony](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9b34b46db3ec.png)  \n\n#### 106 - ☁🎨 API Image Generator (FalAI) 🎨☁\n\n**Description:**  \nGenerate images with only a token.  \nThis is the `fal.ai` version and will save the image in `ComfyUI\u002Foutput\u002FAPI\u002FCivitAI\u002F`\n\n![api falai](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1d561720c6a4.png)  \n\n#### 107 - ☁🎨 API Image Generator (CivitAI) 🎨☁\n\n**Description:**  \nGenerate images with only a token.  \nThis is the `civit.ai` version and will save the image in `ComfyUI\u002Foutput\u002FAPI\u002FCivitAI\u002F`  \n⚠️ Warning : Civitai isn't the best reliable API, sometimes it doesn't answer, or take long time to answer, some urn don't answer as well as others, etc...  \nUse it at your own risks, I do not recommend running anything \"costly\" using their API, like Flux Ultra, etc... (Use the website instead with blue buzz)  \nAPI requests (like from this node) are using yellow buzz.  \n\n![api civitai](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6f2c242960a8.png)  \n\n#### 108 - ☁👑 Add Lora (API ONLY - CivitAI) 👑☁\n\n**Description:**  \nUse lora with the API, below is an example to see clearly with the same seed the different with\u002Fwithout\u002Flora.  \n\n![api civitai lora](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3d1240160d01.png)  \n\n#### 109 - ☁🎨 API Image Generator (Black Forest Labs - Flux) 🎨☁\n\n**Description:**  \nGenerate an image with the Black Forest Labs API. (flux)  \n\n![api black forest](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_50d76ee1b88c.png)  \n\n#### 110 - ☁🎨 API Image Generator (Stability - Stable Diffusion) 🎨☁\n\n**Description:**  \nGenerate an image with the Stability API. (sd3)  \n\n![api stability](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e64f77671b95.png)  \n\n#### 111 - ✨➜🔢 Anything to Int\n\n**Description:**   \n\nJust convert anything to a valid INT. (integer)  \n\n![Anything to Int](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a686b1e276ad.png)  \n\n#### 112 - ✨➜🔢 Anything to Float\n\n**Description:**  \n\nJust convert anything to a valid FLOAT. (floating number)  \n\n![Anything to Float](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_789ee855983e.png)  \n\n#### 113 - 📝🔪 Text split in 5\n\n**Description:**  \n\nTake a single input and split it in 5 with a delimiter (newline by default).  \nIt can also ignore everything on the left side of a `=` symbol if you want to use a \"variable type format\".  \n\n![Text split in 5](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_08e921c4da59.png)  \n\n#### 114 - 📥👑 Load Lora with Path\n\n**Description:**  \n\nLoad a lora by using it's path.  \n\n![load lora with path](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_501354fb6e83.png)  \n\nHere is a complex practical example using node 113, 114, 112 :  \n![load lora with path](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2b8fc6b8c099.png)  \n\n#### 115 - 📥 Load Text From Bjornulf Folder\n\n**Description:**  \n\nJust select a file from the folder `Bjornulf\u002FText` folder, it will recover its content.  \nIt is made to be used with node 15 `Save Text`.  \n\n![Load Text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f77d7d52e23b.png)  \n\n#### 116 - 📥 Load Text From Path \n\n**Description:**  \n\nJust give the path of the file, it will recover its content.  \n\n![Load Text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b0ea9dd9a2c7.png)  \n\nIf you want, with `Load Text From Path` you can also recover the elements in \"Bjornulf\u002FText\" by just adding it:  \n\n![Load Text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7ce15b07e14c.png)  \n\n#### 117 - 📝👈🅰️ Line selector (🎲 or ♻ or ♻📑)\n\n**Description:**  \n\nSelect a line from input text. If set to 0 it will take a line at random.  \nIf line taken at random,. it will not take a line starting with the symbol `#`.  \nSo use that if you want to ignore a line.  \n\n![Line Selector](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5e2bf00d473e.png)  \n\n❗ 0.76 - New syntax available :  \nGroups, with no duplicate, example : {left|right|middle|group=LMR}+{left|right|middle|group=LMR}+{left|right|middle|group=LMR}  \nRandom based on percentage : {A(80%)|B(15%)|C(5%)}  \n\n❗ 0.77 - New syntax available :  \n2 {apple|orange|banana|static_group=FRUIT}s, one {apple|orange|banana|static_group=FRUIT} on the left, one {apple|orange|banana|static_group=FRUIT} on the right\n\n#### 118 - 🔊 TTS Configuration ⚙\n\n**Description:**  \n\nNew optional configuration node to connect to TTS node, it can request a list of speakers for a given language and replace in the main TTS node :  \n- The URL.\n- The language.\n- The speaker.\nConnect them only if you want to replace them with the one from the configuration node.  \n\n![tts config](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1094dc71d5b3.png)  \n\n#### 119 - 📥👑 Load Lora Hunyuan Video (+Download from CivitAi)\n\n**Description:**  \n\nTake a CivitAI Lora to use with Hunyuan. (NSFW list not on github of course.)\n\nThe workflow below is included : `workflows\u002FHUNYUAN_basic_lora.json`) :  \n\n![hunyuan lora](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b5d52cac675a.png)  \n\n#### 120 - 📝➜🔊 Kokoro - Text to Speech\n\n**Description:**  \n\n❗ 0.76 - Due to some compatibility issues with other custom now, you now need to install it manually if you want to use it : `pip install kokoro_onnx`  \n\nAnother Text to Speech node based on Kokoro. : https:\u002F\u002Fgithub.com\u002Fthewh1teagle\u002Fkokoro-onnx  \nLightweight, much simpler, no configuration and fully integrated into Comfyui. (No external backend to run.)  \n\n![tts kokoro](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7e3741d2a634.png)  \n\n#### 121 - 💾 Huggingface Downloader\n\n**Description:**  \nThis node allows you to download models\u002Fvae\u002Funet etc... directly from huggingface with your access token.  \n\n![huggingface dl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f248f7dd93fb.png)  \n\n#### 122 - 👑 Combine Loras, Lora stack\n\n**Description:**  \nIf you want to have multiple loras in a single node, well this is it.  \n\n![Lora stack](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a08ce1c40316.png)  \n\n#### 123 - 💾🅰️ Save Global Variables\n\n**Description:**  \nSo if you know how to use variables with my nodes, this node gives you the opportunity to create global variables.  \nThis node is very simple, it will just append (or overwrite) the file : `Bjornulf\u002FGlobalVariables.txt` (You can edit that manually if you want.)\n\n![Global Save](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e11721b7ce6e.png)  \n\n#### 124 - 📥🅰️ Load Global Variables\n\n**Description:**  \nThis node will load the global variables as text from the file `Bjornulf\u002FGlobalVariables.txt`.  \nHere is an example of usage save\u002Fload :\n\n![Global images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_94122afe672c.png)  \n\n#### 125 - 📝👈 Model-Clip-Vae selector (🎲 or ♻ or ♻📑)\n\n**Description:**  \nIf you want to use and manage multiple models\u002Fclip\u002Fvae : this is the universal node for it.  \nYou can run them in a LOOP, one at RANDOM, a LOOP SEQUENTIAL (one at a time for each workflow run) and even SELECT a specific one.  \n\n![model clip vae selector](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_42a6428c6598.png)  \n\n#### 126 - 📒 Note\n\n**Description:**  \nSometimes I want to add a NOTE but I want this note to be connected to a specific spaghetti.  \nSo you can use this to write details about a specific connection, it will move with it.  \n\nYou can do whatever you want of course, below is an example about HunYuan video generation. (You can quickly switch connection to the rest of your workflow, depending on what you want to run.)\n\n![note](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_79da375d3cdd.png)  \n\n#### 127 - 🖼📒 Image Note\n\n**Description:**  \nYou can use this node to have it show a previously generated image and some custom text. (Use image_path or IMAGE type.)  \n![Image note](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_009a4813d806.png)  \n\nYou can use the text to display the prompt used to generate the image for example.\nIt's behavior is like a \"Preview image\" node. (See node 130 if you want a behavior similar to \"Load image\")  \n\nSometimes I want to display an image to explain what something specific is doing visually. (For example a stack of loras will have a specific style.)  \nHere is a complex example on how i use that, for a list of loras stacks. (I then \"select\" a style by using node `125 - Model-Clip-Vae selector`)  \n\n**0.77** Multiline + image is now an issue on newer comfyui versions. Replaced with single line notes, couldn't find any clean js hack to solve the layout issue...  \n\n![Image note](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_30b9d047ffc3.png)  \n\n#### 128 - 🖼👁 Preview (first) image\n\n**Description:**  \nThis node can display a preview of an image...  \n- But also can take a list of images and preview only the first image. (Useful for video, it will take the first image.)  \n- But can also take as input the full path of an image.  \n- BUT it can also take a video path as input and extract the first frame of it.  \nVery useful for testing when working with videos.  \nBelow is a visual example of what I just said :  \n\n![First image preview](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_10f43ac47b05.png)  \n\n**0.77** Multiline + image is now an issue on newer comfyui versions. Replaced with single line notes, couldn't find any clean js hack to solve the layout issue...  \n\n#### 129 - 📌🅰️ Set Variable from Text\n\n**Description:**  \nThis node will just quickly transform a text in another text which can be quickly used for all my variables nodes.\nHere is an example below with \"Advanced write text\", but you can use with all of them, global variables, etc...\n\n![text_to_variable](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_99d6b2b583cd.png)  \n\n#### 130 - 📥🖼📒 Image Note (Load image)\n\n**Description:**  \nThis node is quite similar to the node 127. But this one uses LoadImage instead of a preview system.  \nSo if you want to have a \"preview\" before you launch workflow one time, you can use this one.  \nIt's behaviour is like a \"Load image\" node.  \n\n![Image note Load](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_355263b80a71.png)  \n\n#### 131 - ✒👉 Write Pick Me Chain\n\n**Description:**  \nSo this is a new \"write text\" node.  \nBut with a twist. You can connect them to each other and when clicking on the PICK ME button, it will disable all other write text node of the chain and activate only the one you click on. (It will turn green.)  \nSo with this node, you can switch from one prompt to another by the click of a button !!\nNot limited to one line, you can use list, variables, etc... but below is a simple example :  \n\n![write pick me chain](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1b57e2124738.png)  \n\n#### 132 - 📝🔪 Text split in 10\n\n**Description:**  \nSame as node 113, but split in 10 parts.  \nOne day I had 6, and got stuck with the split in 5 node, so i guess it can be useful sometimes, let's make one with 10...\n\n![text split 10](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f47c38e0e0a2.png)  \n\n#### 133 - 🖼👁 Preview 1-4 images (compare)\n\n**Description:**  \nCool node that you can use to compare several images.  \nThe middle is a cursor that you can move wherever you want by just clicking on the image.  \nBelow is an example, you can see that at this size\u002Fresolution, 25% is almost as good as the initial image.  \n\n![four previews](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3c1c6690966f.png)  \n\nHere is a zoom on the same image :  \n\n![four previews](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3fac498d4dbc.png)  \n\n#### 134 - 🔊▶ Play Audio\n\n**Description:**  \n\nThis node will just play a bell.  \nFor example, if you have a workflow that takes a while and you want to be alerted every time it's over.  \n\n![play_audio_1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_409c30a6255c.png)  \n\nYou can connect to it a custom path of an audio file :  \n\n![play_audio_2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d422b2dc7ce3.png)  \n\nOr send it an AUDIO type format :  \n\n![play_audio_3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_addda71f7d8f.png)  \n\n#### 135 - 🔛✨ Anything Switch On\u002FOff\n\n**Description:**  \n\nBasic switch that will not send anything if toggled off.  \nbelow is an example with the compatible \"combine image node\", here you can see that the top image was ignored.  \n\n![switch_anything](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f07a54c48b09.png)  \n\n#### 136 - 🔛📝 Text Switch On\u002FOff\n\n**Description:**  \n\nTired of disconnecting nodes you don't want for a moment ?  \nMaybe you are working on this input, but your workflow isn't ready for it yet ?  \nWell now you can quickly enable \u002F disable it. (If disabled you will see it in red.)  \n\n![switch_text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_efedd657e276.png)  \n\nIf connected with my combine text node, you can use a special option `ONLY_ME_combine_text` that will tell combine text to write ONLY the selected node. It will ignore all the others. (Here will appear in blue.) :  \n\n![switch_text_onlyme](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_80257a7b3cd8.png)  \n\n#### 137 - 🌎🎲 Global Seed Manager\n\n**Description:**  \n\nSeed manager.  \nIt is :\n- Generating a random seed every run.\n- Return the current seed as a STRING that you can use in other nodes with STRING format.\n- Return the value of the previously used seed.\n- Will save all the seeds used inside a file. (that you can reset with a button.)\nIf you want to select a seed from this list, use node 138.\n\n![global_seed_manager](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_515f3e20f540.png)  \n\n#### 138 - 📑👈 Select from List\n\n**Description:**  \n\nSelect quickly an element from a LIST. (a STRING with elements separated by ; by default)\nExample of LIST : a;b;c;d\n\nBelow is an example for quickly selecting the third seed used by Global Seed Manager :  \n\n![select_from_list](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_82987da2df39.png)  \n\n#### 139 - 🎲 Random Integer\n\n**Description:**  \n\nSimply return an INT in between the 2 values provided.  \n\n![random_int](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5f3b650d04b6.png)  \n\n#### 140 - 🎲 Random Float\n\n**Description:**  \n\nSimply return a FLOAT in between the 2 values provided.  \n\n![random_float](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_31a4ff9721ab.png)  \n\n#### 141 - 🌎✒👉 Global Write Pick Me\n\n**Description:**  \n\nDo you enjoy Pick Me chain nodes ?  \nThis one is using IDENTIFIERS (global_pickme_id) instead of connections.  \nJust pick up a name as global_pickme_id and if the nodes have the same global_pickme_id they will automatically connect to each other.  \n\nBelow is an example of write + load :  \n\n![global_write_pickme_load](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df663fac1ccb.png)  \n\n#### 142 - 🌎📥 Load Global Pick Me\n\n**Description:**  \n\nThe node used to recover the values from PICK ME global write nodes.  \nIt will return the value from the currently selecte global_pickme_id.  \n\nThis node also automatically return a random value from the list with the global_pickme_id.  \n\nBelow is an example of write + load :  \n\n![global_write_pickme_load](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df663fac1ccb.png)  \n\n#### 143 - 🧮 Basic Math\n\n**Description:**  \nBasic node for basic math.  \nAddition, multiplication...  \nHere is an example that I use to detect the number of \"missing\" frames in a video, compared to another video :  \n\n![basic math](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a1962ff7e640.png)  \n\n#### 144 - 📊🔍 Text Analyzer\n\n**Description:**  \n\nDisplay details about an input text.  \nYou can use it just to recover the number of characters, you can then for example use this number to avoid too long prompts and avoid OOM :  \n\n![text_ana_1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4bc03ec523d7.png)  \n\nOr extract more details about dialog and sentiment polarity of it. (For example, if you want a specific TTS voice for positive\u002Fneutral\u002Fnegative.) :  \n\n![text_ana_2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ac39bc40c55a.png)  \n\n#### 145 - 🔊▶ Audio Preview (Audio player)\n\n**Description:**  \n\nSimple preview audio node that can take as input an audio_path, mp3 or wav.  \n\n![audio_preview](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4a2c46544f24.png)  \n\n#### 146 - 🖼📹🔪 Split Image\u002FVideo Grid\n\n**Description:**  \nThis node will split a grid of images or videos into separate images or videos.  \n\nBelow is an example with a grid of 6 images, it will split them into 6 separate images (3 rows X 3 columns) :\n\n![split_grid](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f2d38e7fd8fb.png)  \n\nWhy do I need that ? Sometimes I have several characters in a single image\u002Fvideo.  \nWhen I want to apply lip sync to a character, I need to split them into separate images\u002Fvideos where4 the character is located, create the lip sync, and then reassemble them with node 147.  \nOr just to save VRAM, by processing only the part of the image that I need.  \n\n#### 147 - 🖼📹🔨 Reassemble Image\u002FVideo Grid\n\n**Description:**  \n\nReassemble an image\u002Fvideo that was grid split with node 146.  \nWill need to take the same grid size as input.  \n\nYou can apply changes to a specific element of the grid, and then reassemble them.  \n\nYou can select each part individually.  \nBut there is also a \"special\" part, the MODIFIED one.  \nThis part is selected with the MODIFIED_part and the MODIFIED_part_index (part number, if index set to 2, it will use `part_2`).  \n\nBelow is an example where I modify part_2 and reassmbling it. (Without using part_2 output but selectionning it using 2 as MODIFIED_part_index) :  \nYou can also work directly with part_2, but twith this setup you can quickly switch in between parts without changing the node layout.  \n\n![grid_assemble1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_748045155164.png)  \n\nBelow is an example where I show you that you can also influence different parts \"manually\". (Here, I just send part_1 to replace part 7,8,9.)  \n\n![grid_assemble2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_100ee304d304.png)  \n\nFor reassembling videos it might get tricky.  \nFor example if you used the node `52 - 🔊📹 Audio Video Sync`, the modified part might be shorter\u002Flonger, change FPS etc...  \nYou can try to re-synchronize them all if the duration was modified.  \nIn this situation you need to use the `reference_video_part_index` to select the reference video part. (Probably the same as the MODIFIED_part_index.)  \n\n![](screenshots\u002F.png)  \n\n#### 148 - 💾🔊 Save Audio (tmp_api.wav\u002Fmp3) ⚠️💣\n\n**Description:**  \n\nTemporary save for an audio file, mp3 or wav.  \nUseful if you want to synchronize data in between API calls from several Comfyui instances. (Used in the background by my API nodes, like node 157 `🔮⚡ Execute Workflow`, to exchange audio files. - raw\u002Fprocessed -)  \n\nYou can send audio_path (This will create file `tmp_api.mp3`) :  \n\n![savetmp_audio1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_387c924a8b11.png)  \n\nOr an AUDIO type (This will create file `tmp_api.wav`) :  \n\n![savetmp_audio2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c196aa9e9a42.png)  \n\nNote that if you are sending an AUDIO type, this node will save it as a `wav` file. (Even if your selection is an mp3 file.)  \n\n#### 149 - 💾📹 Save Video (tmp_api.mp4\u002Fmkv\u002Fwebm) ⚠️💣\n\n**Description:**  \n\nTemporary save for a video file, mp4, mkv or webm.  \nUseful if you want to synchronize data in between API calls from several Comfyui instances. (Used in the background by my API nodes, like node 157 `🔮⚡ Execute Workflow`, to exchange video files. - raw\u002Fprocessed -)  \n\n![savetmp_video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9397d845f1e7.png) \n\n#### 150 - 🎨📜 Style Selector (🎲 or ♻ or ♻📑) + Civitai urn\n\n**Description:**  \n\nA new Universal node for selecting styles.  \nAlso contains some informations for Civitai urn. (Need test and better \"database\" of good\u002Ffast models, i recommended you to send the urns you like manually.)  \n\nHere is an example of usage with CivitAI API node :  \n\n![style_gen_1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_22a4a9d59c87.png)  \n\nHere is a slightly more complex example using model urns :\n\n![style_gen_2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_0bed4faa13c5.png)  \n\nNOTE : CivitAI can be particularly slow !! So you can use the option DO_NOT_WAIT instead with an optional \"links_file\".  \nIt will create a file with the links to recover the generated images later with the node 151.   \nSo you can make as many requests as you want, and come back another time to recover the images with this txt file.  \n\nNote that you can also send the LIST directly with all the values.  \n\n![style_gen_3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7138f260a507.png)  \n\nIf you do that you can later recover the values like text and use the \"autosave\" option of node 151.  \nIt will take the style and make a folder for it. Example from the image above : `.\u002FComfyUI\u002Foutput\u002Fcivitai_autosave\u002FCinematic_photography\u002F`  \nIt is very useful if you use node 150 as a LOOP, you can recover the images later and organise them automatically in separate folders according to the selected style.  \n\n#### 151 - 📥🕑🤖 Load CivitAI Links\n\n**Description:**  \n\nThis node must be used after using the node 150 + DO_NOT_WAIT + links_file.  \nWhen saving DO_NOT_WAIT and the \"links_file\" from the node 150, it will create a txt file in \"ComfyUI\u002FBjornulf\u002Fcivitai_links\u002F\", you can load them with this node.  \n\nBelow are the images recovered from the file \"11_mars.txt\":  \n\n![load_civit](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b27c180690b5.png)  \n\nIf you used from node 150 the `LIST_from_style_selector` you can later recover the values and use the \"autosave\" option of node 151.  \nIt will take the style and make a folder for it. Example from the image above : `.\u002FComfyUI\u002Foutput\u002Fcivitai_autosave\u002FCinematic_photography\u002F`  \nIt is very useful if you use node 150 as a LOOP, you can recover the images later and organise them automatically in separate folders according to the selected style.  \n\n#### 152 - [Coming soon] 💾 Save Tensors (tmp_api.pt) ⚠️💣\n\n**Description:**  \n\nThis is BETA, it will save a tensor in a file.  \nThe goal is to optimize the VRAM usage by saving tensors in files.  \n\n#### 153 - [Coming soon] 📥 Load Tensor (tmp_api.pt)\n\n**Description:**  \n\nThis is BETA, it will load a tensor.  \nThe goal is to optimize the VRAM usage by saving tensors in files.  \n\n#### 154 - 🔮 Remote VAE Decoder\n\n**Description:**  \n\nSimple node to decode a VAE model from a remote machine.  \n\nThe VAE decode node doesn't have to be on the same machine, so if you have a remote machine and want to save the VRAM, you can use that.  \nThe remote machine need to have my custom nodes too.  \n\n![remote_vae](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ef35460c021e.png)  \n\n#### 155 - [Coming soon] 🔮 Remote VAE Decoder (Tiled)\n\n**Description:**  \n\nSame as 154 but with tiled version.  \n\n![remote_vae_tiled](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e663c9d8ff30.png)  \n\n#### 156 - [Coming soon] 📥🔮 Load from Base64\n\n**Description:**  \n\nThis is BETA, it is used to recovered some values between Comfyui instances.  \n\n#### 157 - [Coming soon] 🔮⚡ Remote Execute Workflow\n\n**Description:**  \n\nThis is the start of a complex new environment and this is in BETA.  \nThe goal of this node is to run a workflow on another Comfyui instance and recover what was generated.  \nFor now it supports image\u002Fsound\u002Fvideo.  \n\nIt can do anything that a normal workflow can do.  \nCreate an image, create a video, upscale an image, etc...  \n\nKeep in touch for more informations... Wip...  \n\nBasically use run heavy duty workflows on another machine, and recover the results.  \nBelow is an example of a lipsync workflow that I run on another Comfyui instance. (For now local network only, but will run on runpod too.)  \nI use that on my laptop (192.168.1.23), that recovers the results from my \"ai dedicated\" desktop machine (192.168.1..100) :  \n\n![execute_worflow](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_fd5f0afc20e7.png)  \n\n#### 158 - [Coming soon] 📥🔮📝 Text Manager Api (Execute Workflow)\n\n**Description:**  \n\nThis is BETA.  \nThis node need to be used to create functional workflows to run with node 157.  \nIt is communicating with node 157 from another Comfyui instance.  \n\n#### 159 - [Coming soon] 🔥📝📹 Video Text Generator 📹📝🔥\n\n**Description:**  \n\nThis is BETA.  \nThis is the start of a new node that will generate a video prompt.  \nIt's goal is to be like the \"Text Generator\" node, but for videos.  \nThe \"old\" Text Generator main node 81 is now renamed for image only : 🔥📝🖼 Image Text Generator 🖼📝🔥.  \n\n![video_text_generator](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c227670f034a.png)  \n\n#### 160 - 🦙👁 Ollama Vision Prompt Selector\n\n**Description:**  \nNew layout prompt selector for Ollama Vision.  \nOllama vision is now divided in 2 separate nodes.  \n\n![ollama vision prompt](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_97bad0b277ee.png) \n\n#### 161 - [Coming soon] 🔧🧑 Fix Face\n\n**Description:**  \n\nThis is BETA.  \nFirst node of a new collection of \"Fix Images\" nodes.  \nQuickly fix, control and edit faces. (and more)  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_91f1462ebc9d.png)  \n\nHere is a zoom of that :  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_fe578b6fc9ba.png)  \n\nYou can also give specific text and custom denoise for each faces :  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ad839286bafc.png)  \n\nYou can also select a specific face, if set at 0 it will do all the faces, but below I set it to 1 :  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e9acce3f4643.png)  \n\nThis node can also fix the whole person, but i will likely make another separate node for that later :  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1d6c87aa0147.png)  \n\nYou can preview the nodes effects very well with my Preview Image node, You can clearly see here the white box that is the detected \"person\" :  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_15c5f253e3aa.png)  \n\nIn the future I will make a system to \"inject\" a specific reusable character, probably connected to loras or suchs.  \n\n#### 162 - [Coming soon] 🧑 Face Settings [Fix Face] ⚙\n\n**Description:**  \nConnect to Fix Face node to modify a specific face.  \n\n#### 163 - ☁🎨 API Image Generator (openai, gpt-image-1)\n\n**Description:**  \nCreate an image with GPT-Image-1 API.  \n\n![gpt 4 image](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1ee6e807226b.jpg)  ","# 🔗 ComfyUI：Bjornulf_自定义节点 v1.1.8 🔗\n\n适用于ComfyUI的170个自定义节点列表：用于显示、操作、创建和编辑文本、图像、视频、LoRA模型，生成角色等。您可以管理循环操作、生成随机内容、触发逻辑条件、暂停并手动控制工作流，甚至与外部AI工具（如Ollama或文本转语音）协同工作。\n\n⚠️ 注意：开发非常活跃，仍在进行中。🏗\n\n最新更新视频：\n[![观看视频](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6cad461b6990.jpg)](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=YiGgyh7nQRg)\n\n# 观看视频（快速概览28分钟）+ 视频播放列表中的更新：\n[![观看视频](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3b8e14b0c659.jpg)](https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PL_hRi_PPLLWvUNfG_np_d3K0nBCabM3iQ)\n\n# 咖啡评分：☕☕☕☕☕ 5\u002F5\n\n开发极其活跃，不断推出新节点、新功能、新创意和新可能性……如果您遇到任何问题，请随时告知我，这些问题必须为所有人解决！\n\n请支持我、这个项目以及我其他的AI相关项目：❤️❤️❤️ \u003Chttps:\u002F\u002Fko-fi.com\u002Fbjornulf> ❤️❤️❤️\n\n# ☘ 该项目是我AI三部曲的一部分。☘\n\n1 - 📝 文本\u002F聊天AI生成：[Bjornulf Lobe Chat Fork](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_lobe-chat)  \n2 - 🔊 语音AI生成：[Bjornulf Text To Speech](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_XTTS)  \n\u003Cu>**3 - 🎨 图像AI生成：** [Bjornulf ComfyUI 自定义节点](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes)（您当前所在位置）\u003C\u002Fu>\n\n# 📋 节点菜单按类别划分\n\n## 👁 显示与展示 👁\n`1.` [👁 显示（文本、整数、浮点数）](#1----show-text-int-float)  \n`49.` [📹👁 视频预览](#49----video-preview)  \n`68.` [🔢 添加行号](#68----add-line-numbers)  \n`71.` [👁 显示（整数）](#71----show-int)  \n`72.` [👁 显示（浮点数）](#72----show-float)  \n`73.` [👁 显示（字符串\u002F文本）](#73----show-stringtext)  \n`74.` [👁 显示（JSON）](#74----show-json)  \n`126.` [📒 备注](#126----note)  \n`127.` [🖼📒 图像备注（加载图像）](#130----image-note-load-image)  \n`128.` [🖼👁 预览（第一张）图像](#128----preview-first-image)  \n`130.` [📥🖼📒 图像备注（加载图像）](#130----image-note-load-image)  \n`133.` [🖼👁 预览1-4张图像（对比）](#128----preview-first-image)  \n\n## ✒ 文本 ✒\n`2.` [✒ 写入文本](#2----write-text)  \n`3.` [✒🗔🅰️ 高级写入文本（+ 🎲 随机选项）](#3---🅰%EF%B8%8F-advanced-write-text---random-option)  \n`4.` [🔗 组合文本](#4----combine-texts)  \n`15.` [💾 保存文本](#15----save-text)  \n`26.` [🎲 从输入中随机选择一行](#26----random-line-from-input)  \n`28.` [🔢🎲 带有随机种子的文本](#28----text-with-random-seed)  \n`32.` [🧑📝 角色描述生成器](#32----character-description-generator)  \n`48.` [🔀🎲 文本乱序器（🧑 角色）](#48----text-scrambler--character)  \n`67.` [📝➜✨ 文本转任意内容](#67----text-to-anything)  \n`68.` [✨➜📝 任意内容转文本](#68----anything-to-text)  \n`75.` [📝➜📝 替换文本](#75----replace-text)  \n`111.` [✨➜🔢 任意内容转整数](#111----anything-to-int)  \n`112.` [✨➜🔢 任意内容转浮点数](#112----anything-to-float)  \n`113.` [📝🔪 将文本分割为5份](#113----text-split-in-5)  \n`132.` [📝🔪 将文本分割为10份](#132----text-split-in-10)  \n`115.` [📥 从Bjornulf文件夹加载文本](#115----load-text-from-bjornulf-folder)  \n`116.` [📥 从路径加载文本](#116----load-text-from-path)  \n`117.` [📝👈🅰️ 行选择器（🎲 或 ♻ 或 ♻📑）](#117---🅰%EF%B8%8F-line-selector--or--or-)  \n`131.` [✒👉 写入“Pick Me”链](#131----write-pick-me-chain)  \n`136.` [🔛📝 文本开关（开\u002F关）](#136----text-switch-onoff)  \n`138.` [📑👈 从列表中选择](#138----select-from-list)  \n`141.` [🌎✒👉 全局“Pick Me”写入](#141----global-write-pick-me)  \n`142.` [🌎📥 加载全局“Pick Me”](#142----load-global-pick-me)  \n`144` [📊🔍 文本分析器](#)  \n\n## 🔥 文本生成器 🔥\n`81.` [🔥📝🖼 图像文本生成器 🖼📝🔥](#81----text-generator-)  \n`82.` [👩‍🦰📝 文本生成器（女性角色）](#82----text-generator-character-female)  \n`83.` [👨‍🦰📝 文本生成器（男性角色）](#83----text-generator-character-male)  \n`84.` [👾📝 文本生成器（生物角色）](#84----text-generator-character-creature)  \n`85.` [💃🕺📝 文本生成器（角色姿势）](#85----text-generator-character-pose)  \n`86.` [🔧👨‍🔧📝 文本生成器（角色使用的物品）](#86----text-generator-object-for-character)  \n`87.` [🌄📝 文本生成器（场景）](#87----text-generator-scene)  \n`88.` [🎨📝 文本生成器（风格）](#88----text-generator-style)  \n`89.` [👗 文本生成器（女性服装）](#89----text-generator-outfit-female)  \n`90.` [👚 文本生成器（男性服装）](#90----text-generator-outfit-male)  \n`91.` [♻🔥📝 列表循环器（文本生成器）](#91----list-looper-text-generator)  \n`92.` [♻🌄📝 列表循环器（文本生成器场景）](#92----list-looper-text-generator-scenes)  \n`93.` [♻🎨📝 列表循环器（文本生成器风格）](#93----list-looper-text-generator-styles)  \n`94.` [♻💃🕺📝 列表循环器（文本生成器姿势）](#94----list-looper-text-generator-poses)  \n`95.` [♻👨‍🦰👩‍🦰👾 列表循环器（文本生成器角色）](#95----list-looper-text-generator-characters)  \n`96.` [♻👚 列表循环器（文本生成器男性服装）](#96----list-looper-text-generator-outfits-male)  \n`97.` [♻👗 列表循环器（文本生成器女性服装）](#97----list-looper-text-generator-outfits-female)  \n\n## ♻ 循环 ♻\n`6.` [♻ 循环](#6----loop)  \n`7.` [♻ 循环文本](#7----loop-texts)  \n`8.` [♻ 循环整数](#8----loop-integer)  \n`9.` [♻ 循环浮点数](#9----loop-float)  \n`10.` [♻ 循环所有采样器](#10----loop-all-samplers)  \n`11.` [♻ 循环所有调度器](#11----loop-all-schedulers)  \n`12.` [♻ 循环组合](#12----loop-combos)  \n`27.` [♻ 循环（输入中的所有行）](#27----loop-all-lines-from-input)  \n`33.` [♻ 循环（输入中的所有行，按行组合）](#33----loop-all-lines-from-input--combine-by-lines)  \n`38.` [♻🖼 循环（图像）](#38----loop-images)  \n`39.` [♻ 循环（✒🗔🅰️ 高级写入文本）](#39----loop-🅰%EF%B8%8F-advanced-write-text)  \n`42.` [♻ 循环（模型+CLIP+VAE）——即检查点\u002F模型](#42----loop-modelclipvae---aka-checkpoint--model)  \n`53.` [♻ 循环加载检查点（模型选择器）](#53----loop-load-checkpoint-model-selector)  \n`54.` [♻👑 循环LoRA选择器](#54----loop-lora-selector)  \n`56.` [♻📑 循环顺序（整数）](#56----loop-sequential-integer)  \n`57.` [♻📑 循环顺序（输入行）](#57----loop-sequential-input-lines)  \n`90.` [♻🔥📝 列表循环器（文本生成器）](#8)  \n`91.` [♻🌄📝 列表循环器（文本生成器场景）](#8)  \n`92.` [♻🎨📝 列表循环器（文本生成器风格）](#8)  \n`93.` [♻💃🕺📝 列表循环器（文本生成器姿势）](#8)  \n`94.` [♻👨‍🦰👩‍🦰📝 列表循环器（文本生成器角色）](#8)  \n`95.` [♻👚 列表循环器（文本生成器男性服装）](#8)  \n`96.` [♻👗 列表循环器（文本生成器女性服装）](#8)\n\n## 🎲 随机化 🎲\n`3.` [✒🗔🅰️ 高级写文本（+ 🎲 随机选项）](#3---🅰%EF%B8%8F-advanced-write-text---random-option)  \n`5.` [🎲 随机（文本）](#5----random-texts)  \n`26.` [🎲 从输入中随机选择一行](#26----random-line-from-input)  \n`28.` [🔢🎲 带随机种子的文本](#28----text-with-random-seed)  \n`37.` [🎲🖼 随机图片](#37----random-image)  \n`40.` [🎲 随机（模型+CLIP+VAE）——又称检查点\u002F模型](#40----random-modelclipvae---aka-checkpoint--model)  \n`41.` [🎲 随机加载检查点（模型选择器）](#41----random-load-checkpoint-model-selector)  \n`48.` [🔀🎲 文本乱序器（🧑 字符）](#48----text-scrambler--character)  \n`55.` [🎲👑 随机LoRA选择器](#55----random-lora-selector)  \n`117.` [📝👈🅰️ 行选择器（🎲 或 ♻ 或 ♻📑）](#117---🅰%EF%B8%8F-line-selector--or--or-)  \n`139.` [🎲 随机整数](#139----random-integer)  \n`140.` [🎲 随机浮点数](#140----random-float)  \n\n## 🖼💾 保存图片\u002F文本 💾🖼\n`16.` [💾🖼💬 为Bjornulf LobeChat保存图片](#16----save-image-for-bjornulf-lobechat-for-my-custom-lobe-chat)  \n`17.` [💾🖼 将图片保存为`tmp_api.png`临时API](#17----save-image-as-tmp_apipng-temporary-api-%EF%B8%8F)  \n`18.` [💾🖼📁 将图片保存到指定文件夹](#18----save-image-to-a-chosen-folder-name)  \n`14.` [💾🖼 保存精确名称](#1314------resize-and-save-exact-name-%EF%B8%8F)  \n`123.` [💾🅰️ 保存全局变量](#123---🅰%EF%B8%8F-save-global-variables)  \n\n## 🖼📥 加载图片\u002F文本 📥🖼\n`29.` [📥🖼 带透明度的图片▢](#29----load-image-with-transparency-)  \n`43.` [📥🖼📂 从输出文件夹加载图片](#43----load-images-from-output-folder)  \n`124.` [📥🅰️ 加载全局变量](#124---🅰%EF%B8%8F-load-global-variables)  \n\n## 🖼 图片 - 其他 🖼\n`13.` [📏 调整图片大小](#1314------resize-and-save-exact-name-%EF%B8%8F)  \n`22.` [🔲 去除图片透明度（alpha通道）](#22----remove-image-transparency-alpha)  \n`23.` [🔲 将图片转为灰度（黑白）](#23----image-to-grayscale-black--white)  \n`24.` [🖼+🖼 叠加两张图片（背景+叠加层）](#24----stack-two-images-background--overlay)  \n`25.` [🟩➜▢ 绿幕转透明](#25----green-screen-to-transparency)  \n`29.` [⬇️🖼 带透明度的图片▢](#29----load-image-with-transparency-)  \n`30.` [🖼✂ 用遮罩裁剪图片](#30----cut-image-with-a-mask)  \n`37.` [🎲🖼 随机图片](#37----random-image)  \n`38.` [♻🖼 循环（图片）](#38----loop-images)  \n`43.` [⬇️📂🖼 从输出文件夹加载图片](#43----load-images-from-output-folder)  \n`44.` [🖼👈 选择一张图片，挑选](#44----select-an-image-pick)  \n`46.` [🖼🔍 图片详情](#46----image-details)  \n`47.` [🖼 组合图片](#47----combine-images)  \n`60.` [🖼🖼 合并图片\u002F视频📹📹（水平方向）](#60----merge-imagesvideos--horizontally)  \n`61.` [🖼🖼 合并图片\u002F视频📹📹（垂直方向）](#61----merge-imagesvideos--vertically)  \n`62.` [🦙👁 Ollama Vision](#62----ollama-vision)  \n`70.` [📏 按百分比调整图片大小](#70----resize-image-percentage)  \n`80.` [🩷 空latent选择器](#80----empty-latent-selector)  \n`146` [🖼📹🔪 分割图片\u002F视频网格](#146----split-imagevideo-grid)  \n`147` [🖼📹🔨 重组图片\u002F视频网格](#147----reassemble-imagevideo-grid)  \n`160.` [🦙👁 Ollama Vision提示词选择器](#160----ollama-vision-prompt-selector)  \n\n## 🅰️ 变量 🅰️\n`3.` [✒🗔🅰️ 高级写文本（+ 🎲 随机选项）](#3---🅰%EF%B8%8F-advanced-write-text---random-option)  \n`117.` [📝👈🅰️ 行选择器（🎲 或 ♻ 或 ♻📑）](#117---🅰%EF%B8%8F-line-selector--or--or-)  \n`123.` [💾🅰️ 保存全局变量](#123---🅰%EF%B8%8F-save-global-variables)  \n`124.` [📥🅰️ 加载全局变量](#124---🅰%EF%B8%8F-load-global-variables)  \n`129.` [📌🅰️ 从文本设置变量](#129---🅰%EF%B8%8F-set-variable-from-text)  \n\n## 🚀 加载检查点 🚀\n`40.` [🎲 随机（模型+CLIP+VAE）——又称检查点\u002F模型](#40----random-modelclipvae---aka-checkpoint--model)  \n`41.` [🎲 随机加载检查点（模型选择器）](#41----random-load-checkpoint-model-selector)  \n`42.` [♻ 循环（模型+CLIP+VAE）——又称检查点\u002F模型](#42----loop-modelclipvae---aka-checkpoint--model)  \n`53.` [♻ 循环加载检查点（模型选择器）](#53----loop-load-checkpoint-model-selector)  \n`125.` [📝👈 模型-CLIP-VAE选择器（🎲 或 ♻ 或 ♻📑）](#125----model-clip-vae-selector--or--or-)  \n\n## 🚀 加载LoRA 🚀\n`54.` [♻ LoRA选择器循环](#54----loop-lora-selector)  \n`55.` [🎲 随机LoRA@选择器](#55----random-lora-selector)  \n`114.` [📥👑 加载带有路径的LoRA](#114----load-lora-with-path)  \n`122.` [👑 组合LoRA，LoRA堆栈](#122----combine-loras-lora-stack)  \n\n## ☁ 图片生成：API \u002F 云 \u002F 远程 ☁\n`106.` [☁🎨 API图片生成器（FalAI）☁](#106----api-image-generator-falai-)  \n`107.` [☁🎨 API图片生成器（CivitAI）☁](#107----api-image-generator-civitai-)  \n`108.` [☁👑 添加LoRA（仅API - CivitAI）👑☁](#108----add-lora-api-only---civitai-)  \n`109.` [☁🎨 API图片生成器（Black Forest Labs - Flux）☁](#109----api-image-generator-black-forest-labs---flux-)  \n`110.` [☁🎨 API图片生成器（Stability - Stable Diffusion）☁](#110----api-image-generator-stability---stable-diffusion-)  \n`151` [📥🕑🤖 加载CivitAI链接](#151----load-civitai-links)  \n`163` [☁🎨 API图片生成器（openai, gpt-image-1）](#163----api-image-generator-openai-gpt-image-1)  \n\n## 📥 从CivitAI \u002F Hugging Face获取 📥\n`98.` [📥 加载SD1.5检查点（+从CivitAi下载）](#98----load-checkpoint-sd15-download-from-civitai)  \n`99.` [📥 加载SDXL检查点（+从CivitAi下载）](#99----load-checkpoint-sdxl-download-from-civitai)  \n`100.` [📥 加载Pony检查点（+从CivitAi下载）](#100----load-checkpoint-pony-download-from-civitai)  \n`101.` [📥 加载FLUX Dev检查点（+从CivitAi下载）](#101----load-checkpoint-flux-dev-download-from-civitai)  \n`102.` [📥 加载FLUX Schnell检查点（+从CivitAi下载）](#102----load-checkpoint-flux-schnell-download-from-civitai)  \n`103.` [📥👑 加载SD1.5 LoRA（+从CivitAi下载）](#103----load-lora-sd15-download-from-civitai)  \n`104.` [📥👑 加载SDXL LoRA（+从CivitAi下载）](#104----load-lora-sdxl-download-from-civitai)  \n`105.` [📥👑 加载Pony LoRA（+从CivitAi下载）](#105----load-lora-pony-download-from-civitai)  \n`119.` [📥👑📹 加载Hunyuan Video LoRA（+从CivitAi下载）](#119----load-lora-hunyuan-video-download-from-civitai)  \n`121.` [💾 Hugging Face下载器](#121----huggingface-downloader)\n\n## 📹 视频 📹\n`20.` [📹 视频乒乓球](#20----video-ping-pong)  \n`21.` [🖼➜📹 图片转视频（FFmpeg 保存视频）](#21----images-to-video-ffmpeg-save-video)  \n`49.` [📹👁 视频预览](#49----video-preview)  \n`50.` [🖼➜📹 图片转视频路径（临时视频）](#50----images-to-video-path-tmp-video)  \n`51.` [📹➜🖼 视频路径转图片](#51----video-path-to-images)  \n`52.` [🔊📹 音频视频同步](#52----audio-video-sync)  \n`58.` [📹🔗 视频拼接](#58----concat-videos)  \n`59.` [📹🔊 合并视频+音频](#59----combine-video--audio)  \n`60.` [🖼🖼 合并图片\u002F视频 📹📹（水平方向）](#60----merge-imagesvideos--horizontally)  \n`61.` [🖼🖼 合并图片\u002F视频 📹📹（垂直方向）](#61----merge-imagesvideos--vertically)  \n`76.` [⚙📹 FFmpeg 配置 📹⚙](#76----ffmpeg-configuration-)  \n`77.` [📹🔍 视频详情 ⚙](#77----video-details-)  \n`78.` [📹➜📹 转换视频](#78----convert-video)  \n`79.` [📹🔗 从列表拼接视频](#79----concat-videos-from-list)  \n`119.` [📥👑📹 加载 Lora Hunyuan 视频（+从 CivitAi 下载）](#119----load-lora-hunyuan-video-download-from-civitai)  \n`146` [🖼📹🔪 分割图片\u002F视频网格](#146----split-imagevideo-grid)  \n`147` [🖼📹🔨 重组图片\u002F视频网格](#147----reassemble-imagevideo-grid)  \n`149` [💾📹 保存视频（tmp_api.mp4\u002Fmkv\u002Fwebm）⚠️💣](#149----save-video-tmp_apimp4mkvwebm-%EF%B8%8F)  \n\n## 🤖 AI 🤖\n`19.` [🦙💬 Ollama 对话](#19----ollama-talk)  \n`31.` [📝➜🔊 TTS - 文本转语音](#31----tts---text-to-speech-100-local-any-voice-you-want-any-language)  \n`62.` [🦙👁 Ollama 视觉](#62----ollama-vision)  \n`63.` [🦙 Ollama 配置 ⚙](#63----ollama-configuration-)  \n`64.` [🦙 Ollama 任务选择器 💼](#64----ollama-job-selector-)  \n`65.` [🦙 Ollama 人物角色选择器 🧑](#65----ollama-persona-selector-)  \n`66.` [🔊➜📝 STT - 语音转文本](#66----stt---speech-to-text)  \n`118.` [🔊 TTS 配置 ⚙](#118----tts-configuration-)  \n`160.` [🦙👁 Ollama 视觉提示词选择器](#160----ollama-vision-prompt-selector)  \n\n## 🔊 音频 🔊\n`31.` [📝➜🔊 TTS - 文本转语音](#31----tts---text-to-speech-100-local-any-voice-you-want-any-language)  \n`52.` [🔊📹 音频视频同步](#52----audio-video-sync)  \n`59.` [📹🔊 合并视频+音频](#59----combine-video--audio)  \n`66.` [🔊➜📝 STT - 语音转文本](#66----stt---speech-to-text)  \n`118.` [🔊 TTS 配置 ⚙](#118----tts-configuration-)  \n`120.` [📝➜🔊 Kokoro - 文本转语音](#120----kokoro---text-to-speech)  \n`134.` [134 - 🔊▶ 播放音频](#134----play-audio)  \n`145` [🔊▶ 音频预览（音频播放器）](#145----audio-preview-audio-player)  \n`148` [💾🔊 保存音频（tmp_api.wav\u002Fmp3）⚠️💣](#148----save-audio-tmp_apiwavmp3-%EF%B8%8F)  \n\n## 💻 通用 \u002F 系统 💻\n`34.` [🧹 释放 VRAM 的技巧](#34----free-vram-hack)  \n`137.` [🌎🎲 全局种子管理器](#137----global-seed-manager)  \n`143` [🧮 基础数学](#)  \n\n## 🧍 手动用户控制 🧍\n`35.` [⏸️ 暂停中。继续或停止，请选择👇](#35---%EF%B8%8F-paused-resume-or-stop-)  \n`36.` [⏸️ 暂停中。选择输入，请选择👇](#36---%EF%B8%8F-paused-select-input-pick-one)  \n`117.` [📝👈🅰️ 行选择器（🎲 或 ♻ 或 ♻📑）](#117---🅰%EF%B8%8F-line-selector--or--or-)  \n`135.` [🔛✨ 任意开关开启\u002F关闭](#135----anything-switch-onoff)  \n`136.` [🔛📝 文本开关开启\u002F关闭](#136----text-switch-onoff)  \n\n## 🧠 逻辑 \u002F 条件运算 🧠\n`45.` [🔀 如果-否则（输入\u002F比较值）](#45----if-else-input--compare_with)  \n\n## 【即将推出】—— 尚未归入上述分类...\n`150` [[即将推出] 🎨📜 风格选择器（🎲 或 ♻ 或 ♻📑）+ Civitai urn](#150----style-selector--or--or---civitai-urn)  \n`152` [[即将推出] 💾 保存张量（tmp_api.pt）⚠️💣](#)  \n`153` [[即将推出] 📥 加载张量（tmp_api.pt)](#)  \n`154` [[即将推出] 🔮 远程 VAE 解码器](#)  \n`155` [[即将推出] 🔮 远程 VAE 解码器（分块）](#)  \n`156` [[即将推出] 📥🔮 从 Base64 加载](#)  \n`157` [[即将推出] 🔮⚡ 执行工作流](#)  \n`158` [[即将推出] 📥🔮📝 文本管理 API（执行工作流）]](#)  \n`159` [[即将推出] 🔥📝📹 视频文本生成器 📹📝🔥](#)  \n`161` [[即将推出] 🔧🧑 修复人脸](#)  \n`162` [[即将推出] 🧑 人脸设置【修复人脸】⚙](#)\n\n# ☁ 云端使用：\n\nComfyUI 非常适合本地使用，但有时我需要比自己设备更强的算力……  \n我有一台配备 4070 Super 显卡（12GB 显存）的电脑，运行 flux fp8 简单工作流大约需要 40 秒。而在云端使用 4090 显卡时，我可以以约 12 秒的时间运行 flux fp16。（当然也有一些工作流是我本地根本无法运行的。）\n\n我的 Runpod 推荐链接：[https:\u002F\u002Frunpod.io?ref=tkowk7g5]（如果您通过该链接注册，我将获得佣金，但这对您没有任何额外费用。）  \n如果您想在云端使用我的节点和 ComfyUI，并且可以安装更多内容，我在 Runpod 上管理了一个优化过的开箱即用模板：[https:\u002F\u002Frunpod.io\u002Fconsole\u002Fdeploy?template=r32dtr35u1&ref=tkowk7g5]  \n模板名称：`bjornulf-comfyui-allin-workspace`，大约 3 分钟即可投入使用。（具体时间取决于您的 Pod、设置以及下载额外模型等未包含的内容。）  \n在使用之前，您需要创建并选择一个网络存储卷，大小由您决定。我选择了 50GB 存储空间，因为我只在云端使用 4090 显卡进行 Flux 或 LoRA 训练。（约 0.7 美元\u002F小时）  \n⚠️ 当 Pod 准备好后，您需要在浏览器中打开终端（点击 Pod 的“连接”按钮后），然后使用以下命令手动启动 ComfyUI：`cd \u002Fworkspace\u002FComfyUI && python main.py --listen 0.0.0.0 --port 3000` 或者使用别名 `start_comfy`（通过终端控制会更好，方便查看日志等）。  \n之后，您可以直接点击“连接到端口 3000”按钮。  \n文件管理方面，您可以使用内置的 JupyterLab，端口为 8888。  \n如果您遇到任何问题，请随时告诉我。  \n该模板会将所有内容管理在 Runpod 的网络存储中（`\u002Fworkspace\u002FComfyUI`），因此您可以随时停止或启动云端 GPU 而不会丢失任何数据，也可以更换 GPU 等。  \n区域：我推荐 `EU-RO-1`，但您可以自行选择。  \n请至少充值 10 美元到您的 Runpod 账户才能开始使用。  \n⚠️ 注意：计费按分钟计算，因此不建议用于测试或学习 ComfyUI，请务必在本地完成！  \n只有在您已经准备好工作流时再启动云端 GPU。  \n建议：先使用廉价的 GPU 进行测试、下载模型或配置环境。  \n下载检查点或其他文件时，必须使用终端。  \n从 Hugging Face 下载时（在此处获取令牌：\u003Chttps:\u002F\u002Fhuggingface.co\u002Fsettings\u002Ftokens>）。  \n以下是运行 Flux 开发版所需的所有命令示例：  \n```\nhuggingface-cli login --token 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\nhuggingface-cli download black-forest-labs\u002FFLUX.1-dev flux1-dev.safetensors --local-dir \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Funet\nhuggingface-cli download comfyanonymous\u002Fflux_text_encoders clip_l.safetensors --local-dir \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Fclip\nhuggingface-cli download comfyanonymous\u002Fflux_text_encoders t5xxl_fp16.safetensors --local-dir \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Fclip\nhuggingface-cli download black-forest-labs\u002FFLUX.1-dev ae.safetensors --local-dir \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Fvae\n```\n要使用 Flux，您只需在我的 GitHub 仓库中拖放 .json 文件到浏览器中的 ComfyUI 界面即可：`workflows\u002FFLUX_dev_troll.json`，直接链接：[https:\u002F\u002Fgithub.com\u002FjustUmen\u002FComfyUI-BjornulfNodes\u002Fblob\u002Fmain\u002Fworkflows\u002FFLUX_dev_troll.json]。\n\n从 Civitai 下载时（在此处获取令牌：\u003Chttps:\u002F\u002Fcivitai.com\u002Fuser\u002Faccount>），只需复制粘贴您想要下载的检查点链接，并使用类似以下的命令，将您的令牌插入 URL 中：  \n```\nCIVITAI=\"8b275fada679ba5812b3da2bf35016f6\"\nwget --content-disposition -P \u002Fworkspace\u002FComfyUI\u002Fmodels\u002Fcheckpoints \"https:\u002F\u002Fcivitai.com\u002Fapi\u002Fdownload\u002Fmodels\u002F272376?type=Model&format=SafeTensor&size=pruned&fp=fp16&token=$CIVITAI\"\n```\n\n如果您想下载整个输出文件夹，可以直接将其压缩：  \n```\ncd \u002Fworkspace\u002FComfyUI\u002Foutput && tar -czvf \u002Fworkspace\u002Foutput.tar.gz .\n```\n\n然后您就可以通过 JupyterLab 文件管理器将其下载了。  \n\n如果您在使用这个 Runpod 模板时遇到任何问题，请随时告知我，我将竭诚为您提供帮助。😊  \n\n# 🏗 依赖项（无需在我提供的 Runpod 模板中操作）\n\n请查看 `requirements.txt` 以获取最新的依赖项列表。  \n\n## 🪟🐍 Windows：在嵌入式 Python（便携版）上安装依赖项\n\n首先，您需要找到这个嵌入式的 `python.exe`，然后在文件管理器中右键单击或按住 Shift 键并右键单击文件夹，即可在此处打开终端。  \n\n这是我存放的位置及所需命令：  \n`H:\\ComfyUI_windows_portable\\python_embeded> .\\python.exe -m pip install ollama pydub opencv-python ffmpeg-python civitai-py fal_client sounddevice langdetect spacy textblob dill`  \n\n如果需要安装其他内容，您可以重复使用相同的代码来安装所需的依赖项：  \n`.\\python.exe -m pip install whateveryouwant`  \n\n之后即可运行 ComfyUI。  \n\n## 🐧🐍 Linux：安装依赖项（无需虚拟环境，不推荐）\n\n进入 `custom_node` 文件夹，执行：`pip install -r requirements.txt`\n\n或者\n\n- `pip install ollama`（您也可以选择安装 Ollama：https:\u002F\u002Follama.com\u002Fdownload） - 如果您不想使用我的 Ollama 节点，则无需真正安装它。（但您仍需运行 `pip install ollama`）\n- `pip install pydub`（用于 TTS 节点）\n- `pip install opencv-python`\n- 等等……\n\n## 🐧🐍 Linux：使用 Python 虚拟环境（venv）安装依赖项\n\n如果您希望仅为 ComfyUI 使用 Python 虚拟环境，这是推荐的做法，您可以按照以下步骤操作（同时预先安装 pip）：  \n\n```\nsudo apt-get install python3-venv python3-pip\npython3 -m venv \u002Fthe\u002Fpath\u002Fyou\u002Fwant\u002Fvenv\u002Fbjornulf_comfyui\n```\n\n当您在这个新文件夹中创建好环境后，可以通过以下命令激活并安装依赖项：  \n\n```\nsource \u002Fthe\u002Fpath\u002Fyou\u002Fwant\u002Fvenv\u002Fbjornulf_comfyui\u002Fbin\u002Factivate\ncd custom_nodes\u002FBjornulf_custom_nodes\npip install -r requirements.txt\n```\n\n随后，您可以使用此环境启动 ComfyUI（请注意，每次启动 ComfyUI 时都需要重新激活环境）：  \n\n```\ncd \u002Fwhere\u002Fyou\u002Finstalled\u002FComfyUI && python main.py\n```\n\n# 📝 更改记录\n\n- **v0.2**: 改进 Ollama 节点，加入系统提示和模型选择功能。\n- **v0.3**: 新增节点：将图像保存到指定文件夹。\n- **v0.3**: 为所有与图像相关的节点添加 ComfyUI 元数据\u002F工作流支持。\n- **v0.4**: 支持 WebM 格式的透明度选项及编码器设置，并新增音频流输入功能。\n- **v0.5**: 新增节点：移除图像透明度（Alpha 通道）——用纯色填充 Alpha 通道。\n- **v0.5**: 新增节点：将图像转换为灰度图（黑白）——将彩色图像转换为灰度图像。\n- **v0.6**: 新增节点：合并图像（背景+叠加）——将两张图像合并为一张。\n- **v0.7**: 将“保存 API”节点替换为“保存 Bjornulf Lobechat”节点。（用于我的自定义 Lobe-Chat）\n- **v0.8**: 合并图像：新增选项，可将图像放置在顶部、底部或居中。\n- **v0.8**: 合并文本：新增斜杠分隔符选项 \u002F。\n- **v0.8**: 新增基础节点，用于将绿幕背景转换为透明效果。\n- **v0.9**: 新增节点：从输入中随机返回一行。\n- **v0.10**: 新增节点：循环（输入中的所有行）——遍历输入文本中的每一行。\n- **v0.11**: 新增节点：带随机种子的文本——生成随机种子及对应的文本。\n- **v0.12**: 合并图像：新增垂直和水平移动选项。（范围从 -50% 到 150%）\n- **v0.13**: 新增节点：加载带透明度（Alpha 通道）的图像——加载带有透明度的图像。\n- **v0.14**: 新增节点：根据遮罩裁剪图像。\n- **v0.15**: 新增两个节点：TTS——文本转语音，以及角色描述生成器。\n- **v0.16**: 角色描述生成器的重大改动。\n- **v0.17**: 新型循环节点，按行合并。\n- **v0.18**: 新型循环节点，免费 VRAM 技巧。\n- **v0.19**: 文件夹保存节点的更改：忽略缺失的图像文件名，自动使用已发现的最大编号加 1。\n- **v0.20**: Lobechat 图像保存节点的更改：包含免费 VRAM 技巧代码，并忽略缺失的图像文件名。\n- **v0.21**: 新增写入文本节点，同时在 ComfyUI 控制台显示文本内容（便于调试）。\n- **v0.22**: 允许写入文本节点使用随机选择功能，例如 {hood|helmet} 将随机选择 hood 或 helmet。\n- **v0.23**: 新增节点：暂停、恢复或停止工作流。\n- **v0.24**: 新增节点：暂停、选择输入、随机选取一个。\n- **v0.25**: 新增两个节点：循环图像和随机图像。\n- **v0.26**: 新增节点：循环写入文本。同时增加大多数节点允许的输入数量。（并更新部分破坏性变更）\n- **v0.27**: 新增两个节点：循环（模型+Clip+Vae）和随机（模型+Clip+Vae）——即检查点\u002F模型。\n- **v0.28**: 修复随机文本问题，并为多个节点添加大量截图示例。\n- **v0.29**: 修复循环浮点节点的浮点数问题。\n- **v0.30**: 更新基础循环节点，增加可选输入。\n- **v0.31**: ❗抱歉，写入\u002F显示文本节点发生重大变更，系统更简洁：一个为简单写入文本，另一个为高级版，带有控制台和特殊语法。此外，显示节点现在可以处理整数、浮点数和文本。\n- **v0.32**: 快速重命名以避免破坏 loop_text 节点。\n- **v0.33**: 在暂停节点上控制随机性，修复 Windows 系统下 pydub 音频权限问题。\n- **v0.34**: 新增两个节点：从输出文件夹加载图像，以及选择图像、随机选取。\n- **v0.35**: TTS 节点 31 号得到大幅改进，它还会将音频文件保存到 “ComfyUI\u002FBjornulf_TTS\u002F” 文件夹中。——尚未在 Windows 上测试过——\n- **v0.36**: 修复随机模型问题。\n- **v0.37**: 新增节点：随机加载检查点（模型选择器）。作为随机检查点节点的替代方案。（不预先将所有检查点加载到内存中，切换检查点的速度较慢，但提供更多输出供你决定存储结果的位置。）\n- **v0.38**: 新增节点：If-Else 逻辑。（input == compare_with），并提供不同潜在空间大小的示例。+修复一些反序列化问题。\n- **v0.39**: 为高级写入文本节点添加变量管理功能。\n- **v0.40**: 为循环高级写入文本节点添加变量管理功能。并在 README 中为所有节点添加菜单。\n- **v0.41**: 新增两个节点：图像详情和合并图像。另外 ❗ If-Else 节点也进行了重大改动。（以及许多其他小改动）\n- **v0.42**: 改进 README，按类别划分节点，并修改部分节点标题。\n- **v0.43**: 为 Ollama 添加 control_after_generate 功能，允许在必要时将其保留在 VRAM 中 1 分钟。（用于快速连续生成）并添加回退到 0.0.0.0 的选项。\n- **v0.44**: 允许 Ollama 使用自定义 URL，该 URL 存储在 ComfyUI 自定义节点文件夹下的 `ollama_ip.txt` 文件中。进行了一些小改动，并在 README 中添加详细信息和更新内容。\n- **v0.45**: 新增节点：字符乱码器——使用 ComfyUI 自定义节点文件夹中的 `scrambler\u002Fscrambler_character.json` 文件随机更改文本。\n- **v0.46**: ❗ 视频节点发生了大量变化。保存视频现在使用浮点数表示帧率，而非整数。（许多其他自定义节点也是如此……）新增预览视频节点，新增将视频路径转换为图像列表的节点，新增将图像列表转换为临时视频 + 视频路径的节点，新增同步音频与视频时长的节点。（对 MuseTalk 很有用）同时更新 TTS 节点，增加多项输出（“audio_path”、“full_path”、“duration”），以便与其他节点如 MuseTalk 共用；并将 TTS 输入名称改为“connect_to_workflow”，以避免误将文本发送给它。\n- **v0.47**: 新增节点：循环加载检查点（模型选择器）。\n- **v0.48**: 为 LoRA 新增两个节点：随机 LoRA 选择器和循环 LoRA 选择器。\n- **v0.49**: 新增节点：顺序循环（整数）——按整数值范围循环。（但每个工作流仅运行一次），音频同步更加智能，会根据音频时长调整视频时长。\n- **v0.50**: 允许音频进入“图像转视频路径”（临时视频）。新增三个节点：视频拼接、音视频合并以及顺序循环（输入行）。保存文本更改至 ComfyUI 文件夹内。修复从输入中随机抽取一行时输出为列表的问题。❗ 音频\u002F视频同步节点发生重大变更，允许不同类型的输入。\n- **v0.51**: 修复音频\u002F视频同步节点的一些问题。新增两个节点：垂直和水平合并图像\u002F视频。添加 requirements.txt 和 ollama_ip.txt 文件。\n- **v0.52-53**: 将 Git 名称改回 Bjornulf_custom_nodes，与 Comfy 注册表保持一致。\n- **v0.54-55**: 在 requirements.txt 中添加 opencv-python。\n- **v0.56**: ❗重大变更：Ollama 节点简化，不再需要 ollama_ip.txt 文件，等待 Ollama 节点集合准备就绪。\n- **v0.57**: ❗❗重大变革，全新 Ollama 节点“Ollama Chat”具备实际功能。共 5 个 Ollama 节点。（模型选择器 + 任务选择器 + 人格选择器 + Ollama Vision + Ollama Talk）Ollama Talk 可以使用上下文，并支持上下文文件。为顺序节点增加行数\u002F当前计数器和下一个节点。新增 STT 节点。（依赖 faster_whisper）更好地管理选择器上的空 LoRA\u002F检查点。（预设列表）为 TTS 节点添加“default_for_language”，即为每种语言选择默认语音（例如：fr\u002Fdefault.wav）。如果没有，则选择所选语言的第一条 WAV 文件。\n- **v0.58**: 对模型选择器的默认值进行小幅修正。（默认设置为 None）\n- **v0.59**: 大量修复 JavaScript 代码，以避免尺寸调整问题，并改善属性管理和恢复功能。\n- **v0.60**: 恢复 ollama_talk 的原状（稍后实现 _user 模式 \u002F 另一节点）。\n- **v0.61**: 新增\u002F修改一系列 Ffmpeg\u002F视频节点。配备全局配置系统，并可切换使用 python-ffmpeg 或系统自带的版本。\n- **v0.62**: 大规模更新，文本生成节点。（共 15 个节点）API 节点生成（civitai \u002F black forest labs \u002F fal.ai），CIVIT AI API 下载模型节点，LoRA。\n- **v0.63**: 删除冗长且无用的文件。\n- **v0.64**: 移除“import wget”，并在文本生成器中添加了一些关键词。\n- **v0.65**: ❗重大变更：合并文本输入现均为可选（请重新制作您的节点，抱歉）。新增 6 个节点：any2int、any2float、从文件夹加载文本、从路径加载文本、从路径加载 LoRA。同时升级了保存文本节点。\n- **v0.66**: 新增 hunyuan CIVIT AI 的 LoRA 并下载，新增 TTS 配置节点，编辑 requirements.txt。\n- **v0.67**: 新增 kokoro TTS 节点。\n- **v0.68**: 更新 kokoro TTS 节点，使其支持 connect_to_workflow，并采用与 XTTS 相同的输出。\n- **v0.69**: 进行小幅修复。\n- **v0.70**: ❗重大变更：“行选择器节点”现已成为“通用节点”：手动选择、随机选择以及循环+顺序选择。\n文本替换现在支持多行正则表达式选项。（https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes\u002Fissues\u002F17）——可以从 Ollama 中移除 \u003Cthink> 标签。\n新增 8 个节点：“🖼👁 预览（第一张）图像”、“💾 Huggingface 下载器”、“👑 合并 LoRA，LoRA 堆栈”、“📥 加载全局变量”、“💾 保存全局变量”、“📝👈 模型-Clip-Vae 选择器（🎲 或 ♻ 或 ♻📑）”、“📒 笔记”、“🖼📒 图像笔记”。\n修复各处大量代码，略微改进日志系统等……正在进行中：重写所有 FFMPEG 节点。（仍需改进和修复，将在 v0.71 中完成？）或许目前暂不使用这些节点……\n- **v0.71**: ❗全局变量节点发生重大变更。（向全局变量系统中添加“filename”，即单独的全局变量文件。）修复语音转文本节点，新增 5 个节点 129-133。将合并文本限制提高至 100 行，改进保存图像到文件夹节点。\n- **v0.71-0.75**: 多次修复 bug。CIVIT AI 节点已在 Windows 上正常运行。（编码、链接问题是否已解决？至少在我的设备上是这样……）\n- **v0.76**: 由于与其他节点（如 Impact-Pack）存在冲突，且涉及旧版本的 numpy，因此从 requirements.txt 中移除 kokoro_onnx。（如果想使用此节点，需手动安装。）  \n为高级文本\u002F行选择器推出新语法，例如：{left|right|middle|group=LMR}+{left|right|middle|group=LMR}+{left|right|middle|group=LMR}，以及 {A(80%)|B(15%)|C(5%)}。  \n新增两个开关节点： 🔛✨ 任意事物开关开启\u002F关闭（兼容合并图像） AND 🔛📝 文本开关开启\u002F关闭（兼容合并文本）。  \n新增两个 Pick Me 全局节点，使用标识符代替链条： 🌎✒👉 全球写入 Pick Me AND 🌎📥 加载全球 Pick Me。  \n新增三个随机节点： 🌎🎲 全球随机种子、 🎲 随机整数、 🎲 随机浮点数（每个节点不仅返回其值，还返回相应的文本版本）。其中“种子节点”更为高级。  \n新增一个快速从列表中选择元素的节点： 📑👈 从列表中选择。  \n新增一个音频节点： 🔊▶ 播放音频（仅播放音频文件，默认为 bell.m4a，若未提供则使用该文件）。支持 AUDIO 格式或 audio_path。  \n❗重大变更。全面重写所有与 FFMPEG 相关的节点，并提供视频预览选项。（仍有少量改动待完成，将在下一版本中进行。）  \n- **v0.77**: 为从文件夹加载图像节点添加刷新按钮。  \n为高级写入\u002F行选择器添加新语法：2 个 {apple|orange|banana|static_group=FRUIT}s，左侧一个 {apple|orange|banana|static_group=FRUIT}，右侧一个 {apple|orange|banana|static_group=FRUIT}。  \n修复 TTS 请求语音的问题。  \n❗重大变更。Ollama 新增视觉模型。  \n新增 20 个节点（143-162），包括文本分析器、基础数学、音频预览等……（其中 10 个尚未发布，但已纳入公开“路线图”中。）  \n对于使用 Python 3.13 的用户，从 requirements.txt 中移除 faster-whisper。（需手动安装。）  \n修复预览图像节点，以适配新的 ComfyUI 布局。  \n重写 FFMPEG 节点，完善配置和视频预览功能。  \n此外，还修复了许多其他节点的 bug，并进行了多项改进，感谢大家的反馈。  \n- **v0.78**: 修复行选择器重置按钮的 JavaScript 代码。（刷新时无法显示）  \n- **v0.79**: 修复 Ollama Talk。  \n- **v0.780**: gtp-image-1 API 节点。\n\n# 📝 节点说明\n\n## 1 - 👁 显示（文本、整数、浮点数）\n\n**描述：**  \n显示节点仅用于展示文本或多个文本的列表。（只读节点）  \n管理三种类型：绿色代表字符串类型，橙色代表浮点数类型，蓝色代表整数类型。我添加了颜色以便您不会尝试编辑它们。🤣  \n\n更新 0.61：现在您还有另外四个节点可用于显示特定格式的值：整数、浮点数、字符串和 JSON（字符串）。  \n这些节点非常方便，因为它们在拖放时会自动推荐。\n\n![显示文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a44788cb510a.png)\n\n## 2 - ✒ 写入文本\n\n**描述：**  \n一个简单的节点，用于写入文本或将文本发送到另一个节点。  \n\n以下是一个使用写入文本节点与显示节点的简单示例：  \n\n![写入文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_20a953d1e7ae.png)\n\n## 3 - ✒🗔🅰️ 高级写入文本（+ 🎲 随机选项）\n\n**描述：**  \n高级写入文本节点允许使用特殊语法来接受随机变体，例如 `{hood|helmet}` 会随机选择 hood 或 helmet。  \n您还可以使用 `seed` 和 `control_after_generate` 来控制随机性。  \n它还会在 ComfyUI 控制台中显示文本。（对调试很有用）  \n控制台日志示例：  \n```\n原始文本：一张{green|blue|red|orange|yellow} {cat|rat|house}的照片\n选定文本：一张绿色房子的照片\n```\n\n![高级写入文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ee090337f8f5.png)\n\n您也可以使用这种语法创建和重用变量：\u003Cname>。  \n使用示例：  \n\n![变量](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9890cdc9afe1.png)\n\n❗ 0.76 - 新增语法：  \n分组，无重复，例如：{left|right|middle|group=LMR}+{left|right|middle|group=LMR}+{left|right|middle|group=LMR}  \n基于百分比的随机选择：{A(80%)|B(15%)|C(5%)}  \n\n❗ 0.77 - 新增语法：  \n2 个 {apple|orange|banana|static_group=FRUIT}s，左边一个 {apple|orange|banana|static_group=FRUIT}，右边一个 {apple|orange|banana|static_group=FRUIT}\n\n## 4 - 🔗 组合文本\n\n**描述：**  \n将多个文本输入组合成一个输出。（可以选择以逗号、空格、换行符或不加任何分隔符的方式连接）\n\n![组合文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f31ead86c257.png)\n\n## 5 - 🎲 随机（文本）\n\n**描述：**  \n从预定义的列表中生成并显示随机文本。非常适合创建随机提示词。  \n您还可以使用 `control_after_generate` 来控制随机性。  \n\n![随机文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_0a3c4e25d116.png)\n\n## 6 - ♻ 循环\n\n**描述：**  \n\n⚠️ 注意：已弃用，此节点不再工作。  \n最新的 ComfyUI 版本拒绝输出两次相同的值。  \n\n通用循环节点，您可以将其连接到任何地方。  \n\n![循环](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ad5cd74c33d5.png)\n\n它有一个可选输入，如果没有输入，它会循环“if_no_input”字符串的值（您可以编辑）。  \n❗ 请注意，此节点接受所有类型的输入和输出，因此您可以将其与文本、整数、图像、掩码、分割等一起使用，但请确保输入和输出的一致性。  \n如果可以避免，请不要使用此循环节点。  \n\n这是一个与我的节点 28 结合使用的示例，用于为每次迭代强制使用不同的种子：  \n![循环](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b668bf3940e5.png)\n\n## 7 - ♻ 循环文本\n\n**描述：**  \n循环遍历一组文本输入。  \n\n![循环文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ade97ebd3cbb.png)\n\n这里是一个结合组合文本和 flux 使用的示例：  \n![循环文本示例](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7831290c7325.png)\n\n## 8 - ♻ 循环整数\n\n**描述：**  \n迭代一个整数范围，适用于 ksampler 中的 `steps` 等参数。  \n\n![循环整数](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_80bea6b28a0b.png)  \n![循环整数 + 显示文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_12d52145c91a.png)\n\n❗ 请记住，您可以通过右键单击 ksampler 节点将其小部件转换为输入：  \n![小部件转输入](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f271e7147942.png)\n\n这里是一个使用 ksampler 的示例（请注意，对于“steps”参数，此节点并不优化，但足以进行快速测试）：  \n![小部件转输入](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b908eee71aa6.png)\n\n## 9 - ♻ 循环浮点数\n\n**描述：**  \n循环遍历一个浮点数范围，适用于 `cfg`、`denoise` 等参数。  \n\n![循环浮点数 + 显示文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2b9f5c16d8dc.png)  \n![循环浮点数](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_75cb1d5692cd.png)\n\n这里是一个使用 controlnet 的示例，尝试根据一只蓝色兔子生成一只红色猫：  \n![循环所有采样器](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_faf9496bc2f4.png)\n\n## 10 - ♻ 循环所有采样器\n\n**描述：**  \n迭代所有可用的采样器，并逐一应用。非常适合测试。  \n\n![循环所有采样器](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5c2dc12f18c9.png)\n\n这里是一个使用正常调度器循环所有采样器的示例：  \n![循环所有采样器](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e16fc1d32566.png)\n\n## 11 - ♻ 循环所有调度器\n\n**描述：**  \n迭代所有可用的调度器，并逐一应用。非常适合测试。（与上面的采样器类似，但针对调度器）  \n\n![循环所有调度器](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f25778193db3.png)\n\n## 12 - ♻ 循环组合\n\n**描述：**  \n从我自定义的一组组合（调度器+采样器）中生成循环，或者手动选择一个组合。  \n适合测试。\n\n![循环组合](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c4c6e592306d.png)\n\n使用示例，以查看不同组合之间的差异：  \n![组合示例](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e7043bf867db.png)\n\n## 13\u002F14 - 📏 + 🖼 调整大小并保存精确名称 ⚠️💣\n\n**描述：**  \n将图像调整为精确的尺寸。如果高度或宽度设置为 0，则会保持宽高比。  \n\n另一个节点会将图像保存到指定路径。  \n⚠️💣 注意：如果文件已存在，将会被覆盖。\n\n![调整大小并保存精确](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7209c85cdf92.png)\n\n## 15 - 💾 保存文本\n\n**描述：**  \n将给定的文本输入保存到文件中。适用于记录和存储文本数据。  \n如果文件已存在，文本将追加到文件末尾。  \n建议您将文件保存在“Bjornulf\u002FText”目录下（位于 Comfyui 文件夹中，紧邻 output 目录），因为节点 116 `从文件夹加载文本` 正是从该目录查找文本文件的。  \n\n![保存文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_afa6e0f2943f.png)\n\n## 16 - 💾🖼💬 为 Bjornulf LobeChat 保存图像（❗专为我的自定义 [lobe-chat](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_lobe-chat) 准备的❗）\n\n**描述：**  \n❓ 我制作这个节点是为了让我的自定义 lobe-chat 能够通过 Comfyui API 发送和接收图像：[lobe-chat](https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_lobe-chat)  \n它会将图像保存到 `output\u002FBJORNULF_LOBECHAT\u002F` 文件夹中。  \n文件名将从 `api_00001.png` 开始，然后是 `api_00002.png`，依此类推。  \n它还会在 `output\u002FBJORNULF_API_LAST_IMAGE.png` 位置创建一个指向最新生成图像的链接。  \n这个链接将被我的自定义 lobe-chat 用来将图像复制到 lobe-chat 项目中。  \n\n![保存 Bjornulf Lobechat](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_48f926751b15.png)\n\n## 17 - 💾🖼 以 `tmp_api.png` 临时 API 格式保存图像 ⚠️💣\n\n**描述：**  \n保存图像以供短期使用：.\u002Foutput\u002Ftmp_api.png ⚠️💣  \n\n![保存临时 API](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_bade847a067e.png)\n\n## 18 - 💾🖼📁 将图像保存到指定文件夹\n\n**描述：**  \n将图像保存到特定文件夹中，例如 `my_folder\u002F00001.png`、`my_folder\u002F00002.png` 等。  \n同时支持多级嵌套文件夹，比如 `animal\u002Fdog\u002Fsmall`。\n\n![保存临时API](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3e0ab0bf3b4f.png)\n\n## 19 - 🦙💬 Ollama对话\n\n**描述：**  \n在ComfyUI中使用Ollama。（需要已安装并正在运行的Ollama后端服务。）  \n默认使用模型 `llama3.2:3b` 和 URL `http:\u002F\u002F0.0.0.0:11434`。（自定义配置请使用节点63）\n\n基本使用示例：  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1bb04e6818a4.png)  \n\n带上下文的使用示例，注意在有上下文的情况下可以继续之前的对话，“那里”显然指的是“布加勒斯特”：  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a084682e46f9.png)  \n\n你还可以启用 `use_context_file`（设置为True），这会将上下文保存到文件中：`ComfyUI\u002FBjornulf\u002Follama_context.txt`。  \n这样你就可以在不连接多个节点的情况下继续使用上下文，只需多次运行同一个工作流即可。\n\n### 使用上下文文件进行对话的三步示例\n\n步骤1：注意目前上下文为空，因此它将成为 `ComfyUI\u002FBjornulf\u002Follama_context.txt` 中的第一条消息：  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df1e6c8c30bc.png)  \n\n步骤2：注意现在上下文文件中的行数已经改变（这些与 `updated_context` 相同）：  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8092d775ce90.png)  \n\n步骤3：注意行数持续增加。  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_08bf2ce96897.png)  \n\n点击“重置按钮”时，它还会将上下文保存到：`ComfyUI\u002FBjornulf\u002Follama_context_001.txt`、`ComfyUI\u002FBjornulf\u002Follama_context_002.txt` 等。\n\n⚠️ 如果你想进行“交互式”对话，可以启用 `waiting_for_prompt` 选项。  \n当设置为True时，会生成一个“恢复”按钮，使用该按钮解除节点暂停并处理提示。\n\n### 使用 waiting_for_prompt 进行交互式对话的三步示例\n\n步骤1：我运行工作流，注意到显示节点是空的，节点正在暂停工作流并等待你编辑提示。（此时它正在询问法国的首都。）  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5461167255b8.png)  \n\n步骤2：我将提示中的“法国”改为“中国”，但节点不会处理请求，直到你点击“恢复”按钮。    \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a46341b62611.png)  \n\n步骤3：我点击“恢复”按钮，这时请求才被处理。注意它使用的是“中国”而不是“法国”。  \n![Ollama](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_49144f27770c.png)  \n\n其他选项：  \n- 你还可以使用 `control_after_generate` 来强制节点在每次运行工作流时都重新运行。（即使节点或其输入没有变化。）  \n- 可以设置 `max_tokens` 来减少回答的长度，一个token大约相当于3个英文字符。  \n- 可以强制答案只显示在一行上，这可能会很有用。  \n- 你可以选择将模型保留在显存中。（如果你计划用相同的提示多次生成内容）——每次运行都会显著加快速度，但不会释放显存供其他任务使用。\n\n⚠️ 注意：使用 `vram_retention_minutes` 可能会对你的显存造成一定压力。请考虑是否真的需要它。通常情况下，在使用 `vram_retention_minutes` 时，你不应该同时进行图像生成或其他操作。\n\n## 20 - 📹 视频乒乓\n\n**描述：**  \n通过在到达最后一帧时反转播放方向，从一系列图像（来自视频）中创建乒乓效果。非常适合实现“无限循环”效果。\n\n![视频乒乓](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_512c3d7af77e.png)\n\n## 21 - 🖼➜📹 图片转视频（FFMPEG保存视频）\n\n**描述：**  \n将一系列图像组合成一个视频文件。\n\n![图片转视频](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df1ebe75c50a.png)\n\n❓ 我制作这个节点是因为它支持WebM格式的透明度。（rembg需要）  \n临时图像以及WAV音频文件都会存储在 `ComfyUI\u002Ftemp_images_imgs2video\u002F` 文件夹中。\n\n## 22 - 🔲 去除图像透明度（Alpha通道）\n\n**描述：**  \n通过用纯色填充Alpha通道来去除图像的透明度。（黑色、白色或绿幕）  \n当然，它需要输入一张带有透明度的图像，比如来自rembg节点的图像。  \n对于一些不支持透明度的节点来说，这是必要的。\n\n![去除Alpha](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_159939f8f3c3.png)\n\n## 23 - 🔲 图像转灰度（黑白）\n\n**描述：**  \n将图像转换为灰度（黑白）。\n\n![图像转灰度](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_cb5d50ba2f17.png)\n\n示例：我有时会将其与Ipadapter一起使用，以消除颜色的影响。  \n但有时你也可能想要一张黑白照片……\n\n## 24 - 🖼+🖼 叠加两张图像（背景+叠加层）\n\n**描述：**  \n将两张图像叠加成一张：一张背景图和一张或多张透明的叠加层。（也可以用于视频处理，只需发送所有帧并在之后重新组合。）\n\n![图像叠加](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8fe90c42df85.png)\n\n更新0.11：新增垂直和水平移动选项。（范围从-50%到150%）  \n❗ 注意：目前，`背景` 是一张静态图像。（以后也会支持视频。）  \n⚠️ 注意：如果你想直接加载带有透明度的图像，请使用我的节点 `🖼 带透明度的图像加载 ▢` 而不是 `加载图像` 节点。\n\n## 25 - 🟩➜▢ 绿幕转透明度\n\n**描述：**  \n将绿幕转换为透明度。  \n当然，需要干净的绿幕。（可以调整阈值，但这是一个非常基础的节点。）\n\n![绿幕转透明度](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_54a30b363664.png)\n\n## 26 - 🎲 从输入中随机抽取一行\n\n**描述：**  \n从输入文本中随机抽取一行。（例如，当你使用多个“写文本”节点时会很麻烦，这时你可以使用这个节点，只需从外部复制粘贴一个列表即可。）  \n你可以通过更改 `control_after_generate` 的固定\u002F随机设置，让每次运行工作流时都得到不同的文本。（或者保持不变）\n\n![随机抽取一行](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_24c285eaa78d.png)\n\n## 27 - ♻ 循环（输入中的所有行）\n\n**描述：**  \n遍历输入文本中的所有行。（非常适合测试多行文本。）\n\n![循环输入](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_efcf28b1d422.png)\n\n## 28 - 🔢 带随机种子的文本\n\n**描述：**  \n❗ 此节点用于强制生成一个随机种子，并伴随文本一起输出。  \n但这到底是什么意思呢？？？  \n当你使用循环（♻）时，每次迭代都会使用相同的种子。（这就是它的目的——保持同一种子以便比较结果。）  \n即使在 `control_after_generate` 中启用了随机化功能，循环仍然会为每一次迭代使用同一个种子，只有在整个工作流完成后才会改变种子。  \n不使用随机种子节点的简单示例：（两张图片提示词不同，但种子相同）\n\n![带随机种子的文本 1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6b9d93c9bd07.png)\n\n因此，如果你希望每次迭代都强制使用不同的种子，可以在循环中间使用此节点。  \n例如，如果你想每次都生成一张不同的图片。（即：你使用循环节点不是为了比较或测试结果，而是为了生成多张图片。）  \n可以这样使用：（两张图片提示词和种子都不同）\n\n![带随机种子的文本 2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a7c952cea916.png)\n\n以下是 FLUX 在不同提示词（兜帽\u002F头盔）但相同种子情况下可能出现相似性的示例：\n\n![带随机种子的文本 3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c07e390faf63.png)\n\n以下是 SDXL 在不同提示词（蓝色\u002F红色）但相同种子情况下可能出现相似性的示例：\n\n![带随机种子的文本 4](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_29ade3016187.png)\n\nFLUX：以下是左侧4张未使用随机种子节点的图片，右侧4张使用了随机种子节点的图片：\n\n![带随机种子的文本 5](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_57354e7ef5fd.png)\n\n## 29 - 🖼 带透明度的图像加载 ▢\n\n**描述：**  \n加载带有透明度的图像。  \n默认的 `Load Image` 节点不会加载透明度信息。\n\n![加载图像 Alpha](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2a31957fb5c1.png)\n\n## 30 - 🖼✂ 使用遮罩裁剪图像\n\n**描述：**  \n根据遮罩裁剪图像。\n\n![裁剪图像](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5edc4eb10ab3.png)\n\n## 31 - 🔊 TTS - 文本转语音（100% 本地运行，任意声音、任意语言）\n\n**描述：**  \n使用我的 TTS 服务器，根据任意声音和语言，将文本转换为高质量语音。  \n[收听音频示例](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F5a4a67ff-cf70-4092-8f3b-1ccc8023d8c6)  \n\n![TTS](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_139e296ad855.png)\n\n❗ 此节点目前仅在 Linux 上测试过，尚未在 Windows 上测试过。 ❗  \n\n使用基于 XTTS v2 的 TTS 服务器来生成文本到语音的转换。  \n❗ 当然，要使用这个 ComfyUI 节点（前端），你需要先运行我的 TTS 服务器（后端）：\u003Chttps:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_XTTS>  \n我为 \u003Chttps:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_lobe-chat> 制作了这个后端，但也可以通过此节点与 ComfyUI 配合使用。  \n安装好 `Bjornulf_XTTS` 后，你需要在我的 ComfyUI 自定义节点文件夹中创建一个名为 `speakers` 的链接：`ComfyUI\u002Fcustom_nodes\u002FBjornulf_custom_nodes\u002Fspeakers`  \n该链接必须指向你存放用于 TTS 的语音样本的文件夹，例如 `default.wav`。  \n如果我的 TTS 服务器正在 8020 端口运行（你可以通过浏览器访问 \u003Chttp:\u002F\u002Flocalhost:8020\u002Ftts_stream?language=en&speaker_wav=default&text=Hello> 测试），并且语音样本正常，就可以使用此节点将文本转换为语音。\n\n**细节**  \n此节点应始终连接到核心节点：`Preview audio`。\n\n我的节点会将音频文件保存在 `ComfyUI\u002FBjornulf_TTS\u002F` 文件夹中，路径依次为所选语言、语音样本名称和文本。  \n例如上图中的音频文件路径为：`ComfyUI\u002FBjornulf_TTS\u002FChinese\u002Fdefault.wav\u002F你吃了吗.wav`  \n你可以注意到，你并不需要选择中文语音才能说中文。是的，你可以自己录制并用任何语言说话。  \n此外，当你选择类似 `fr\u002Ffake_Bjornulf.wav` 这样的语音时，系统会自动创建一个 `fr` 文件夹：`ComfyUI\u002FBjornulf_TTS\u002FEnglish\u002Ffr\u002Ffake_Bjornulf.wav\u002Fhello_im_me.wav`。很明显，你是在用法语语音样本录制英语内容。\n\n`control_after_generate` 和往常一样，用于强制节点在每次工作流运行时重新执行。（即使节点或其输入没有变化。）  \n`overwrite` 用于覆盖已存在的音频文件。（例如，如果你对生成结果不满意，只需将 overwrite 设置为 True 并再次运行工作流，直到得到满意的结果。之后可以将其改回 False。）  \n`autoplay` 用于在节点执行时自动播放音频文件。（手动重播或保存则在 `preview audio` 节点中完成。）\n\n所以……请注意，如果你已经准备好了一个音频文件，仍然可以使用我的节点，而无需运行我的 TTS 服务器。  \n只要能找到音频文件，我的节点就会直接播放，而不会尝试连接后端的 TTS 服务器。  \n假设你已经使用此节点创建了一个用阿滕伯勒声音说“工作流已完成”的音频文件：\n\n![TTS](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6b4a291653aa.png)\n\n只要设置完全一致，它就不会调用我的服务器来播放音频文件！你可以放心地关闭 TTS 服务器，这样就不会占用宝贵的显存了。（TTS 服务器大约需要 3GB 显存。）\n\n另外，`connect_to_workflow` 是可选的，这意味着你可以只用我的 TTS 节点创建一个工作流，预先生成你以后想要使用的句子的音频文件，例如：\n\n![TTS](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_69586e9801ae.png)\n\n如果你希望在生成图像的同时运行我的 TTS 节点，建议使用我的 PAUSE 节点，以便在 TTS 节点完成后手动停止 TTS 服务器。当显存释放后，再点击 RESUME 按钮继续工作流。  \n如果你有能力同时运行两者，那当然很好，但在本地环境下，我无法同时运行 TTS 服务器和 FLUX，所以我采用了这种技巧：\n\n![TTS](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e4c7e90c44bd.png)\n\n### 32 - 🧑📝 角色描述生成器\n\n**描述：**  \n根据 `characters` 文件夹中的 JSON 文件生成角色描述：`ComfyUI\u002Fcustom_nodes\u002FBjornulf_custom_nodes\u002Fcharacters`  \n你可以自己制作包含角色信息的 JSON 文件，然后使用此节点生成描述。\n\n![角色](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ae6974837dd1.png)\n![角色](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ec3f4d7f37bd.png)\n\n❗ 目前这是一个非常基础的节点，未来还会添加和修改许多功能！！！  \n某些细节对于部分检查点可能无法使用，目前仍处于开发阶段，JSON 结构也尚未固定。  \n其中包含了一些预设角色。\n\n### 33 - ♻ 循环（将输入的所有行按行合并）\n\n**描述：**  \n有时你希望对多个输入进行循环处理，但又希望将输出的不同行分开。  \n有了这个节点，你可以根据需要设置输入和输出的数量。请参阅使用示例。\n\n![循环合并](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2677da25a51c.png)\n\n### 34 - 🧹 免费VRAM修复小技巧\n\n**描述：**  \n这是我尝试在使用后释放VRAM内存的方法，我还会继续优化它。  \n\n![free vram](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f68edfe180f5.png)\n![free vram](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4e24498ed0ea.png)\n\n对我而言，ComfyUI启动时会占用180MB的VRAM，而在我使用这个清理节点之后，VRAM占用可以降低到376MB。  \n我觉得目前并没有一个干净的方式来实现这一点，所以只能用这种“hacky”的方法。  \n虽然不完美，但总比一直卡在6GB VRAM占用上要好——尤其是当我确定不会再用到这些资源时……  \n你只需把这个节点接入你的工作流中即可，它可以接收任何输入并原样输出。因此，你可以把它放在工作流中的任意位置。  \n❗ ComfyUI为了运行得更快会使用缓存（比如不会重复加载检查点），所以请仅在需要时使用这个释放VRAM的节点。  \n❗ 要使这个节点正常工作，你需要在ComfyUI中启用开发者\u002FAPI模式。（可以在设置中完成）  \n此外，该节点会运行一个“空的\u002F虚拟的”工作流来释放VRAM，因此在工作流结束后可能需要几秒钟才能生效。\n\n### 35 - ⏸️ 暂停。恢复还是停止？\n\n**描述：**  \n自动暂停工作流，并在暂停时发出铃声。（播放提供的`bell.m4a`音频文件）  \n\n![pause resume stop](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_84d28e7c80b4.png)\n![pause resume stop](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1c081d21c7c1.png)\n![pause resume stop](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2869e578210b.png)\n\n随后，你可以通过点击节点上的按钮手动恢复或停止工作流。  \n例如，当我在进行一个非常耗时的超分辨率处理时，我会先检查输入是否合适再继续。有时我也会直接停止工作流，然后用另一个随机种子重新开始。  \n你可以将任何类型的节点连接到暂停节点上，上面的例子是文本节点，但你也可以发送图像或其他任何内容，因为节点的“输入=输出”。当然，输出必须连接到能够正确处理该格式的组件才行……\n\n### 36 - ⏸️🔍 暂停。选择输入，挑选一个\n\n**描述：**  \n自动暂停工作流，并在暂停时发出铃声。（播放提供的`bell.m4a`音频文件）  \n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b07a3dd2c676.png)\n\n随后，你可以手动选择想要使用的输入，并用它来恢复工作流。  \n你可以把这个节点连接到任何你想处理的内容上，上面的例子是图像节点。不过，你也可以根据需要选择其他类型的数据，因为节点的“输入=输出”。\n\n### 37 - 🎲🖼 随机图片\n\n**描述：**  \n从一组图片中随机选取一张图片。  \n\n![random image](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e9a88cca9417.png)\n\n### 38 - ♻🖼 循环（图片）\n\n**描述：**  \n对一组图片进行循环处理。  \n\n![loop images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2792bf26f380.png)\n\n使用示例：如果你有一组图片，希望对每一张都应用相同的处理流程，就可以使用这个节点。  \n上面的例子展示了循环图片节点如何将这些图片送入一个Ipadapter工作流中。（当然，所有图片都会使用相同的随机种子。）\n\n### 39 - ♻ 循环（✒🗔🅰️ 高级写文字）\n\n**描述：**  \n如果你需要快速循环，但又不想使用复杂的循环节点，可以使用这个结合了高级写文字和循环功能的节点。  \n\n![loop write text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ec4ec512c06b.png)\n\n它会采用与高级写文字节点相同的特殊语法 `{blue|red}`，但它会遍历所有可能的组合，而不是随机选择其中一个。  \n0.40：你还可以在循环中使用变量 `\u003Cname>`。\n\n### 40 - 🎲 随机（模型+CLIP+VAE）- 即检查点\u002F模型\n\n**描述：**  \n简单地从一个加载检查点节点中随机抽取一组三件套。  \n\n![random checkpoint](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c5ed7d3a1ae9.png)\n\n需要注意的是，它使用的是核心的加载检查点节点。这意味着所有的检查点都会被预先加载到内存中。  \n\n细节：  \n- 这种方式会占用更多的VRAM，但切换检查点的速度会更快。  \n- 它无法告诉你当前加载的是哪个检查点的名称。  \n\n在决定使用哪一种方法之前，请先查看第41个节点。  \n\n### 41 - 🎲 随机加载检查点（模型选择器）\n\n**描述：**  \n这是另一种随机选择加载检查点节点的方式。  \n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f50a1e5f33cf.png)\n\n它不会将所有检查点预先加载到内存中，因此切换检查点的速度会稍慢。  \n不过，你可以利用更多的输出来决定结果的存储位置。（`model_folder`会返回检查点所属的最后一个文件夹名称。）  \n我通常会将检查点按照模型类型分别存放在不同的文件夹中，比如 `SD1.5`、`SDXL` 等等。因此，这种方式能帮助我快速获取这些信息。  \n\n细节：  \n- 与第40个节点相比，你无法为每个选定的检查点单独配置参数。（例如，针对特定模型设置 CLIP 的最后一层参数，或者使用不同的 VAE 或 CLIP。）也就是说，所有模型都会共享完全相同的工作流。  \n\n在决定使用哪一种方法之前，请先查看第40个节点。第53个节点则是这个节点的循环版本。  \n\n注意：如果你想只加载一个检查点，但又想提取其所属文件夹的名称（比如将检查点名称作为保存结果的文件夹名称，或者用于 if\u002Felse 条件判断），那么可以使用我的第41个节点，只是在里面放入一个检查点即可。（它会随机选择一个，所以实际上总是同一个检查点。）\n\n### 42 - ♻ 循环（模型+CLIP+VAE）- 即检查点\u002F模型\n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8de78266f191.png)\n\n**描述：**  \n对多个检查点节点中的所有三件套进行循环处理。\n\n### 43 - 📥🖼📂 从输出文件夹加载图片\n\n**描述：**  \n快速从输出文件夹中的某个子文件夹内选择所有图片。（非递归方式。）  \n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_51fcd302c15d.png)\n\n如你所见，截图中图片是按照分辨率进行分类的。  \n目前还无法动态调整输出数量，所以我直接设置为4个。  \n节点会根据图片的分辨率来分离它们，因此每个文件夹最多可以有4种不同的分辨率。（如果超过4种，可能就需要新建一个文件夹了……）  \n为了避免在文件夹中分辨率少于4种时出现错误或崩溃，节点会输出白色张量（即白色方块图像）。  \n所以这个节点现在还比较“hacky”，不过它确实能让我在一秒钟内选出不同的角色。  \n如果你想知道我是如何为特定角色保存图片的，以下是部分工作流示例（注意我在Linux系统上使用`\u002F`作为路径分隔符）：  \n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2c1b305c37b9.png)  \n在这个例子中，我先输入字符串“character\u002F”，再与“nothing”拼接；当然也可以先输入“character”，再加一个斜杠“\u002F”。（我只是习惯在文件夹名后面加上斜杠……）  \n\n如果你对这种逻辑感到满意，可以选中这些节点，右键点击并选择“转换为组节点”，这样就能创建属于自己的自定义“保存角色节点”：  \n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ccf5051d6a09.png)\n\n这里还有一个类似的例子，但去掉了保存文件夹的节点：  \n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_545b2279ce0f.png)\n\n⚠️ 如果你真的想把所有图片整合到一个流程中，可以使用我的第47号节点“合并图片”将它们全部放在一起。\n\n### 44 - 🖼👈 选择一张图片，挑选\n\n**描述：**  \n从一组图片中选择一张。  \n\n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b05187738925.png)  \n\n此节点与我的“从文件夹加载图片”和“预览图片”节点配合使用非常有用。  \n\n你当然也可以像上面的截图那样制作一个组节点：  \n![pick input](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_57a3d58db1a2.png)\n\n### 45 - 🔀 如果-否则（输入 \u002F 比较值）\n\n**描述：**  \n复杂的if\u002Felse逻辑节点系统。  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8a9bb68b4a0d.png)  \n\n如果提供的`输入`等于小部件中设定的`比较值`，则会转发`send_if_true`；否则会转发`send_if_false`。（如果没有连接`send_if_false`，则返回`None`。）  \n你可以转发任何内容，下面是一个根据是否为SDXL模型来转发不同尺寸潜在空间的例子：  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d8f740c4851c.png)\n\n这里是该节点的一个完整示例，所有输出都通过“显示文本”节点展示出来：  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6a28d5947c9b.png)\n\n`send_if_false`是可选的，如果不连接，将会被替换为`None`。  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e438f542eaac.png)\n\nIf-Else节点是可以串联使用的，只需将`output`连接到`send_if_false`即可。  \n⚠️ 始终只需用`compare_with`测试`input`，并将期望的值连接到`send_if_true`。⚠️  \n这里有一个简单的例子，使用两个If-Else节点来选择三种不同的分辨率：  \n❗ 注意，同一个写文本节点同时连接到了两个If-Else节点的输入端：  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_57dc89a1f7d4.png)\n\n再来一个类似的例子，这次我们使用我的“循环写文本”节点一次性显示所有三种类型：  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8a7ceb2c1912.png)\n\n如果你已经理解了前面的例子，那么这里有一个完整的示例，它会生成三张图片：横版、竖版和正方形：  \n\n![if else](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d4ee9b281913.png)\n\n为了简化起见，工作流被隐藏了，但实际上非常简单——只需将潜在空间连接到Ksampler即可，没有特别复杂的地方。  \n你还可以将高级的循环写文本节点与我的“保存文件夹”节点相连，从而将横版\u002F竖版\u002F正方形的图片分别保存到不同的文件夹中，不过这就要看你自己的需求了……\n\n### 46 - 🖼🔍 图片详情\n\n**描述：**  \n显示图片的详细信息。（宽度、高度、是否透明、方向、类型）  \n`RGBA`被视为具有透明度，而`RGB`则不具有。  \n`orientation`可以是“landscape”（横版）、“portrait”（竖版）或“square”（正方形）。  \n\n![image details](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b7de7f64a078.png)\n\n### 47 - 🖼🔗 合并图片\n\n**描述：**  \n合并多张图片（单张图片或图片列表）。  \n如果你想将多张图片合并成一张，请查看第60或61号节点。  \n\n“合并图片”有两种逻辑模式。启用“all_in_one”后，所有图片会被合并成一个张量。  \n否则，图片会逐个发送。（请参阅下方示例）：  \n\n这是一个禁用“all_in_one”选项的示例（注意这里有两张图片，它们并不是并排显示，而是被组合成了一个列表）：  \n\n![combine images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ae92470e49a8.png)\n\n但例如，如果你想使用我的“选择一张图片，挑选”节点，就必须启用“all_in_one”，并且所有图片必须具有相同的分辨率。  \n\n![combine images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4cc6678b5785.png)\n\n你会发现，在使用“all_in_one”模式时，结合“预览图片”节点并不会产生可见的变化。（这就是为什么我添加了“显示文本”节点——请注意，“显示文本”会让图像呈现蓝色，因为它是张量形式的图像。）  \n\n实际上，使用“合并图片”节点时，你也可以一次发送多张图片，它们都会被合并在一起。  \n以下是一个结合“从文件夹加载图片”节点、“图片详情”节点和“合并图片”节点的示例：（当然，在这种情况下不能启用“all_in_one”，因为图片的分辨率各不相同）：  \n\n![combine images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5e84531204c5.png)\n\n这里还有一个更简单的例子，从文件夹中选取几张图片并将其合并起来，以供后续处理使用：  \n\n![combine images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2065d57f87d0.png)\n\n### 48 - 🔀🎲 文本乱序器（🧑 字符）\n\n**描述：**  \n接收文本作为输入，并使用ComfyUI自定义节点文件夹中的`scrambler\u002Fcharacter_scrambler.json`文件对文本进行随机打乱。  \n\n![scrambler character](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_914826487bc0.png)\n\n### 49 - 📹👁 视频预览\n\n**描述：**  \n此节点接收视频路径作为输入，并播放该视频。  \n\n![video preview](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1713c77a49b3.png)\n\n### 50 - 🖼➜📹 图片转视频路径（临时视频）\n\n**描述：**  \n此节点会将一组图片转换为一个临时的视频文件。  \n❗ 更新0.50：现在可以向视频添加音频。（audio_path 或 audio TYPE）  \n\n![image to video path](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8345bb58779d.png)\n\n### 51 - 📹➜🖼 视频路径转图片\n\n**描述：**  \n此节点会将视频路径作为输入，转换为一组图片。  \n\n![video path to image](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_487d44d87cc5.png)\n\n在上面的例子中，我还通过将`frame_interval`设置为2来只取一半的帧。  \n需要注意的是，原本有16帧，但在右上角的预览中只能看到8张图片。\n\n### 52 - 🔊📹 音频视频同步\n\n**描述：**\n\n这个节点是一个过度设计的节点，旨在将音频文件的时长与视频文件的时长相匹配并同步。  \n❗ 视频理想情况下应为循环播放；如果需要，可以查看我的乒乓视频节点。\n此次同步的主要目标是实现视频结尾与开头之间的平滑过渡（同一帧）。  \n随后，您可以串联多个视频，使它们之间实现流畅切换。\n\n具体来说，此节点会执行以下操作：  \n- 如果视频稍长：在音频文件中添加静音部分。  \n- 如果视频过长：将视频速度降低至原速的0.5倍，并在音频中添加静音。（现已可编辑）  \n- 如果音频稍长：将视频速度提高至原速的1.5倍。（现已可编辑）  \n- 如果视频过长：将视频速度提高至原速的1.5倍，并在音频中添加静音。\n\n它非常适合与MuseTalk等工具配合使用 \u003Chttps:\u002F\u002Fgithub.com\u002Fchaojie\u002FComfyUI-MuseTalk>。\n\n以下是“音频视频同步”节点的一个示例，请注意，该节点还可以方便地获取视频的帧率，并将其传递给其他节点。（代码有点乱……凑合着用吧。😎 如果你不明白也没关系，可以直接测试一下。）：\n\n![音频视频同步](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d6aac27835e5.png)\n\n❗ 更新 0.50：audio_duration 现在是可选参数，如果不连接，将自动从音频文件中读取。  \n❗ 更新 0.50：现在既可以输入视频的图像列表，也可以直接提供视频路径；音频同样支持 AUDIO 或 audio_path 输入方式。\n\n新版本 0.50 的布局，逻辑保持不变：\n\n![音频视频同步](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_54c4965b1d8d.png)\n\n### 53 - ♻ 循环加载检查点（模型选择器）\n\n**描述：**\n\n这是节点41的循环版本。（详情请参考节点41）  \n它会依次循环遍历所有选定的检查点。\n\n❗ 与节点41的最大区别在于，检查点会被预先加载到内存中，因此可以更快地一次性运行所有检查点。  \n这是一种快速测试多个检查点的好方法。\n\n![循环模型选择器](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4e173f6e147d.png)\n\n### 54 - ♻ 循环LoRA选择器\n\n**描述：**\n\n循环遍历所有选定的LoRA。\n\n![循环LoRA选择器](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e138d064d18f.png)\n\n以上示例展示了Pony模型搭配多种风格的LoRA效果。\n\n下面是一个使用Flux模型的示例，用于测试您的LoRA训练是否欠拟合、过拟合或恰到好处：\n\n![循环LoRA选择器](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a1a43172f0b7.png)\n\n### 55 - 🎲 随机LoRA选择器\n\n**描述：**\n\n从一组LoRA中随机选取一个。\n\n![随机LoRA选择器](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3ec61f07c9ce.png)\n\n### 56 - ♻📑📝 循环顺序执行（整数）\n\n**描述：**\n\n此循环的工作方式与普通循环类似，但它是顺序执行的：每次工作流运行时，它只会输出一个整数！！！  \n第一次输出第一个整数，第二次输出第二个整数，依此类推……  \n当达到最后一个整数时，节点会停止整个工作流，防止后续步骤继续执行。  \n其内部实现依赖于 `ComfyUI\u002FBjornulf` 文件夹下的单个文件 `counter_integer.txt`。  \n❗ 请勿在一个工作流中使用超过一个此类节点，因为它们会共享同一个 `counter_integer.txt` 文件。（可能导致意外行为。）\n更新 0.57：重置按钮现在也会显示下一个计数器值。\n\n![循环顺序执行整数](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_74bb9de83d31.png)  \n![循环顺序执行整数](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3f4cf7a5ad9d.png)  \n![循环顺序执行整数](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4bfef1ff02c5.png)  \n![循环顺序执行整数](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4f4730784dc5.png)\n\n### 57 - ♻📑 循环顺序执行（输入行）\n\n**描述：**\n\n此循环的工作方式与普通循环类似，但它是顺序执行的：每次工作流运行时，它只会输出一行内容！！！  \n第一次输出第一行，第二次输出第二行，依此类推……  \n您还可以通过 +1 \u002F -1 按钮来控制当前行号。  \n当到达最后一行时，节点会停止工作流，阻止后续步骤继续执行。  \n其内部实现依赖于 `ComfyUI\u002FBjornulf` 文件夹下的文件 `counter_lines.txt`。\n\n以下是我的 TTS 节点的一个使用示例：当我有一组句子需要处理时，如果对某个版本不满意，只需点击 -1 按钮，在 TTS 节点上勾选“覆盖”选项，即可重新生成同一句话，直到满意为止。  \n❗ 请勿在一个工作流中使用超过一个此类节点，因为它们会共享同一个 `counter_lines.txt` 文件。（可能导致意外行为。）\n\n![循环顺序执行行](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a28b699e6aec.png)\n\n更新 0.57：重置按钮现在也会显示下一个计数器值。  \n如果您希望预测下一行内容，可以使用节点68为文本添加行号。\n\n### 58 - 📹🔗 视频拼接\n\n**描述：**\n\n将两段视频拼接在一起（前后顺序排列在同一视频中）。  \n还可以对视频进行格式转换，支持使用 FFMPEG_CONFIG_JSON。（来自节点76\u002F77）\n\n![视频拼接](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df5f3f4b824b.png)\n\n### 59 - 📹🔊 视频与音频合并\n\n**描述：**\n\n简单地将视频和音频合并在一起。  \n视频：可以使用图像列表或视频路径。  \n音频：可以使用音频路径或直接输入音频数据。\n\n![视频音频合并](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_15422dd3ca7c.png)\n\n### 60 - 🖼🖼 图像\u002F视频水平合并 📹📹\n\n**描述：**\n\n将图像或视频沿水平方向合并。\n\n![图像合并](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4dea0a594202.png)\n\n以下是使用节点60和61对视频进行合并的一个可能示例：\n\n![视频合并](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e32bf2e6a516.png)\n\n### 61 - 🖼🖼 图像\u002F视频垂直合并 📹📹\n\n**描述：**\n\n将图像或视频沿垂直方向合并。\n\n![图像合并](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_464336d30324.png)\n\n以下是使用节点60和61对视频进行合并的一个可能示例：\n\n![视频合并](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e32bf2e6a516.png)\n\n### 62 - 🦙👁 Ollama 视觉\n\n**描述：**\n\n以一张图片作为输入，对该图片进行描述。默认使用 `moondream` 模型，但可通过节点63选择其他模型，并借助节点161自定义提示词。\n\n![Ollama 视觉](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_97bad0b277ee.png)\n\n### 63 - 🦙 Ollama 配置 ⚙\n\n**描述：**\n\n为 Ollama Talk 和 Vision 提供自定义配置。  \n您可以更改 Ollama 的 URL 以及使用的模型。  \n部分视觉模型在一定程度上也能处理文本任务。  \n以下是一个同时使用 `Ollama 视觉节点` 和 `Ollama Talk 节点` 的示例，二者共用同一个 `Ollama 配置节点`：\n\n![Ollama 配置](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_fd876d84ae4d.png)\n\n### 64 - 🦙 Ollama 工作角色选择 💼\n\n**描述：**\n\n为您的 Ollama Talk 节点选择一种角色，设置为 `None` 即可进行普通聊天。  \n如果您想自定义角色，只需将其设置为 `None`，然后在提示词前加上自定义内容。\n\n![Ollama 工作角色](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_539e5255c70d.png)\n\n### 65 - 🦙 Ollama 人格选择 🧑\n\n**描述：**\n\n为您的 Ollama Talk 节点选择一种人格设定。  \n如果您想自定义人格，只需将其设置为 `None`，并在提示词前添加自定义内容。  \n以下是一个疯狂科学家解释引力的例子：（请注意，LLM 足够智能，能够理解其中的拼写错误）：\n\n![Ollama 人格](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d6f6ad9892ab.png)\n\n### 66 - 🔊➜📝 STT - 语音转文本\n\n**描述：**  \n使用 `faster-whisper` 将 AUDIO 类型或音频路径转换为文本。（自动检测语言）  \n\n⚠️ 注意：此节点与 Python `3.13` 不兼容，需使用 `3.12`。（通常来说，ComfyUI 生态系统仍然建议使用 3.12：https:\u002F\u002Fgithub.com\u002Fcomfyanonymous\u002FComfyUI?tab=readme-ov-file#manual-install-windows-linux。）  \n（`faster-whisper` 已从 `requirements.txt` 中移除，需手动安装。）  \n如果您确实想使用该节点，则需要自行安装：`pip install faster-whisper`。  \n\n![stt](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3406fe3c9f98.png)  \n![stt](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_99785d5eced2.png)  \n\n### 67 - 📝➜✨ 文本转任意内容\n\n**描述：**  \n有时您希望强制某个节点接受一个字符串。  \n例如，当节点的输入是列表时，就无法直接传入字符串。  \n此节点可以插入到流程中间，强制将字符串作为输入使用。  \n以下是结合我的 TTS 节点的一个示例。  \n\n![text to anything](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f6913c09d3f1.png)  \n\n### 68 - ✨➜📝 任意内容转文本\n\n**描述：**  \n有时您希望将某种数据强制转换为字符串。  \n大多数输出确实是文本，尽管可能无法直接使用。  \n此节点会忽略这一点，直接将输入转换为简单的字符串。  \n\n### 69 - 🔢 添加行号\n\n**描述：**  \n\n此节点会为文本添加行号。  \n在使用第 57 个节点（该节点会逐行处理输入）时非常有用。（您可以读取或预测下一行内容。）  \n\n![add line numbers](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7438a7e42ca3.png)  \n\n### 70 - 📏 按百分比调整图像大小\n\n**描述：**  \n\n按百分比缩放图像。  \n\n![resize percentage](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d7123645f0bf.png)  \n\n### 71 - 👁 显示整数\n\n**描述：**  \n基础节点，用于显示整数。（您可以直接拖拽任何整数节点，它会被自动推荐。）  \n\n![show int](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_fb77c91e5832.png)  \n\n### 72 - 👁 显示浮点数\n\n**描述：**  \n基础节点，用于显示浮点数。（您可以直接拖拽任何浮点数节点，它会被自动推荐。）  \n\n![show float](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_70c310d3ead6.png)  \n\n### 73 - 👁 显示字符串\u002F文本\n\n**描述：**  \n基础节点，用于显示字符串。（您可以直接拖拽任何字符串节点，它会被自动推荐。）  \n\n![show string](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ee763e480a4e.png)  \n![show string](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7360b5f796be.png)  \n\n### 74 - 👁 显示 JSON\n\n**描述：**  \n此节点会将字符串格式化为可读的 JSON。（并以粉色显示）  \n\n![show json](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d09d0838eb34.png)  \n![show json](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_0772b673f8de.png)  \n\n### 75 - 📝➜📝 替换文本\n\n**描述：**  \n用另一种文本替换现有文本，支持正则表达式等多种选项，请参阅下方示例：  \n\n![text replace](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_704bad51f0af.png)  \n![text replace](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e5d3d5b185e0.png)  \n![text replace](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_993a70ed3d3e.png)  \n\n0.70：文本替换功能现已支持多行正则表达式。\n\n### 76 - ⚙📹 FFmpeg 配置 📹⚙\n\n**描述：**  \n创建一个 FFMPEG_CONFIG_JSON，其中包含可用于其他节点的 JSON 数据：  \n- 视频转换  \n- 视频拼接  \n- 从列表中拼接视频  \n\n![text replace](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c45ddc75e422.png)  \n\n### 77 - 📹🔍 视频详情 ⚙\n\n**描述：**  \n从视频路径中提取详细信息。  \n您可以将一体化的 FFMPEG_CONFIG_JSON 与其他节点一起使用，也可以根据需要单独使用其他变量。  \n\n![video details](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7288b33f6f80.png)  \n\n### 78 - 📹➜📹 视频转换\n\n**描述：**  \n转换视频，可使用 FFMPEG_CONFIG_JSON。  \n\n![convert video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d39938bc4f15.png)  \n\n#### 79 - 📹🔗 从列表拼接视频\n\n**描述：**  \n接收一个视频列表（每行一个视频），并将它们依次拼接成一个视频。  \n可使用来自第 76 或 77 个节点的 FFMPEG_CONFIG_JSON。    \n\n![concat video list](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_044f06740e4a.png)  \n\n#### 80 - 🩷 空潜变量选择器\n\n**描述：**  \n厌倦了手动设置潜变量空间？  \n从我自定义的格式列表中选择一个。  \n只需将其连接到您的 KSampler 即可。  \n\n![empty_latent](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6aeca9e4e67b.png)  \n\n#### 81 - 🔥📝🖼 图像文本生成器 🖼📝🔥\n\n**描述：**  \n主要的文本生成节点，本身并不执行太多操作，仅负责“相机角度”和“多角色动作”。（例如：“……吃野餐，俯视视角。”）  \n但是，您可以将其他“文本生成节点”连接到它上。  \n\n⚠️ 关于“文本生成”的警告：此节点只是单纯地编写文本，随后由检查点模型（SD1.5、SDXL、Flux 等）解析文本并生成图像。  \n某些模型在某些方面表现较差，因此请不要期望您所编写的文本在所有检查点或 LoRA 上都能完美生效。（此节点的设计初衷是配合 Flux 模型使用。）  \n\n以下是我所有“文本生成节点”的使用教程，共分为 8 步：  \n\n第 1 步：使用主文本生成节点，编写图像的一般细节（此处为“相机角度”和“拍摄类型”）。目前我只是将文本与一个简单的“写文本”节点结合，后者会发送“沼泽怪物”：  \n![textgen](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f91aafdb2497.png)  \n\n第 2 步：为图像添加特定风格：  \n![textgen_style](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c67dc97d56c7.png)  \n\n第 3 步：为图像添加场景\u002F背景：  \n![textgen_scene](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3d0545743178.png)  \n\n第 4 步：使用角色节点代替“写文本”节点，向场景中添加角色。  \n我将移除“写文本”节点中的“沼泽怪物”，改用我的角色节点，创建一只具有闪电能力的凶猛龙：  \n![textgen_char](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c92b066f52c5.png)  \n\n第 5 步：角色节点（男性\u002F女性及生物）可以包含多个角色。（但这些角色将共享相同的特征。）  \n接下来，我移除了龙，并利用主节点中的“multi_char_action”创建了两个正在打斗的“男性角色”。（您也可以将其设置为自定义动作并自行编写。）  \n![textgen_2chars](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b4d040d776e2.png)  \n\n第 5 步：尝试为角色添加位置，我希望将其放置在图像左侧。然而，使用我一直使用的 SDXL 模型却失败了：  \n![textgen_charposition_FAIL_sdxl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1dcac42f692b.png)  \n\n第 6 步：切换到 FLUX 模型，测试其“location_on_image”功能（该功能有效）：  \n![textgen_location_on_image_flux](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_038fc6e9b94b.png)  \n\n第 7 步：使用我的 API 自定义节点 109，切换至 Black Forest Lab 的 FLUX Ultra 模型。  \n如果您希望多个角色拥有不同的特征（如“location_on_image”或其他特性），可以将多个角色节点串联起来，彼此连接使用。  \n如下所示，我请求在图像左侧放置两只小恐龙，在右侧放置一只僵尸：  \n![textgen_Complex_ULTRA](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9d8d4fcfcf5f.png)\n\n步骤8：最后，我将禁用僵尸角色，添加一套服装（这里是一套“花卉盔甲”），还会为角色添加一个“姿势”节点，并将该姿势节点连接到一个“物体”节点。（它们一起会让角色“拿着一本书”并把“手放在下巴上”）  \n![textgen_final](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_53863dc80c4f.png)  \n\n#### 82 - 👩‍🦰📝 文本生成器（女性角色）\n\n**描述：**  \n生成与女性角色相关的文本。  \n需要连接到“文本生成器”主节点。  \n\n⚠️ 关于“文本生成器”的教程，请参见节点81。  \n\n#### 83 - 👨‍🦰📝 文本生成器（男性角色）\n\n**描述：**  \n生成与男性角色相关的文本。  \n\n⚠️ 关于“文本生成器”的教程，请参见节点81。  \n\n#### 84 - 👾📝 文本生成器（生物角色）\n\n**描述：**  \n生成与生物角色相关的文本。  \n\n⚠️ 关于“文本生成器”的教程，请参见节点81。  \n\n#### 85 - 💃🕺📝 文本生成器（角色姿势）\n\n**描述：**  \n生成与角色姿势相关的文本。  \n\n⚠️ 关于“文本生成器”的教程，请参见节点81。  \n\n#### 86 - 🔧👨‍🔧📝 文本生成器（角色相关物品）\n\n**描述：**  \n生成与某个与角色姿势相连的物品相关的文本。  \n\n⚠️ 关于“文本生成器”的教程，请参见节点81。  \n\n#### 87 - 🌄📝 文本生成器（场景）\n\n**描述：**  \n生成与特定场景相关的文本，直接连接到主文本生成器。  \n\n⚠️ 关于“文本生成器”的教程，请参见节点81。  \n\n#### 88 - 🎨📝 文本生成器（风格）\n\n**描述：**  \n生成与特定风格相关的文本，直接连接到主文本生成器。  \n\n⚠️ 关于“文本生成器”的教程，请参见节点81。  \n\n#### 89 - 👗 文本生成器（女性服装）\n\n**描述：**  \n生成与特定女性服装相关的文本。  \n\n⚠️ 关于“文本生成器”的教程，请参见节点81。  \n\n#### 90 - 👚 文本生成器（男性服装）\n\n**描述：**  \n生成与特定男性服装相关的文本。  \n\n⚠️ 关于“文本生成器”的教程，请参见节点81。  \n\n#### 91 - ♻🔥📝 列表循环器（文本生成器）\n\n**描述：**  \n用于对主文本生成器节点中的元素进行循环的循环器。  \n\n所有“列表循环器”节点都采用相同的逻辑，你可以以相同的方式使用它们。以下是节点92（场景列表循环器）的示例，它会遍历所有不同的“天气状况”：  \n\n![listlooper_USE](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_96b5d9490ced.png)  \n\n⚠️ 注意，如果你想逐个循环元素，而不是一次性全部循环，请不要使用这些“列表循环器”节点！！你只需将想要的元素转换为输入，并双击创建一个新的节点，将其设置为“递增”。  \n\n例如，这里可以看到数值被“递增”了，也就是变成了列表中的下一个值；下一次运行时，它又会取列表中的下一个值（以此类推）：  \n![listlooper_notUSE](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d336ba88b804.png)  \n\n#### 92 - ♻🌄📝 列表循环器（文本生成器场景）\n\n**描述：**  \n用于对场景节点中的元素进行循环的循环器。  \n\n⚠️ 关于“列表循环器”的教程，请参见节点91。  \n\n#### 93 - ♻🎨📝 列表循环器（文本生成器风格）\n\n**描述：**  \n用于对风格节点中的元素进行循环的循环器。  \n\n⚠️ 关于“列表循环器”的教程，请参见节点91。  \n\n#### 94 - ♻💃🕺📝 列表循环器（文本生成器姿势）\n\n**描述：**  \n用于对姿势节点中的元素进行循环的循环器。  \n\n⚠️ 关于“列表循环器”的教程，请参见节点91。  \n\n#### 95 - ♻👨‍🦰👩‍🦰👾 列表循环器（文本生成器角色）\n\n**描述：**  \n用于对角色节点中的元素进行循环的循环器（包括男性、女性和生物角色）。  \n\n⚠️ 关于“列表循环器”的教程，请参见节点91。  \n\n#### 96 - ♻👚 列表循环器（文本生成器男性服装）\n\n**描述：**  \n用于对男性服装节点中的元素进行循环的循环器。  \n\n⚠️ 关于“列表循环器”的教程，请参见节点91。  \n\n#### 97 - ♻👗 列表循环器（文本生成器女性服装）\n\n**描述：**  \n用于对女性服装节点中的元素进行循环的循环器。  \n\n⚠️ 关于“列表循环器”的教程，请参见节点91。  \n\n#### 98 - 📥 加载SD1.5检查点（+从CivitAI下载）\n\n**描述：**  \n这与基础的“加载检查点”节点相同，但其模型列表来自CivitAI（而非本地文件夹）。  \n如果你的电脑上还没有该模型，它还会从CivitAI自动下载。（你需要从自己的账户获取API令牌——可在CivitAI.com的设置中找到。）  \n这是sd1.5版本，模型将被下载到：`ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fsd1.5`  \n下载完成后，你可以继续使用此节点来加载检查点，或者通过基础的“加载检查点”节点使用已下载的模型。  \n\n![civitai_load_sd15](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8eec8fb9ebca.png)  \n\n#### 99 - 📥 加载SDXL检查点（+从CivitAI下载）\n\n**描述：**  \n这与基础的“加载检查点”节点相同，但其模型列表来自CivitAI（而非本地文件夹）。  \n如果你的电脑上还没有该模型，它还会从CivitAI自动下载。（你需要从自己的账户获取API令牌——可在CivitAI.com的设置中找到。）  \n这是sdxl_1.0版本，模型将被下载到：`ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fsdxl_1.0`  \n下载完成后，你可以继续使用此节点来加载检查点，或者通过基础的“加载检查点”节点使用已下载的模型。  \n\n![civitai_load_sdxl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_58d8d3d17003.png)  \n\n#### 100 - 📥 加载Pony检查点（+从CivitAI下载）\n\n**描述：**  \n这与基础的“加载检查点”节点相同，但其模型列表来自CivitAI（而非本地文件夹）。  \n如果你的电脑上还没有该模型，它还会从CivitAI自动下载。（你需要从自己的账户获取API令牌——可在CivitAI.com的设置中找到。）  \n这是pony版本，模型将被下载到：`ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fpony`  \n下载完成后，你可以继续使用此节点来加载检查点，或者通过基础的“加载检查点”节点使用已下载的模型。  \n\n![civitai_load_pony](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_8d2345a555b0.png)  \n\n#### 101 - 📥 加载FLUX Dev检查点（+从CivitAI下载）\n\n**描述：**  \n这与基础的“加载检查点”节点相同，但其模型列表来自CivitAI（而非本地文件夹）。  \n如果你的电脑上还没有该模型，它还会从CivitAI自动下载。（你需要从自己的账户获取API令牌——可在CivitAI.com的设置中找到。）  \n这是flux_d版本，模型将被下载到：`ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fflux_d`  \n下载完成后，你可以继续使用此节点来加载检查点，或者通过基础的“加载检查点”节点使用已下载的模型。  \n\n🚧 正在处理中，还需要手动清理列表、扩散器等……？ 🚧\n\n#### 102 - 📥 加载FLUX Schnell检查点（+从CivitAI下载）\n\n**描述：**  \n这与基础的“加载检查点”节点相同，但列表来自Civitai（而非本地文件夹）。  \n如果你的电脑上还没有该文件，它也会从Civitai下载。（你需要从你的账户获取API令牌——在civitai.com的设置中找到你的令牌。）  \n这是`flux_s`版本，它会将模型下载到：`ComfyUI\u002Fmodels\u002Fcheckpoints\u002FBjornulf_civitAI\u002Fflux_s`  \n下载完成后，你可以继续使用此节点来加载你的检查点，也可以从一个基础的“加载检查点”节点中使用已下载的模型。\n\n🚧 正在开发中，需要手动清理列表、diffusers等……？ 🚧\n\n#### 103 - 📥👑 加载Lora SD1.5（+从CivitAi下载）\n\n**描述：**  \n这与基础的“加载Lora”节点相同，但列表来自Civitai（而非本地文件夹）。  \n如果你的电脑上还没有该文件，它也会从Civitai下载。（你需要从你的账户获取API令牌——在civitai.com的设置中找到你的令牌。）  \n这是`sd_1.5`版本，它将把Lora下载到：`ComfyUI\u002Fmodels\u002Floras\u002FBjornulf_civitAI\u002Fsd_1.5`  \n下载完成后，你可以继续使用此节点来加载你的Lora，或者从一个基础的“加载Lora”节点中使用已下载的Lora。\n\n以下是使用Lora“Colorize”的示例：\n\n![civitai_lora_sd15](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9ab782b29d69.png)\n\n#### 104 - 📥👑 加载Lora SDXL（+从CivitAi下载）\n\n**描述：**  \n这与基础的“加载Lora”节点相同，但列表来自Civitai（而非本地文件夹）。  \n如果你的电脑上还没有该文件，它也会从Civitai下载。（你需要从你的账户获取API令牌——在civitai.com的设置中找到你的令牌。）  \n这是`sdxl_1.0`版本，它将把Lora下载到：`ComfyUI\u002Fmodels\u002Floras\u002FBjornulf_civitAI\u002Fsdxl_1.0`  \n下载完成后，你可以继续使用此节点来加载你的Lora，或者从一个基础的“加载Lora”节点中使用已下载的Lora。\n\n以下是使用Lora“Better faces”的示例：\n\n![civitai_lora_sdxl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d0a30275e3b9.png)\n\n#### 105 - 📥👑 加载Lora Pony（+从CivitAi下载）\n\n**描述：**  \n这与基础的“加载Lora”节点相同，但列表来自Civitai（而非本地文件夹）。  \n如果你的电脑上还没有该文件，它也会从Civitai下载。（你需要从你的账户获取API令牌——在civitai.com的设置中找到你的令牌。）  \n这是`pony`版本，它将把Lora下载到：`ComfyUI\u002Fmodels\u002Floras\u002FBjornulf_civitAI\u002Fpony`  \n下载完成后，你可以继续使用此节点来加载你的Lora，或者从一个基础的“加载Lora”节点中使用已下载的Lora。\n\n![civitai_lora_pony](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9b34b46db3ec.png)\n\n#### 106 - ☁🎨 API图像生成器（FalAI）🎨☁\n\n**描述：**  \n只需一个令牌即可生成图像。  \n这是`fal.ai`版本，生成的图像将保存在`ComfyUI\u002Foutput\u002FAPI\u002FCivitAI\u002F`目录下。\n\n![api falai](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1d561720c6a4.png)\n\n#### 107 - ☁🎨 API图像生成器（CivitAI）🎨☁\n\n**描述：**  \n只需一个令牌即可生成图像。  \n这是`civit.ai`版本，生成的图像将保存在`ComfyUI\u002Foutput\u002FAPI\u002FCivitAI\u002F`目录下。  \n⚠️ 注意：Civitai并不是最可靠的API，有时无法响应，或响应时间过长，某些urn也比其他urn更不可靠等……  \n请自行承担风险使用，我不建议使用他们的API运行任何“昂贵”的任务，比如Flux Ultra等。（建议改用带有蓝色buzz的网站。）  \n此类API请求（如本节点中的请求）会消耗黄色buzz。\n\n![api civitai](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_6f2c242960a8.png)\n\n#### 108 - ☁👑 添加Lora（仅限API - CivitAI）👑☁\n\n**描述：**  \n通过API使用Lora，以下是一个示例，清晰地展示了使用和不使用Lora时的差异。\n\n![api civitai lora](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3d1240160d01.png)\n\n#### 109 - ☁🎨 API图像生成器（Black Forest Labs - Flux）🎨☁\n\n**描述：**  \n使用Black Forest Labs的API生成一张图像。（flux）\n\n![api black forest](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_50d76ee1b88c.png)\n\n#### 110 - ☁🎨 API图像生成器（Stability - Stable Diffusion）🎨☁\n\n**描述：**  \n使用Stability的API生成一张图像。（sd3）\n\n![api stability](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e64f77671b95.png)\n\n#### 111 - ✨➜🔢 任意值转整数\n\n**描述：**\n\n只需将任意值转换为有效的整数。\n\n![任意值转整数](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a686b1e276ad.png)\n\n#### 112 - ✨➜🔢 任意值转浮点数\n\n**描述：**\n\n只需将任意值转换为有效的浮点数。\n\n![任意值转浮点数](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_789ee855983e.png)\n\n#### 113 - 📝🔪 文本按5份分割\n\n**描述：**\n\n接收单个输入，并将其按分隔符（默认为换行符）分割成5份。  \n如果使用“变量类型格式”，它还可以忽略`=`符号左侧的所有内容。\n\n![文本按5份分割](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_08e921c4da59.png)\n\n#### 114 - 📥👑 按路径加载Lora\n\n**描述：**\n\n通过指定路径加载Lora。\n\n![按路径加载Lora](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_501354fb6e83.png)\n\n这里有一个结合节点113、114和112的复杂实际示例：  \n![按路径加载Lora复杂示例](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_2b8fc6b8c099.png)\n\n#### 115 - 📥 从Bjornulf文件夹加载文本\n\n**描述：**\n\n只需从`Bjornulf\u002FText`文件夹中选择一个文件，即可恢复其内容。  \n它设计用于与节点15“保存文本”一起使用。\n\n![加载文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f77d7d52e23b.png)\n\n#### 116 - 📥 从路径加载文本\n\n**描述：**\n\n只需提供文件的路径，即可恢复其内容。\n\n![加载文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b0ea9dd9a2c7.png)\n\n如果你愿意，使用“从路径加载文本”也可以通过添加路径来恢复“Bjornulf\u002FText”中的内容：\n\n![加载文本](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7ce15b07e14c.png)\n\n#### 117 - 📝👈🅰️ 行选择器（🎲 或 ♻ 或 ♻📑）\n\n**描述：**\n\n从输入文本中选择一行。如果设置为0，则会随机选择一行。  \n如果随机选择的一行以`#`符号开头，则不会被选中。因此，如果你想跳过某一行，可以使用此功能。\n\n![行选择器](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5e2bf00d473e.png)\n\n❗ 0.76 - 新语法可用：  \n分组，无重复，例如：{left|right|middle|group=LMR}+{left|right|middle|group=LMR}+{left|right|middle|group=LMR}  \n基于百分比的随机：{A(80%)|B(15%)|C(5%)}  \n\n❗ 0.77 - 新语法可用：  \n2个{apple|orange|banana|static_group=FRUIT}s，左边一个{apple|orange|banana|static_group=FRUIT}, 右边一个{apple|orange|banana|static_group=FRUIT}\n\n#### 118 - 🔊 TTS配置⚙\n\n**描述：**\n\n一个新的可选配置节点，用于连接到TTS节点，它可以请求给定语言的扬声器列表，并在主TTS节点中替换：  \n- URL。  \n- 语言。  \n- 扬声器。  \n仅当你想用配置节点中的信息替换主TTS节点中的信息时，才进行连接。\n\n![tts config](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1094dc71d5b3.png)\n\n#### 119 - 📥👑 加载Hunyuan Video的Lora（+从CivitAi下载）\n\n**描述：**\n\n使用CivitAI的Lora来配合Hunyuan使用。（当然，NSFW列表不在github上。）\n\n以下工作流已包含：`workflows\u002FHUNYUAN_basic_lora.json`)：\n\n![hunyuan lora](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b5d52cac675a.png)\n\n#### 120 - 📝➜🔊 Kokoro - 文本转语音\n\n**描述：**\n\n❗ 0.76 - 由于与其他自定义节点存在一些兼容性问题，现在若要使用该节点，需要手动安装：`pip install kokoro_onnx`\n\n另一个基于Kokoro的文本转语音节点。: https:\u002F\u002Fgithub.com\u002Fthewh1teagle\u002Fkokoro-onnx  \n轻量级、更简单、无需配置，并且完全集成到Comfyui中。（无需运行外部后端。）\n\n![tts kokoro](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7e3741d2a634.png)\n\n#### 121 - 💾 Huggingface 下载器\n\n**描述：**  \n此节点允许您使用访问令牌直接从Huggingface下载模型\u002FVAE\u002FUNet等。\n\n![huggingface dl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f248f7dd93fb.png)\n\n#### 122 - 👑 合并LoRA，LoRA堆栈\n\n**描述：**  \n如果您希望在一个节点中同时使用多个LoRA，那么这就是您需要的节点。\n\n![Lora stack](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a08ce1c40316.png)\n\n#### 123 - 💾🅰️ 保存全局变量\n\n**描述：**  \n如果您知道如何在我的节点中使用变量，那么这个节点可以让您创建全局变量。  \n这个节点非常简单，它只会追加（或覆盖）文件：`Bjornulf\u002FGlobalVariables.txt`（如果您愿意，也可以手动编辑该文件。）\n\n![Global Save](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e11721b7ce6e.png)\n\n#### 124 - 📥🅰️ 加载全局变量\n\n**描述：**  \n此节点会从文件`Bjornulf\u002FGlobalVariables.txt`中加载全局变量文本。  \n以下是保存和加载的使用示例：\n\n![Global images](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_94122afe672c.png)\n\n#### 125 - 📝👈 模型-CLIP-VAE选择器（🎲 或 ♻ 或 ♻📑）\n\n**描述：**  \n如果您想使用和管理多个模型\u002FCLIP\u002FVAE，那么这就是通用的选择器节点。  \n您可以将它们以循环模式运行，随机选择一个，按顺序循环（每次运行工作流时依次使用一个），甚至可以选择特定的一个。\n\n![model clip vae selector](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_42a6428c6598.png)\n\n#### 126 - 📒 备注\n\n**描述：**  \n有时我想添加一个备注，但又希望这个备注与特定的连接线关联在一起。  \n因此，您可以使用此节点来记录某个特定连接的详细信息，它会随着连接线一起移动。  \n\n当然，您也可以随意使用它，下面是一个关于HunYuan视频生成的例子。（您可以根据想要运行的内容，快速切换与其他部分的工作流连接。）\n\n![note](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_79da375d3cdd.png)\n\n#### 127 - 🖼📒 图像备注\n\n**描述：**  \n您可以使用此节点来显示之前生成的一张图像以及一些自定义文本。（使用image_path或IMAGE类型。）  \n![Image note](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_009a4813d806.png)  \n\n您可以用文本展示生成该图像所使用的提示词，例如。  \n它的行为类似于“预览图像”节点。（如果您想要类似“加载图像”的行为，请参阅第130个节点。）\n\n有时我想要展示一张图像，以便直观地解释某件事的作用。（例如，一组LoRA叠加会有特定的风格。）  \n这里有一个复杂的例子，说明我是如何使用它的，用于展示一系列LoRA叠加效果。（然后我通过使用节点`125 - 模型-CLIP-VAE选择器`来“选择”一种风格。）\n\n**0.77** 在较新的Comfyui版本中，多行文本+图像现在成为了一个问题。已被单行备注取代，因为找不到干净的JavaScript方法来解决布局问题……  \n\n![Image note](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_30b9d047ffc3.png)\n\n#### 128 - 🖼👁 预览（第一）张图像\n\n**描述：**  \n此节点可以显示一张图像的预览……  \n- 但它也可以接收一组图像，并仅预览第一张图像。（这对于视频非常有用，它会提取第一帧。）  \n- 它还可以接受完整的图像路径作为输入。  \n- 但它同样可以接受视频路径作为输入，并从中提取第一帧。  \n在处理视频时进行测试时非常有用。  \n以下是刚才所述内容的可视化示例：\n\n![First image preview](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_10f43ac47b05.png)\n\n**0.77** 在较新的Comfyui版本中，多行文本+图像现在成为了一个问题。已被单行备注取代，因为找不到干净的JavaScript方法来解决布局问题……  \n\n#### 129 - 📌🅰️ 从文本设置变量\n\n**描述：**  \n此节点会快速将一段文本转换为另一种文本，这种文本可以被我的所有变量节点快速使用。  \n下面是一个使用“高级写文本”的例子，但您也可以将其用于其他所有节点，包括全局变量等。\n\n![text_to_variable](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_99d6b2b583cd.png)\n\n#### 130 - 📥🖼📒 图像备注（加载图像）\n\n**描述：**  \n此节点与第127个节点非常相似。但不同的是，它使用的是“加载图像”功能，而不是预览系统。  \n因此，如果您希望在启动工作流之前先进行一次“预览”，就可以使用此节点。  \n它的行为类似于“加载图像”节点。\n\n![Image note Load](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_355263b80a71.png)\n\n#### 131 - ✒👉 写作挑选链\n\n**描述：**  \n这是一个全新的“写文本”节点。  \n但有一点特别之处：您可以将这些节点相互连接起来，当您点击“PICK ME”按钮时，它会禁用链条中的其他所有“写文本”节点，只激活您点击的那个节点（该节点会变成绿色）。  \n因此，通过这个节点，您只需轻轻一按，就能在不同的提示词之间切换！  \n不限于一行，您还可以使用列表、变量等，但下面是一个简单的例子：\n\n![write pick me chain](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1b57e2124738.png)\n\n#### 132 - 📝🔪 文本分成10份\n\n**描述：**  \n与第113个节点相同，但这次是分成10份。  \n有一天我有6份，结果卡在了分成5份的节点上，所以我觉得有时候分成10份可能更有用，那就做一个分成10份的吧……\n\n![text split 10](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f47c38e0e0a2.png)\n\n#### 133 - 🖼👁 预览1-4张图像（比较）\n\n**描述：**  \n这是一个很酷的节点，您可以用来比较几张图像。  \n中间有一个光标，您只需点击图像即可将其移动到任何位置。  \n下面是一个例子，在这个尺寸\u002F分辨率下，25%的效果几乎与原始图像一样好。\n\n![four previews](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3c1c6690966f.png)\n\n这里是同一张图像的放大图：\n\n![four previews](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_3fac498d4dbc.png)\n\n#### 134 - 🔊▶ 播放音频\n\n**描述：**  \n此节点只会播放一声铃声。  \n例如，如果您的工作流需要一段时间才能完成，而您希望每次完成时都能收到提醒。\n\n![play_audio_1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_409c30a6255c.png)\n\n您可以连接一个自定义的音频文件路径：\n\n![play_audio_2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_d422b2dc7ce3.png)\n\n或者发送一个AUDIO类型的格式：\n\n![play_audio_3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_addda71f7d8f.png)\n\n#### 135 - 🔛✨ 任意开关开启\u002F关闭\n\n**描述：**  \n一个基本的开关，如果关闭则不会输出任何内容。  \n下面是一个与兼容的“合并图像节点”结合的例子，您可以看到顶部的图像被忽略了。\n\n![switch_anything](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f07a54c48b09.png)\n\n#### 136 - 🔛📝 文本开关开启\u002F关闭\n\n**描述：**\n\n是否厌倦了暂时断开不需要的节点？  \n也许你正在处理某个输入，但你的工作流尚未准备好接收它？  \n现在你可以快速启用或禁用它。（禁用时，节点会显示为红色。）\n\n![switch_text](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_efedd657e276.png)  \n\n如果与我的文本合并节点连接，你可以使用一个特殊选项 `ONLY_ME_combine_text`，它会指示文本合并节点仅输出被选中的节点内容，而忽略其他所有节点。（此时该节点会显示为蓝色。）：\n\n![switch_text_onlyme](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_80257a7b3cd8.png)  \n\n#### 137 - 🌎🎲 全局种子管理器\n\n**描述：**\n\n种子管理器。  \n它的功能包括：\n- 每次运行时生成一个随机种子。\n- 返回当前种子作为字符串，供其他支持字符串格式的节点使用。\n- 返回上一次使用的种子值。\n- 将所有已使用的种子保存到文件中（可通过按钮重置）。\n若想从该列表中选择种子，请使用节点 138。\n\n![global_seed_manager](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_515f3e20f540.png)  \n\n#### 138 - 📑👈 从列表中选择\n\n**描述：**\n\n快速从列表中选择一个元素。（默认情况下，列表是以分号分隔的字符串。）\n例如：a;b;c;d\n\n以下示例展示了如何快速选择全局种子管理器所使用的第三个种子：\n\n![select_from_list](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_82987da2df39.png)  \n\n#### 139 - 🎲 随机整数\n\n**描述：**\n\n简单地返回两个指定值之间的整数。\n\n![random_int](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_5f3b650d04b6.png)  \n\n#### 140 - 🎲 随机浮点数\n\n**描述：**\n\n简单地返回两个指定值之间的浮点数。\n\n![random_float](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_31a4ff9721ab.png)  \n\n#### 141 - 🌎✒👉 全局 Pick Me 写入\n\n**描述：**\n\n你喜欢使用 Pick Me 链式节点吗？  \n这个节点使用标识符（global_pickme_id）而非连接线来实现节点间的自动连接。只需为每个节点设置相同的 global_pickme_id，具有相同 ID 的节点就会自动相互连接。\n\n以下是写入与加载的示例：\n\n![global_write_pickme_load](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df663fac1ccb.png)  \n\n#### 142 - 🌎📥 全局 Pick Me 加载\n\n**描述：**\n\n用于从全局 Pick Me 写入节点中恢复值的节点。  \n它会返回当前选定 global_pickme_id 对应的值。  \n此外，该节点还会自动从具有相同 global_pickme_id 的列表中随机返回一个值。\n\n以下是写入与加载的示例：\n\n![global_write_pickme_load](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_df663fac1ccb.png)  \n\n#### 143 - 🧮 基础数学\n\n**描述：**\n\n基础数学节点，可用于加法、乘法等运算。  \n以下示例是我用来检测某段视频相对于另一段视频“缺失”帧数的方法：\n\n![basic math](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_a1962ff7e640.png)  \n\n#### 144 - 📊🔍 文本分析器\n\n**描述：**\n\n显示输入文本的详细信息。  \n你可以仅用它来获取字符数量，然后利用该数字避免提示过长导致内存溢出（OOM）：\n\n![text_ana_1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4bc03ec523d7.png)  \n\n或者提取更多关于对话及其情感极性的细节。（例如，为正面、中性或负面情绪选择特定的 TTS 音色）：\n\n![text_ana_2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ac39bc40c55a.png)  \n\n#### 145 - 🔊▶ 音频预览（音频播放器）\n\n**描述：**\n\n一个简单的音频预览节点，可接受音频路径、MP3 或 WAV 格式的输入。\n\n![audio_preview](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_4a2c46544f24.png)  \n\n#### 146 - 🖼📹🔪 图像\u002F视频网格拆分\n\n**描述：**\n\n此节点会将图像或视频网格拆分为单独的图像或视频。\n\n以下是一个包含 6 张图片的网格示例，它会将其拆分为 6 张独立的图片（3 行 × 3 列）：\n\n![split_grid](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_f2d38e7fd8fb.png)  \n\n我为什么需要这个节点呢？有时一张图片或视频中会包含多个角色。  \n当我需要对某个角色应用口型同步时，就需要先将其拆分为单独的角色图像或视频，完成口型同步后再用节点 147 重新组合起来。  \n或者仅仅是为了节省显存，只处理图像中所需的部分。\n\n#### 147 - 🖼📹🔨 图像\u002F视频网格重组\n\n**描述：**\n\n将之前由节点 146 拆分的图像或视频网格重新组合成完整的图像或视频。  \n输入时需指定与拆分时相同的网格尺寸。  \n\n你可以对网格中的特定部分进行修改，然后再重新组合。  \n你可以单独选择每一部分，但还有一个“特殊”的部分，即“已修改”的部分。  \n这部分通过 MODIFIED_part 和 MODIFIED_part_index 来选择（part number，如果 index 设置为 2，则会使用 `part_2`）。  \n\n以下是一个修改 part_2 并重新组合的示例。（没有直接使用 part_2 的输出，而是通过将 MODIFIED_part_index 设置为 2 来选择 part_2）：  \n你也可以直接操作 part_2，但采用这种设置可以快速切换不同部分，而无需更改节点布局。\n\n![grid_assemble1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_748045155164.png)  \n\n以下是一个展示如何手动影响不同部分的示例。（这里我只是将 part_1 替换掉 part 7、8、9。）\n\n![grid_assemble2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_100ee304d304.png)  \n\n对于视频的重组可能会更复杂。  \n例如，如果你使用了节点 `52 - 🔊📹 音频视频同步`，那么修改后的部分可能会变短或变长，帧率也可能发生变化等。  \n如果修改后总时长发生了变化，你可以尝试重新同步所有部分。  \n在这种情况下，你需要使用 `reference_video_part_index` 来选择参考视频部分。（很可能与 MODIFIED_part_index 相同。）\n\n![](screenshots\u002F.png)  \n\n#### 148 - 💾🔊 保存音频（tmp_api.wav\u002Fmp3）⚠️💣\n\n**描述：**\n\n用于临时保存音频文件，格式为 MP3 或 WAV。  \n在多个 ComfyUI 实例之间通过 API 调用同步数据时非常有用。（我的 API 节点会在后台使用此节点，例如节点 157 `🔮⚡ 执行工作流`，用于交换音频文件——原始或处理后的——）  \n\n你可以发送音频路径（这将创建文件 `tmp_api.mp3`）：\n\n![savetmp_audio1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_387c924a8b11.png)  \n\n或者直接发送 AUDIO 类型的数据（这将创建文件 `tmp_api.wav`）：\n\n![savetmp_audio2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c196aa9e9a42.png)  \n\n需要注意的是，如果你发送的是 AUDIO 类型的数据，此节点会将其保存为 WAV 文件。（即使你选择的是 MP3 文件。）\n\n#### 149 - 💾📹 保存视频（tmp_api.mp4\u002Fmkv\u002Fwebm）⚠️💣\n\n**描述：**\n\n用于临时保存视频文件，格式为 MP4、MKV 或 WEBM。  \n在多个 ComfyUI 实例之间通过 API 调用同步数据时非常有用。（我的 API 节点会在后台使用此节点，例如节点 157 `🔮⚡ 执行工作流`，用于交换视频文件——原始或处理后的——）  \n\n![savetmp_video](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_9397d845f1e7.png)  \n\n#### 150 - 🎨📜 风格选择器（🎲 或 ♻ 或 ♻📑）+ Civitai urn\n\n**描述：**\n\n一个新的通用风格选择节点。  \n同时包含一些关于 Civitai urn 的信息。（需要进一步测试，并建立更好的优质、快速模型数据库，建议您手动提交自己喜欢的 urn。）\n\n以下是一个结合 CivitAI API 节点使用的示例：\n\n![style_gen_1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_22a4a9d59c87.png)\n\n以下是一个使用模型 urns 的稍微复杂一些的例子：\n\n![style_gen_2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_0bed4faa13c5.png)  \n\n注意：CivitAI 可能会特别慢！！因此，您可以使用 DO_NOT_WAIT 选项，并配合一个可选的“links_file”。  \n它会创建一个包含链接的文件，以便稍后通过节点 151 恢复生成的图像。  \n这样您就可以发出任意数量的请求，然后在稍后的某个时间点使用该文本文件来恢复图像。  \n\n请注意，您也可以直接发送包含所有值的 LIST。  \n\n![style_gen_3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_7138f260a507.png)  \n\n如果您这样做，稍后可以将这些值作为文本恢复，并使用节点 151 的“autosave”选项。  \n它会根据风格创建相应的文件夹。例如，从上图中可以看到：`.\u002FComfyUI\u002Foutput\u002Fcivitai_autosave\u002FCinematic_photography\u002F`  \n如果将节点 150 用作循环（LOOP），这将非常有用，因为您可以稍后恢复图像，并自动按照所选风格将它们整理到不同的文件夹中。  \n\n#### 151 - 📥🕑🤖 加载 CivitAI 链接\n\n**描述：**  \n\n此节点必须在使用节点 150 + DO_NOT_WAIT + links_file 之后使用。  \n当您从节点 150 中保存 DO_NOT_WAIT 和“links_file”时，它会在“ComfyUI\u002FBjornulf\u002Fcivitai_links\u002F”目录下创建一个文本文件，您可以使用此节点加载这些链接。  \n\n以下是来自“11_mars.txt”文件的已恢复图像：  \n\n![load_civit](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_b27c180690b5.png)  \n\n如果您在节点 150 中使用了 `LIST_from_style_selector`，则稍后可以恢复这些值，并使用节点 151 的“autosave”选项。  \n它会根据风格创建相应的文件夹。例如，从上图中可以看到：`.\u002FComfyUI\u002Foutput\u002Fcivitai_autosave\u002FCinematic_photography\u002F`  \n如果将节点 150 用作循环（LOOP），这将非常有用，因为您可以稍后恢复图像，并自动按照所选风格将它们整理到不同的文件夹中。  \n\n#### 152 - [即将推出] 💾 保存张量 (tmp_api.pt) ⚠️💣\n\n**描述：**  \n\n此功能处于 BETA 阶段，它会将张量保存到文件中。  \n其目的是通过将张量保存到文件来优化显存使用。  \n\n#### 153 - [即将推出] 📥 加载张量 (tmp_api.pt)\n\n**描述：**  \n\n此功能处于 BETA 阶段，它会加载一个张量。  \n其目的是通过将张量保存到文件来优化显存使用。  \n\n#### 154 - 🔮 远程 VAE 解码器\n\n**描述：**  \n\n这是一个简单的节点，用于从远程机器解码 VAE 模型。  \n\nVAE 解码节点不必位于同一台机器上，因此如果您有一台远程机器并希望节省显存，就可以使用此节点。  \n远程机器也需要安装我的自定义节点。  \n\n![remote_vae](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ef35460c021e.png)  \n\n#### 155 - [即将推出] 🔮 远程 VAE 解码器（分块版）\n\n**描述：**  \n\n与 154 相同，但采用分块版本。  \n\n![remote_vae_tiled](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e663c9d8ff30.png)  \n\n#### 156 - [即将推出] 📥🔮 从 Base64 加载\n\n**描述：**  \n\n此功能处于 BETA 阶段，用于在不同 Comfyui 实例之间恢复某些值。  \n\n#### 157 - [即将推出] 🔮⚡ 远程执行工作流\n\n**描述：**  \n\n这是复杂新环境的开端，目前仍处于 BETA 阶段。  \n此节点的目标是在另一台 Comfyui 设备上运行工作流，并恢复生成的内容。  \n目前支持图像、声音和视频。  \n\n它可以完成任何常规工作流所能完成的任务。  \n例如，创建图像、制作视频、放大图像等。  \n\n请继续关注更多信息……正在开发中……  \n\n基本上就是可以在另一台机器上运行高负载的工作流，并恢复结果。  \n以下是一个我在另一台 Comfyui 设备上运行的唇形同步工作流示例。（目前仅限本地网络，但未来也会在 RunPod 上运行。）  \n我使用笔记本电脑（192.168.1.23）来接收来自我的“AI专用”台式机（192.168.1.100）的结果：  \n\n![execute_worflow](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_fd5f0afc20e7.png)  \n\n#### 158 - [即将推出] 📥🔮📝 文本管理 API（执行工作流）\n\n**描述：**  \n\n此功能处于 BETA 阶段。  \n此节点需要用于创建可与节点 157 配合使用的功能性工作流。  \n它会从另一个 Comfyui 实例与节点 157 进行通信。  \n\n#### 159 - [即将推出] 🔥📝📹 视频文本生成器 📹📝🔥\n\n**描述：**  \n\n此功能处于 BETA 阶段。  \n这是一个新的节点的开始，它将生成视频提示词。  \n其目标是类似于“文本生成器”节点，但针对视频。  \n原来的“文本生成器”主节点 81 现已被重命名为仅用于图像的节点：🔥📝🖼 图像文本生成器 🖼📝🔥。  \n\n![video_text_generator](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_c227670f034a.png)  \n\n#### 160 - 🦙👁 Ollama 视觉提示选择器\n\n**描述：**  \nOllama 视觉的新布局提示选择器。  \nOllama 视觉现在被分为两个独立的节点。  \n\n![ollama vision prompt](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_97bad0b277ee.png) \n\n#### 161 - [即将推出] 🔧🧑 修复人脸\n\n**描述：**  \n\n此功能处于 BETA 阶段。  \n这是“修复图像”系列节点中的第一个。  \n可以快速修复、控制和编辑人脸（以及其他内容）。  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_91f1462ebc9d.png)  \n\n以下是其放大图：  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_fe578b6fc9ba.png)  \n\n您还可以为每张脸提供特定的文本和自定义去噪设置：  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_ad839286bafc.png)  \n\n您还可以选择特定的脸部区域；如果设置为 0，则会对所有脸部进行处理，而下面我将其设置为 1：  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_e9acce3f4643.png)  \n\n此节点也可以修复整个人物，但我可能会在稍后为此单独创建一个节点：  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1d6c87aa0147.png)  \n\n您可以通过我的预览图像节点很好地查看节点的效果。在这里，您可以清楚地看到被检测到的“人物”白色框：  \n![fix_face](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_15c5f253e3aa.png)  \n\n未来，我计划构建一个系统，用于“注入”特定的可重复使用角色，可能与 LoRA 或类似技术相关联。  \n\n#### 162 - [即将推出] 🧑 人脸设置 [修复人脸] ⚙\n\n**描述：**  \n与“修复人脸”节点连接，用于修改特定的脸部。  \n\n#### 163 - ☁🎨 API 图像生成器 (openai, gpt-image-1)\n\n**描述：**  \n使用 GPT-Image-1 API 创建图像。  \n\n![gpt 4 image](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_readme_1ee6e807226b.jpg)","# Bjornulf_custom_nodes 快速上手指南\n\nBjornulf_custom_nodes 是 ComfyUI 的一个大型自定义节点包，包含超过 170 个功能节点。它专注于文本处理、图像\u002F视频编辑、循环控制、随机化生成以及外部 AI 工具（如 Ollama）的集成，非常适合构建复杂的自动化工作流和角色生成流程。\n\n> ⚠️ **注意**：该项目处于非常活跃的开发阶段（Work in Progress），功能更新频繁。\n\n## 环境准备\n\n在开始之前，请确保满足以下系统要求：\n\n*   **操作系统**：Windows, Linux, 或 macOS\n*   **核心依赖**：已安装并配置好 **ComfyUI**。\n*   **Python 版本**：建议与您的 ComfyUI 环境保持一致（通常为 Python 3.10+）。\n*   **网络环境**：部分节点涉及外部 API（如 CivitAI, FalAI, Ollama），请确保网络通畅。若使用国内网络，建议配置代理或使用国内镜像源加速模型下载。\n\n## 安装步骤\n\n推荐使用 **ComfyUI Manager** 进行安装，这是最简便且能自动处理依赖的方式。\n\n### 方法一：通过 ComfyUI Manager 安装（推荐）\n\n1.  启动 ComfyUI，点击右侧菜单中的 **\"Manager\"** 按钮。\n2.  选择 **\"Install Custom Nodes\"**。\n3.  在搜索框中输入 `Bjornulf`。\n4.  找到 **`Bjornulf_custom_nodes`**，点击 **\"Install\"**。\n5.  安装完成后，**重启 ComfyUI** 以加载新节点。\n\n### 方法二：手动安装\n\n如果无法使用 Manager，可通过命令行手动克隆仓库：\n\n```bash\n# 进入 ComfyUI 的 custom_nodes 目录\ncd \u002Fpath\u002Fto\u002FComfyUI\u002Fcustom_nodes\n\n# 克隆仓库\ngit clone https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes.git\n\n# 进入插件目录并安装依赖\ncd Bjornulf_custom_nodes\npip install -r requirements.txt\n```\n\n*注：国内用户若克隆速度慢，可尝试使用 Gitee 镜像（如有）或配置 git 代理。*\n\n## 基本使用\n\n安装重启后，您可以在 ComfyUI 的节点菜单中找到 `Bjornulf` 分类。以下是三个最常用的基础场景示例：\n\n### 1. 文本显示与调试 (Display)\n用于在工作流中查看中间生成的文本、数字或 JSON 数据，方便调试。\n\n*   **节点路径**：`Bjornulf` > `Display and Show` > `👁 Show (String\u002FText)`\n*   **使用方法**：\n    1.  添加该节点。\n    2.  将任意文本输出（如 Prompt 生成器的输出）连接到节点的输入端。\n    3.  节点界面会直接显示当前的文本内容。\n\n### 2. 高级文本写入与随机化 (Text & Randomization)\n快速生成带有随机种子的提示词，或从列表中随机抽取一行文本。\n\n*   **节点路径**：\n    *   写入：`Bjornulf` > `Text` > `✒🗔🅰️ Advanced Write Text`\n    *   随机行：`Bjornulf` > `Text` > `🎲 Random line from input`\n*   **使用方法**：\n    1.  使用 `Advanced Write Text` 输入基础提示词，勾选 \"random option\" 可启用随机种子。\n    2.  或者，连接一个多行文本输入到 `Random line from input`，每次运行工作流时会自动选取其中一行。\n\n### 3. 循环生成 (Loop)\n批量处理图片、模型或提示词，无需手动重复连接节点。\n\n*   **节点路径**：`Bjornulf` > `Loop` > `♻ Loop` (或特定类型的 Loop 节点，如 `♻ Loop Images`)\n*   **使用方法**：\n    1.  准备一个列表输入（例如多个提示词或多张图片）。\n    2.  连接到 `♻ Loop` 节点。\n    3.  在循环体内放置您的生成逻辑（如 KSampler）。\n    4.  工作流将自动遍历列表中的每一项并执行生成。\n\n### 特色功能提示\n*   **角色生成**：直接使用 `Text Generator` 分类下的节点（如 `Character Female`, `Scene`, `Style`）可一键生成结构化的人物和场景描述。\n*   **外部集成**：若本地部署了 Ollama，可使用 `Ollama Vision` 节点进行图像理解；也可通过 `API Image Generator` 节点调用 FalAI 或 CivitAI 的云端算力。","一位独立游戏开发者正在利用 ComfyUI 批量生成数百个具有独特背景故事和外观的 NPC 角色，以填充其开放世界游戏的世界观。\n\n### 没有 Bjornulf_custom_nodes 时\n- **工作流断裂**：需要在外部文本编辑器手动编写角色描述，再复制粘贴到 ComfyUI，无法在节点图中直接编辑或预览文本内容。\n- **随机性难以控制**：缺乏原生的高级随机化工具，难以从预设列表中灵活抽取不同的性格特征或名字，导致生成的角色千篇一律。\n- **逻辑判断缺失**：无法根据性别或职业自动切换提示词（Prompt），必须为男性和女性角色分别搭建两套独立的复杂工作流。\n- **调试效率低下**：中间生成的文本变量无法直观显示，排查提示词错误时需要反复运行整个流程并查看后台日志。\n\n### 使用 Bjornulf_custom_nodes 后\n- **全流程可视化**：利用 `Advanced Write Text` 和 `Show (String\u002FText)` 节点，直接在画布上编写、修改并实时预览角色剧本，无需跳出界面。\n- **智能内容混合**：通过 `Random line from input` 和 `Text scrambler` 节点，轻松从列表中提取随机姓名与特质，瞬间组合出千变万化的角色设定。\n- **动态逻辑分支**：借助 `Text Switch On\u002FOff` 和条件判断节点，单条工作流即可根据随机生成的性别自动切换对应的身体描述提示词，大幅简化结构。\n- **即时调试反馈**：使用 `Note` 和各类预览节点随时监控数据流向，快速定位文本拼接错误，将迭代测试时间从小时级缩短至分钟级。\n\nBjornulf_custom_nodes 通过将文本处理、逻辑控制与随机化能力深度融入 ComfyUI，让大规模、高多样性的自动化内容生产变得简单且可控。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FjustUmen_Bjornulf_custom_nodes_6cad461b.jpg","justUmen","justUmen \u002F Bjornulf","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002FjustUmen_4c3c4043.jpg","2025 : Tidying up all my repositories and gradually releasing all my personal projects. Big clean-up. 😁\r\nSorry if you are looking for old projects. 🤕",null,"bjornulf4ever@gmail.com","https:\u002F\u002Fgithub.com\u002FjustUmen",[81,85],{"name":82,"color":83,"percentage":84},"Python","#3572A5",82.4,{"name":86,"color":87,"percentage":88},"JavaScript","#f1e05a",17.6,524,56,"2026-04-14T17:24:57","未说明",{"notes":94,"python":92,"dependencies":95},"该工具是 ComfyUI 的自定义节点集合（插件），并非独立运行的应用程序，因此其运行环境完全依赖于宿主软件 ComfyUI 的配置。支持的功能包括文本处理、图像编辑、循环操作、随机化生成以及调用外部 AI 工具（如 Ollama、FalAI、CivitAI API 等）。若使用集成的 Ollama 视觉功能或云端 API 生成功能，需分别配置本地 Ollama 服务或对应的 API 密钥。由于处于活跃开发阶段（v1.1.8），功能可能频繁更新。",[28],[15],[98,99],"comfyui","comfyui-nodes","2026-03-27T02:49:30.150509","2026-04-18T22:45:07.260098",[103,108,113,118,123,128,133],{"id":104,"question_zh":105,"answer_zh":106,"source_url":107},40595,"安装时遇到 'pkgutil' 模块缺少 'ImpImporter' 属性的错误怎么办？","该错误通常发生在较新版本的 Python 环境中。维护者已在 v0.77 版本中修复了此问题。请通过 ComfyUI Manager 将插件更新至最新版本（0.77 或更高），即可解决无法导入模块的问题。","https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes\u002Fissues\u002F29",{"id":109,"question_zh":110,"answer_zh":111,"source_url":112},40596,"更新插件后出现 '[Errno 17] File exists (os.symlink)' 错误导致节点无法加载，如何解决？","这是由于旧版本的符号链接文件冲突导致的。维护者已在 v0.75 版本中优化了符号链接的创建逻辑，避免了重复创建引发的错误。请将插件更新至 v0.75 或更高版本，重启 ComfyUI 后即可正常加载循环节点等功能。","https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes\u002Fissues\u002F23",{"id":114,"question_zh":115,"answer_zh":116,"source_url":117},40597,"使用 TextReplace 节点时报告 'IS_CHANGED() got an unexpected keyword argument' 错误","这是一个版本兼容性问题。请确保安装的是最新的夜间构建版（Nightly build，如 v0.76.0 或更高）。更新后，无论是简单的文本替换还是正则表达式替换，该节点均可正常工作。如果更新后仍报错，请检查工作流连接是否正确（例如末端是否需要连接 Show Text 节点以验证输出）。","https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes\u002Fissues\u002F25",{"id":119,"question_zh":120,"answer_zh":121,"source_url":122},40598,"Ollama 相关节点导致 ComfyUI 页面加载缓慢或报错 'Error fetching models' 怎么办？","早期版本会在页面加载时自动请求模型列表，导致延迟。维护者在 v0.56 版本中移除了自动获取行为。更新后，`selected_model`（选择模型）和 `ollama_url`（Ollama 地址）均需手动在节点中输入，不再自动抓取，从而显著提升页面加载速度并避免连接错误。","https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes\u002Fissues\u002F9",{"id":124,"question_zh":125,"answer_zh":126,"source_url":127},40599,"STT (语音转文字) 节点输出的转录结果重复了两遍，如何修复？","该问题可能与音频通道设置有关。虽然维护者尝试过修复，但用户反馈在某些情况下仍需手动处理。建议在工作流中 STT 节点之前添加一个“立体声转单声道”（Stereo to Mono）转换节点，确保输入音频为单声道格式，这通常能解决转录重复的问题。","https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes\u002Fissues\u002F20",{"id":129,"question_zh":130,"answer_zh":131,"source_url":132},40600,"如何在 ComfyUI 中更好地使用 DeepSeek 等带有思维链（Think tag）输出的模型？","针对 DeepSeek 等模型输出中包含 `\u003Cthink>...\u003C\u002Fthink>` 标签的情况，用户可以结合使用插件中的“文本替换”（Text Replace）节点。通过配置正则表达式，可以识别并移除 `\u003Cthink>` 标签及其内容，只保留最终的回答部分，从而净化输出结果。","https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes\u002Fissues\u002F17",{"id":134,"question_zh":135,"answer_zh":136,"source_url":137},40601,"安装插件时遇到 numpy 版本冲突（Kokoro\u002Fultralytics 要求不同版本）怎么办？","这是由于不同依赖包对 numpy 版本要求不一致导致的。维护者建议在遇到此类环境冲突时，优先尝试更新插件到最新版本，因为新版本通常会调整依赖兼容性。如果问题依旧，可能需要手动调整虚拟环境中的 numpy 版本，或者等待维护者在后续版本（如提及的包含更多节点的版本）中进一步优化依赖管理。","https:\u002F\u002Fgithub.com\u002FjustUmen\u002FBjornulf_custom_nodes\u002Fissues\u002F24",[]]