<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Open WebUI on 鬼哥的空间</title><link>https://guige.ai/tags/open-webui/</link><description>Recent content in Open WebUI on 鬼哥的空间</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 05 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://guige.ai/tags/open-webui/index.xml" rel="self" type="application/rss+xml"/><item><title>口播视频的 API 账单有点贵，鬼哥把 Mac mini 和 4090 接成了一间 AI 演播室</title><link>https://guige.ai/p/local-talking-studio/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/local-talking-studio/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post 口播视频的 API 账单有点贵，鬼哥把 Mac mini 和 4090 接成了一间 AI 演播室" /&gt;&lt;p&gt;做一个 AI 口播视频，最容易上头的时刻，是人物第一次开口。最容易冷静下来的时刻，是你想改一句文案，再生成一遍。&lt;/p&gt;
&lt;p&gt;鬼哥之前做了一套真人口播的 skill：给它人物照片、声音样本和文案，让 MiniMax 克隆声音、生成配音，再交给 HeyGen 做照片驱动的口播视频。先看短预览，满意了再出正式版，素材、任务和成品都能留档。&lt;/p&gt;
&lt;p&gt;流程顺了，另一个问题也顺着来了：创作很少一遍就满意。文案要改，语气要调，照片要换，预览看完又想试另一版。让 agent 来回编排会消耗 token，语音和视频服务还有各自的计费方式。&lt;strong&gt;省下了操作时间，试错仍然要付钱。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;鬼哥看了看桌上的 M6 Mac mini，又看了看自己的 4090：东西都买了，总得让它们多干点活。于是有了这间本地 AI 演播室——Qwen 管声音和人物图，MiniMax H3 管声画视频，Open WebUI 把它们接到同一个页面，字幕最后在 Mac 上收尾。&lt;/p&gt;
&lt;p&gt;先看结果。下面是 Diana 介绍 DI CLI 的带字幕口播，约 12 秒，视频由 4090 上的 H3 生成。&lt;/p&gt;
&lt;video controls playsinline preload="none" poster="diana-poster.webp" style="width:100%;max-width:512px;height:auto;border-radius:12px;"&gt;
 &lt;source src="diana-talk.mp4" type="video/mp4"&gt;
 你的浏览器不支持内嵌视频，可以&lt;a href="diana-talk.mp4"&gt;下载 Diana 口播视频&lt;/a&gt;观看。
&lt;/video&gt;
&lt;p&gt;&lt;a class="link" href="diana-talk.mp4" &gt;下载 Diana 口播视频&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这回再想让她换一句台词，本地生成链路不用先看云端 API 余额。当然，机器、电费和折腾时间都有成本；这里的“免费”，说的是不再为每次本地推理付云端调用费。模型许可也得另看，尤其不能把免费试验直接理解成无条件商用。&lt;/p&gt;
&lt;h2 id="两台机器终于不用挤同一张床"&gt;两台机器，终于不用挤同一张床
&lt;/h2&gt;&lt;p&gt;在&lt;a class="link" href="https://guige.ai/p/mac-mini-ai-workstation/" &gt;之前那篇 Mac mini 工作站文章&lt;/a&gt;里，鬼哥已经让 32G 的小盒子能聊天、能画图了。麻烦是两个大模型留在内存里不走，最后只好安排它们轮流上场。&lt;/p&gt;
&lt;p&gt;现在要加配音和视频，继续把所有活塞给 Mac，排队就更长了。这次分工干脆一点：Mac mini 留在桌面上当工作台，做语音和字幕；图像、视频这些重活，交给 Ubuntu 上的 4090。&lt;/p&gt;
&lt;img src="mac-mini-photo.webp" alt="鬼哥的 M6 Mac mini，负责工作台、本地配音和字幕处理" style="width:360px;max-width:100%;margin:24px auto;"&gt;
&lt;p&gt;Mac 上的主角是 Open WebUI 和独立的 &lt;code&gt;local-tts&lt;/code&gt; 服务。Open WebUI 保存音色、人物、文案和任务记录，调用模型的动作发生在它的后端。&lt;code&gt;local-tts&lt;/code&gt; 用 MLX / Metal 跑 Qwen3-TTS，也提供本地 Whisper 转写。字幕另有独立环境，走 CPU，把统一内存和 GPU 的余量留给语音。&lt;/p&gt;
&lt;p&gt;&lt;img alt="负责 Qwen Image 和 H3 视频推理的 4090 主机，复用鬼哥此前的实拍照片" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1200" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/4090-photo.webp" srcset="https://guige.ai/p/local-talking-studio/4090-photo_hu_edb61d0e495f5eb9.webp 800w, https://guige.ai/p/local-talking-studio/4090-photo.webp 1600w" width="1600"&gt;&lt;/p&gt;
&lt;p&gt;4090 那边跑两个服务：Qwen-Image-2.1 图像 API，和 MiniMax H3 视频 API。底下各有自己的推理环境，避免把语音、图像、视频的 Python 依赖煮成一锅粥。&lt;/p&gt;
&lt;p&gt;先说个容易看漏的规格：鬼哥这张卡是 &lt;strong&gt;48GB 显存的 4090&lt;/strong&gt;，主机有 64GB 内存。普通 24GB 4090 能不能照搬，得按模型、量化和工作流重新算，不能只认“4090”这三个数字。&lt;/p&gt;
&lt;p&gt;这样一分，Mac 不用为了画一张人物图先把自己的声音服务挤走；4090 也不用承担网页、音色库和字幕编辑。哪台机器擅长哪件事，就让它干哪件事。&lt;/p&gt;
&lt;h2 id="audio-studio名字还是音频里面已经能拍视频了"&gt;&lt;code&gt;/audio-studio&lt;/code&gt;：名字还是音频，里面已经能拍视频了
&lt;/h2&gt;&lt;p&gt;浏览器打开 &lt;code&gt;http://localhost:8080/audio-studio&lt;/code&gt;，进入的是“视频语音工作台”。这里是鬼哥在本地 Open WebUI 源码上扩展的页面，装一个上游原版不会自动长出这些功能。&lt;/p&gt;
&lt;h3 id="先看整套架构页面在-mac重活在-4090"&gt;先看整套架构：页面在 Mac，重活在 4090
&lt;/h3&gt;&lt;p&gt;先把页面后面的关系看清楚，后面每点一个按钮，就知道是哪台机器在干活。浏览器只访问 Mac 上的 Open WebUI；配音交给本机 Qwen3-TTS，人物图和口播视频通过两条 SSH 隧道交给 4090，成片返回 Mac，再生成和烧录字幕。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mac mini、4090、Open WebUI、语音、图像、视频与字幕服务架构" class="gallery-image" data-flex-basis="384px" data-flex-grow="160" height="1500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/service-architecture.webp" srcset="https://guige.ai/p/local-talking-studio/service-architecture_hu_6d7f19e3412944e.webp 800w, https://guige.ai/p/local-talking-studio/service-architecture_hu_7545d708d67c1d3b.webp 1600w, https://guige.ai/p/local-talking-studio/service-architecture.webp 2400w" width="2400"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="diagram/service-architecture.svg" &gt;打开可放大的 SVG 架构图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;登录、素材归属、任务历史和下载由 WebUI 后端管理，浏览器不会直接去访问无用户鉴权的模型服务。拿 Diana 来说，人物图和声音可以分别准备、保存；生成视频时再把选中的两份素材交给 H3。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工作台要做的事&lt;/th&gt;
 &lt;th&gt;Mac 后端访问的地址&lt;/th&gt;
 &lt;th&gt;真正干活的位置与接口&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;预设配音、克隆与声音设计&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;127.0.0.1:8091&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Mac local-tts：&lt;code&gt;/v1/audio/speech&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;音色管理、录音转写&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;127.0.0.1:8091&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Mac local-tts：&lt;code&gt;/v1/audio/voices&lt;/code&gt;、&lt;code&gt;/v1/audio/transcriptions&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Qwen 生图、参考图编辑&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;127.0.0.1:28093&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SSH 转发到 4090 的 &lt;code&gt;8093&lt;/code&gt;：&lt;code&gt;/v1/images/generations&lt;/code&gt;、&lt;code&gt;/v1/images/edits&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;H3 素材与视频任务&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;127.0.0.1:28092&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SSH 转发到 4090 的 &lt;code&gt;8092&lt;/code&gt;：&lt;code&gt;/v1/video/assets&lt;/code&gt;、&lt;code&gt;/v1/video/jobs&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;字幕识别、对齐与烧录&lt;/td&gt;
 &lt;td&gt;WebUI 内部调用独立进程&lt;/td&gt;
 &lt;td&gt;Mac CPU：stable-ts / Whisper + FFmpeg / libass&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两条隧道让后端像访问本机一样访问远端 API。远端服务继续只监听回环地址，Mac 本地转发口也绑定回环；图像 API 另外有 Bearer 密钥，由 WebUI 后端保存。当前机器用 launchd 保持隧道并自动重连。&lt;/p&gt;
&lt;h3 id="从音色和人物开始再让她开口"&gt;从音色和人物开始，再让她开口
&lt;/h3&gt;&lt;p&gt;当前导航有音色库、人物库、生成播报、生成视频，管理员还会看到生成图像。把它们放在一起，是因为做 Diana 这样的角色，最常重复使用的其实是她的脸和声音。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;音色库先解决“谁来说”。&lt;/strong&gt; 可以用 Serena 等九种预设音色，也可以上传录音，或用麦克风录制。参考录音支持 1–120 秒，参考原文可选；不想手工抄，就调用本地 Whisper 识别，再校对。音色可以命名、试听、编辑和删除，替换录音会留下新版本，已经排队的任务仍能找到自己那一份素材。&lt;/p&gt;
&lt;p&gt;&lt;img alt="音色库实截：左侧上传参考录音、填写原文，右侧按分类选择和试听预设音色" class="gallery-image" data-flex-basis="339px" data-flex-grow="141" height="1484" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-voice-library.webp" srcset="https://guige.ai/p/local-talking-studio/studio-voice-library_hu_14555c8787188bd7.webp 800w, https://guige.ai/p/local-talking-studio/studio-voice-library_hu_3ab093b82f979c05.webp 1600w, https://guige.ai/p/local-talking-studio/studio-voice-library.webp 2097w" width="2097"&gt;&lt;/p&gt;
&lt;p&gt;还有个更好玩的入口：文字设计音色。比如描述“年轻女性，声音温暖，普通话清晰，说话自然，像在向朋友介绍一个新工具”，先让 VoiceDesign 生成一段试听。满意了，命名并保存成音色；后面的播报再拿这段录音去克隆。设计声音这一步有随机性，保存满意的样本，比每次重新许愿更适合养一个长期角色。&lt;/p&gt;
&lt;p&gt;&lt;img alt="文字设计音色实截：填写声音描述、选择语言和试听文案；图中为未提交的表单示例" class="gallery-image" data-flex-basis="146px" data-flex-grow="60" height="1311" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-voice-design.webp" width="798"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人物库保存“谁出镜”。&lt;/strong&gt; 上传人物图片，给角色起名，还可以绑定默认音色。下次选 Diana，不用重新在文件夹里找头像，也不用重新想她该用哪个声音。图像生成是独立入口，出图后仍需把选中的图保存到人物库；这里没有假装一张图出来就自动变成角色。&lt;/p&gt;
&lt;p&gt;&lt;img alt="人物库中的 Diana 实际卡片：保存人物图、图片尺寸和默认音色，点击“使用此人物”进入视频页" class="gallery-image" data-flex-basis="1195px" data-flex-grow="498" height="159" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-portraits.webp" width="792"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成播报负责先把台词说顺。&lt;/strong&gt; 输入文案、选择音色和语速，后台排队生成，完成后试听、下载 MP3/WAV。结果会留在历史里，还能直接拿去做视频。声音不满意，先在这一步改；没必要每换一个停顿，就让视频模型再忙一轮。&lt;/p&gt;
&lt;p&gt;&lt;img alt="生成播报实截：选择 Serena、填写 Diana 的示例文案和语速；仅演示填写方式，未提交新的播报任务" class="gallery-image" data-flex-basis="168px" data-flex-grow="70" height="1205" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-narration.webp" srcset="https://guige.ai/p/local-talking-studio/studio-narration_hu_dc5487c89bc82e2d.webp 800w, https://guige.ai/p/local-talking-studio/studio-narration.webp 848w" width="848"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成视频把人和声音合起来。&lt;/strong&gt; 可以选已有播报，也可以在视频页直接输入文本、先生成配音。页面分别提供本机 H3（Mac）、4090 H3，以及配置后可用的 HeyGen。走这篇文章的本地路线，就选 4090 H3；HeyGen 仍属于云端付费路线。任务有进度和结果，成片能播放、改名、下载，完成后接着处理字幕。&lt;/p&gt;
&lt;p&gt;&lt;img alt="生成视频参数页实截：选择本地 4090 H3 和 Diana，配音来源、画面比例、采样步数和短预览参数都在同一张表单中" class="gallery-image" data-flex-basis="65px" data-flex-grow="27" height="2754" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-video.webp" width="755"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="已有 Diana 视频结果实截：4090 H3、512×512、十二步短预览，卡片可播放字幕版、下载原片或进入字幕编辑" class="gallery-image" data-flex-basis="351px" data-flex-grow="146" height="567" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-video-result.webp" srcset="https://guige.ai/p/local-talking-studio/studio-video-result_hu_f3003369e7693bbe.webp 800w, https://guige.ai/p/local-talking-studio/studio-video-result.webp 831w" width="831"&gt;&lt;/p&gt;
&lt;p&gt;管理员还可以显式把音频或视频发到 Telegram。那是分享出口，生成本身不需要 Telegram；需要把素材留在本地，下载 MP4 就够了。&lt;/p&gt;
&lt;h2 id="qwen-给-diana-找声音也给她换衣服"&gt;Qwen 给 Diana 找声音，也给她换衣服
&lt;/h2&gt;&lt;p&gt;用户习惯叫它“qwen-voice”，这套部署里实际用的是 &lt;a class="link" href="https://github.com/QwenLM/Qwen3-TTS" target="_blank" rel="noopener"
 &gt;Qwen3-TTS&lt;/a&gt;，声音服务独立监听 &lt;code&gt;127.0.0.1:8091&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;三个模型各有一个用场。CustomVoice 提供预设音色；Base 用参考录音克隆声音；VoiceDesign 按文字描述设计新声音。Mac 端采用 1.7B 的 MLX 8bit 版本。克隆时，声音风格主要来自参考录音，不能把给预设音色用的风格指令当成万能旋钮。&lt;/p&gt;
&lt;p&gt;它对外提供熟悉的 OpenAI 风格接口：&lt;code&gt;POST /v1/audio/speech&lt;/code&gt; 返回 MP3 或 WAV，&lt;code&gt;GET /v1/audio/voices&lt;/code&gt; 列出音色，&lt;code&gt;POST /v1/audio/transcriptions&lt;/code&gt; 识别参考录音。Open WebUI 的音频引擎填“OpenAI”，只是选了接口格式；真正开口的是 Mac 上的 Qwen。&lt;/p&gt;
&lt;p&gt;想单独验证声音服务，不必先打开工作台：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl --fail-with-body http://127.0.0.1:8091/v1/audio/speech &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;model&amp;#34;:&amp;#34;qwen3-tts&amp;#34;,&amp;#34;input&amp;#34;:&amp;#34;你好，欢迎来到鬼哥的本地 AI 演播室。&amp;#34;,&amp;#34;voice&amp;#34;:&amp;#34;Serena&amp;#34;,&amp;#34;lang_code&amp;#34;:&amp;#34;chinese&amp;#34;,&amp;#34;response_format&amp;#34;:&amp;#34;mp3&amp;#34;}&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output narration.mp3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个服务返回完整音频文件，不支持 &lt;code&gt;stream=true&lt;/code&gt;。长文会按句分段再拼接；语速参数是生成后的 FFmpeg 调速，跟让模型换一种表演节奏是两回事。&lt;/p&gt;
&lt;p&gt;人物图则交给 4090 上的 Qwen-Image-2.1。工作台的“生成图像”提供两种模式：默认 Viggle Turbo 六步，或者基础版四十步。没参考图时按提示词生图；传一张参考图，就能做换背景、换衣服这样的编辑，结果可以下载原图。&lt;/p&gt;
&lt;p&gt;&lt;img alt="4090 图像工作台实截：连接状态、Turbo 六步模式、画面描述、参考图和随机种子；底部为之前保存的图像记录" class="gallery-image" data-flex-basis="339px" data-flex-grow="141" height="1484" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-images.webp" srcset="https://guige.ai/p/local-talking-studio/studio-images_hu_a5e9306ee76d2c14.webp 800w, https://guige.ai/p/local-talking-studio/studio-images_hu_539d24b898b9e4f8.webp 1600w, https://guige.ai/p/local-talking-studio/studio-images.webp 2097w" width="2097"&gt;&lt;/p&gt;
&lt;p&gt;在&lt;a class="link" href="https://guige.ai/p/qwen-image-turbo/" &gt;前一篇四组实测&lt;/a&gt;里，同一台机器的人像和海报工作流，六步版约 10 秒，基础版约 38 秒；人物编辑约 12 秒和 42 秒。加上运行时启动，Turbo 的总时间约 15–17 秒。这些是那次固定配置的记录，工作台还要经过连接和保存，不能直接当成每次点击的承诺。&lt;/p&gt;
&lt;p&gt;对角色创作来说，快一点的意义很具体：你更愿意试三套衣服、两个背景，再选适合这次台词的那张。图像编辑仍可能改变局部细节和取景，选人物图时得看脸，也得看构图。Diana 不会因为有了人物库，就自动获得每一帧都不变的身份证。&lt;/p&gt;
&lt;h2 id="h3-收到配音后会重新生成声画"&gt;H3 收到配音后，会重新生成声画
&lt;/h2&gt;&lt;p&gt;人物和配音都有了，终于轮到视频模型。&lt;/p&gt;
&lt;p&gt;这里用的是 &lt;a class="link" href="https://huggingface.co/MiniMaxAI/MiniMax-H3" target="_blank" rel="noopener"
 &gt;MiniMax H3 的 Ref2VA&lt;/a&gt;，在 4090 上通过 ComfyUI 的 CUDA 运行时推理。部署采用裁剪后的 INT8 主模型、INT8 文本编码器与视频 VAE，以及 FP32 音频 VAE。整套权重下载约 51.5GB，跟“显存里同时要放多少”不是同一个数。&lt;/p&gt;
&lt;p&gt;有个区别会直接影响你怎么看成片：&lt;strong&gt;H3 会根据参考人物和音频生成自己的声画音轨。&lt;/strong&gt; 它不是给一份完全不动的 WAV 配上嘴形。参考配音在引导它，输出的声音、时长和细节仍可能变化，所以工作台保留模型实际生成的结果，不偷偷把原配音换回去。&lt;/p&gt;
&lt;p&gt;这也是字幕必须听最终视频的原因。按输入 WAV 的时间轴贴字幕，遇到 H3 改了停顿，字就可能比嘴先到。&lt;/p&gt;
&lt;p&gt;当前这套本地封装先收窄到 512×512、24fps、单段参考音频 2–15 秒，默认十二步，可选八步或二十步。官方模型的能力范围更宽，但鬼哥工作台还没有把官方整套高分辨率流程搬进来。&lt;/p&gt;
&lt;p&gt;部署时留过一份短样片记录：约 4.1 秒的参考音频、十二步，在这台 4090 上一次成功任务的全流程约 86 秒，输出约 4.49 秒。它说明这条 CUDA 路线已经实际出片，不能拿来按比例保证一分钟视频的耗时。前面的 Diana 约十二秒成片，也是已有结果；这篇没有另外给她编一个生成速度。&lt;/p&gt;
&lt;p&gt;长片开关目前关闭。服务已经有按停顿切段、保留已完成片段、继续失败任务的机制，但片段之间的人物姿态和声音衔接还需要验证。先把一段短口播做顺，比急着把它叫作全天候直播间踏实。&lt;/p&gt;
&lt;h2 id="模型之间怎么接力任务怎么留下来"&gt;模型之间怎么接力，任务怎么留下来
&lt;/h2&gt;&lt;p&gt;前面那张架构图里的两条连接，落到部署上就是 SSH 端口转发。连接好以后，工作台才能把图像和视频任务送到 4090。&lt;/p&gt;
&lt;p&gt;如果已经装好了远端服务，手工连接的核心就是这两条：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 两条命令分别在独立终端运行；把 user@4090-host 换成自己的 SSH 目标&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -NT -o &lt;span class="nv"&gt;ExitOnForwardFailure&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes -o &lt;span class="nv"&gt;ServerAliveInterval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -L 127.0.0.1:28092:127.0.0.1:8092 user@4090-host
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -NT -o &lt;span class="nv"&gt;ExitOnForwardFailure&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes -o &lt;span class="nv"&gt;ServerAliveInterval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -L 127.0.0.1:28093:127.0.0.1:8093 user@4090-host
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它们只是连接方式，还不是把两台空白机器装好的全部命令。当前环境是一步步部署、修复、接通的，全新 Mac / Ubuntu 从 checkout 到整条链路一键可用，还没有完整验收。&lt;/p&gt;
&lt;p&gt;视频 API 用持久任务：先上传人物图和音频取得素材 ID，再创建任务，拿任务 ID 查询进度，完成后取 MP4。取消和重试也围绕这个 ID，断开隧道不等于远端任务已经停了，连接恢复后可以继续查。&lt;/p&gt;
&lt;p&gt;图像 API 目前是同步请求，没有同样的长队列和取消能力。它与 H3 共用 GPU 锁，约十五秒仍拿不到 GPU 会提示忙，留给用户稍后重试。生成结束，独立运行时退出，把显存还出来。&lt;/p&gt;
&lt;p&gt;这一点跟最初那台 32G Mac 的经验呼应上了：服务可以同时开着，大模型没必要同时赖在 GPU 里。做图和拍视频按顺序接力，48GB 也有自己的座位表。&lt;/p&gt;
&lt;h2 id="最后一公里让字幕跟上-diana-的嘴"&gt;最后一公里：让字幕跟上 Diana 的嘴
&lt;/h2&gt;&lt;p&gt;口播有画面、有声音了，手机上看的人却未必会开声音。字幕得跟上。&lt;/p&gt;
&lt;p&gt;这里有两套容易叫混的 Whisper。&lt;code&gt;local-tts&lt;/code&gt; 里的 MLX Whisper 用来识别音色参考录音；成片字幕则放在 Open WebUI 的独立 Python 环境，用 &lt;a class="link" href="https://github.com/jianfch/stable-ts" target="_blank" rel="noopener"
 &gt;stable-ts&lt;/a&gt; 配合本地 Whisper Small，当前走 CPU 四线程。&lt;/p&gt;
&lt;p&gt;完整视频有对应完整文案时，使用强制对齐：拿文字去最终音轨里找时间位置。截短预览或缺少文案时走 ASR，从实际音轨重新识别，避免把整篇台词硬塞进十几秒的预览。两种方式都可能出错，尤其是产品名、英文缩写和模型没有严格照读的地方，最后还是要看着成片校一次。&lt;/p&gt;
&lt;p&gt;新视频完成后会自动生成并烧录字幕，成功后卡片默认播放、下载字幕版。要改文字和时间，可以打开编辑器，逐句定位、拆分、合并；字号、颜色、上下位置、边距和底框也能调整。保存以后重新烧录，才得到这版字幕对应的 MP4。字幕失败可以单独重试，不必再跑一遍 H3。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diana 已有视频的字幕编辑器实截：对照成片调整每句文字和起止时间，设置字幕样式，再保存、烧录和导出" class="gallery-image" data-flex-basis="106px" data-flex-grow="44" height="1787" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/local-talking-studio/studio-captions.webp" width="792"&gt;&lt;/p&gt;
&lt;p&gt;SRT、VTT、ASS 都能导出；想拿去剪辑软件继续做，用字幕文件；想直接发给朋友，用 FFmpeg / libass 烧好的视频。原片另保留一份，不会被字幕覆盖。&lt;/p&gt;
&lt;p&gt;中文还有一个朴素的坑：系统里有字体，不代表 libass 真选中了它。此前成片出现过汉字方框，最终在 Mac 上显式加载 Heiti SC 才修好。模型说得再流利，字幕变成口口口，也像主持人忘了带提词器。&lt;/p&gt;
&lt;h2 id="从一段短口播开始把试错留给自己"&gt;从一段短口播开始，把试错留给自己
&lt;/h2&gt;&lt;p&gt;拿 Diana 这样的角色来走这条链路，我会先选好人物图和声音，试听一小段台词。声音顺了，再送到 4090 H3；成片回来检查嘴形、人物和实际音轨，然后校字幕、下载。想换背景，就去图像页改；想换一句话，先重新配音。每一步都有自己的产物，出了问题能回到那一步。&lt;/p&gt;
&lt;p&gt;文案可以自己写，也可以让本地聊天模型帮忙。现有 Open WebUI / Ollama 的聊天路线能继续用，但 Audio Studio 目前仍需要你输入文案、选择素材和提交任务，尚未做到“给一个主题，自动拍完整支视频”。这里的端到端，是从文案、人物图走到带字幕成片，而不是把所有创作判断都省掉。&lt;/p&gt;
&lt;p&gt;还有一笔账要分清：Qwen-Image-2.1 和 Turbo 适配器有研究用途的许可条件，H3 用社区许可。自己的研究试验与收费交付是两回事，做商业内容前得逐项读模型条款；人物肖像和声音也要有相应授权。&lt;/p&gt;
&lt;p&gt;对鬼哥来说，这套系统目前最有价值的，是能反复试。角色库里放好一个 Diana，今天介绍工具，明天换个背景、换一段台词，不用每次从上传素材和充值开始。短片能力已经能用，更长的视频、连续的角色表演，留着往后磨。&lt;/p&gt;
&lt;p&gt;当初做 skill，是想让口播少一点手工操作。现在把后端搬回自己的机器，是想让“再试一版”少一点犹豫。&lt;/p&gt;
&lt;p&gt;桌上的 Mac mini 接文案，4090 开始干活，Diana 再开口。鬼哥这次要看的，是她有没有把话说好。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://guige.ai/p/mac-mini-ai-workstation/" &gt;鬼哥：32G 的 M6 Mac mini，怎么同时养活聊天和画图两个大模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://guige.ai/p/qwen-image-turbo/" &gt;鬼哥：Qwen Image 40 步对上 Viggle Turbo 6 步，4090 上的四组实测&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/open-webui/open-webui" target="_blank" rel="noopener"
 &gt;Open WebUI 项目&lt;/a&gt;（本文工作台为本地定制扩展）&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/QwenLM/Qwen3-TTS" target="_blank" rel="noopener"
 &gt;Qwen3-TTS 官方代码与模型用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Blaizzy/mlx-audio" target="_blank" rel="noopener"
 &gt;MLX Audio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Qwen/Qwen-Image-2.1" target="_blank" rel="noopener"
 &gt;Qwen-Image-2.1 模型卡与许可&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Viggle/Qwen-Image-2.1-viggle-turbo" target="_blank" rel="noopener"
 &gt;Viggle Qwen Image Turbo 适配器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/MiniMaxAI/MiniMax-H3" target="_blank" rel="noopener"
 &gt;MiniMax H3 模型卡、Ref2VA 与社区许可&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/comfyanonymous/ComfyUI" target="_blank" rel="noopener"
 &gt;ComfyUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/jianfch/stable-ts" target="_blank" rel="noopener"
 &gt;stable-ts：转写与强制对齐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ffmpeg.org/ffmpeg-filters.html#subtitles-1" target="_blank" rel="noopener"
 &gt;FFmpeg 字幕滤镜&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>32G 的 M6 Mac mini，怎么同时养活聊天和画图两个大模型</title><link>https://guige.ai/p/mac-mini-ai-workstation/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/mac-mini-ai-workstation/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post 32G 的 M6 Mac mini，怎么同时养活聊天和画图两个大模型" /&gt;&lt;p&gt;新 Mac mini 让人等了快两年。8 月 25 日，苹果终于&lt;a class="link" href="https://www.apple.com/newsroom/2026/08/apple-unveils-a-more-powerful-mac-mini-featuring-the-all-new-m6-and-m5-pro/" target="_blank" rel="noopener"
 &gt;发布了新款&lt;/a&gt;，入门款是苹果第一颗 2nm 芯片 M6，高配款是 M5 Pro。&lt;/p&gt;
&lt;p&gt;鬼哥盯着 M5 Pro 看了很久。64G 内存，带宽快了将近一倍，拿来跑本地大模型确实香。可顶配要 3199 美元，折合两万多人民币。鬼哥掐指一算：这得是多少碗米粉。&lt;/p&gt;
&lt;p&gt;最后下单的是 M6、32G 那一款。为了它，鬼哥省了好几个月早餐的米粉加一个蛋。&lt;/p&gt;
&lt;img src="mac-mini-photo.webp" alt="M6 Mac mini" style="width: 360px; max-width: 100%; margin: 24px auto;"&gt;
&lt;p&gt;倒也不全是穷。鬼哥的主力工作，写代码、查资料、改长文，都是靠 Claude 和 Codex 的订阅在云端完成的。本地模型对鬼哥来说还是探索：看看它在写作、内容创作、日常开发里到底能帮上多少忙。为一个还在摸索的爱好，把早餐钱全搭进去，不太划算。&lt;/p&gt;
&lt;p&gt;问题就来了：32G 这个&amp;quot;够用的下限&amp;quot;，能不能撑起一台私人 AI 工作站？不连云、不花 API 费，能陪鬼哥写东西，也能按一句话画出一张像样的图。&lt;/p&gt;
&lt;p&gt;鬼哥决定从写作和内容创作开始试。折腾了两个晚上，答案是能。不过真正难的地方，跟一开始想的不一样。&lt;/p&gt;
&lt;h2 id="先让它开口一行命令的-open-webui"&gt;先让它开口：一行命令的 Open WebUI
&lt;/h2&gt;&lt;p&gt;机器上原本就装着 Ollama，拉好了 Qwen3.8 的 27B 模型。缺的是一个像样的聊天界面。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/open-webui/open-webui" target="_blank" rel="noopener"
 &gt;Open WebUI&lt;/a&gt; 基本就是一个自己托管的 ChatGPT 网页版，对话历史、多用户、知识库、联网搜索一应俱全，还能接各种模型。鬼哥原以为要跟 Python 环境搏斗一晚上，结果官方包用 &lt;code&gt;uv&lt;/code&gt; 一行就能跑：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DATA_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.open-webui uvx --python 3.11 open-webui@latest serve
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;指定 Python 3.11，是因为 Open WebUI 只认 3.11 到 3.12，而鬼哥系统里的 Python 已经 3.14 了，太新，人家不要。浏览器打开 &lt;code&gt;localhost:8080&lt;/code&gt;，第一个注册的账号自动当管理员。它会自己找到本机 11434 端口上的 Ollama，下拉框里直接就有 &lt;code&gt;qwen3.8&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;第一题鬼哥出得有点刁：用辛弃疾《青玉案·元夕》的场景，写一篇书生和姑娘惊鸿一瞥的小故事。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Qwen3.8 在 Open WebUI 里写的元夕故事" class="gallery-image" data-flex-basis="345px" data-flex-grow="144" height="2000" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/openwebui-yuanxi.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/openwebui-yuanxi_hu_709be419d31aa2f4.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/openwebui-yuanxi_hu_b2cd3c1774aaf780.webp 1600w, https://guige.ai/p/mac-mini-ai-workstation/openwebui-yuanxi_hu_1d423ec5c6cd3011.webp 2400w, https://guige.ai/p/mac-mini-ai-workstation/openwebui-yuanxi.webp 2880w" width="2880"&gt;&lt;/p&gt;
&lt;p&gt;它写了一千来字，题目叫《灯火阑珊》。开头是&amp;quot;元宵那夜，汴京的东风是带着花香来的&amp;quot;，结尾有一句鬼哥挺喜欢：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;他写的时候手是稳的，可墨迹落纸，&amp;ldquo;阑珊&amp;quot;二字却洇开了。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;一台比饭盒大不了多少的盒子，能写到这个份上，鬼哥是有点意外的。当然也有翻车的地方：写到烟花炸开那句，它突然冒出一个 &amp;ldquo;fireworks&amp;rdquo;。辛弃疾要是看到自己的元宵节里放的是洋烟花，大概也会洇开。&lt;/p&gt;
&lt;p&gt;Open WebUI 在每条回复下面记了速度：这篇生成了 1021 个 token，每秒约 14 个；读入提示词每秒约 276 个 token。从回车到写完，不到两分钟。&lt;/p&gt;
&lt;p&gt;&lt;img alt="回复下方的信息图标：每秒 13.94 个 token" class="gallery-image" data-flex-basis="345px" data-flex-grow="144" height="2000" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/openwebui-token-speed.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/openwebui-token-speed_hu_26392401c8f0b2e5.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/openwebui-token-speed_hu_eddcc2dc0606ba56.webp 1600w, https://guige.ai/p/mac-mini-ai-workstation/openwebui-token-speed_hu_dcf5f520f21d2c5.webp 2400w, https://guige.ai/p/mac-mini-ai-workstation/openwebui-token-speed.webp 2880w" width="2880"&gt;&lt;/p&gt;
&lt;p&gt;模型在内存里占 18G 左右，是 27.8B 参数、nvfp4 量化的 MLX 版本。其他几段对话里，生成速度大多在每秒 14 到 20 个 token 之间，比鬼哥读小说的速度快。&lt;/p&gt;
&lt;p&gt;还有个意外之喜：Open WebUI 默认监听所有网卡，所以装了 Tailscale 的其他设备，用 &lt;code&gt;http://mac-mini的机器名:8080&lt;/code&gt; 就能直接访问。桌上这台 Mac mini，从此成了随身 AI 的后端。&lt;/p&gt;
&lt;h2 id="想让它画画先撞上一堵-33g-的墙"&gt;想让它画画，先撞上一堵 33G 的墙
&lt;/h2&gt;&lt;p&gt;会写字了，自然想让它会画画。鬼哥看中的是 &lt;a class="link" href="https://huggingface.co/Qwen/Qwen-Image-2.1" target="_blank" rel="noopener"
 &gt;Qwen-Image-2.1&lt;/a&gt;：7B 参数的图像生成模型，文字渲染是出了名的强，还支持图片编辑和透明背景。&lt;/p&gt;
&lt;p&gt;打开模型页，算了一下账：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;组件&lt;/th&gt;
 &lt;th style="text-align: right"&gt;官方 BF16 大小&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;文本编码器（Qwen3-VL-8B）&lt;/td&gt;
 &lt;td style="text-align: right"&gt;17.5 GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;图像生成模型（7B DiT）&lt;/td&gt;
 &lt;td style="text-align: right"&gt;14.2 GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;VAE&lt;/td&gt;
 &lt;td style="text-align: right"&gt;1.4 GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;合计&lt;/td&gt;
 &lt;td style="text-align: right"&gt;&lt;strong&gt;33.1 GB&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;鬼哥的机器是 32G。差了 1G，就像米粉钱差一块，老板也不会给你加蛋。&lt;/p&gt;
&lt;p&gt;这里得先说清楚 Mac 的内存是怎么回事。PC 上，显卡有自己的显存，显存不够时可以把模型&amp;quot;卸载到内存&amp;rdquo;。Mac 的 CPU 和 GPU 共用同一块统一内存，所谓卸载到内存，就是把东西从左边口袋放进右边口袋，总重量一克没少。何况 macOS 默认也不会把全部内存都分给 GPU。所以官方示例里的 &lt;code&gt;enable_model_cpu_offload()&lt;/code&gt;，在这台机器上帮不了什么忙。&lt;/p&gt;
&lt;p&gt;解法是量化。ComfyUI 官方整理了一套 &lt;a class="link" href="https://huggingface.co/Comfy-Org/Qwen-Image-2.1" target="_blank" rel="noopener"
 &gt;int8 版本&lt;/a&gt;：图像模型 7.3G，文本编码器 9.4G，VAE 0.7G，一共 17.3G，差不多瘦身一半。&lt;/p&gt;
&lt;p&gt;接下来要挑一个生图工具。Mac 上最省事的是 Draw Things，原生 App，对 Apple 芯片做了深度优化。但鬼哥想要的是在 Open WebUI 里聊着天就能出图，这条路只有 &lt;a class="link" href="https://github.com/comfyanonymous/ComfyUI" target="_blank" rel="noopener"
 &gt;ComfyUI&lt;/a&gt; 走得通：它自带 API，Open WebUI 支持把它当生图后端。ComfyUI 的界面是一块节点画布，加载模型、编码提示词、采样、解码、保存，每一步一个方块，用线连起来。第一次看像在拆电视机，看熟了发现什么都能拆开调。&lt;/p&gt;
&lt;p&gt;&lt;img alt="ComfyUI 的节点工作流" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1800" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/comfyui-workflow.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/comfyui-workflow_hu_80c5188e5a372da6.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/comfyui-workflow_hu_53d706c1af4ffafb.webp 1600w, https://guige.ai/p/mac-mini-ai-workstation/comfyui-workflow_hu_e535f5d8cf386462.webp 2400w, https://guige.ai/p/mac-mini-ai-workstation/comfyui-workflow.webp 3200w" width="3200"&gt;&lt;/p&gt;
&lt;p&gt;安装本身不复杂：克隆仓库，用 &lt;code&gt;uv&lt;/code&gt; 建一个 Python 3.13 环境，装 PyTorch nightly（Mac 上靠它的 MPS 后端调用 GPU），再把三个模型文件放进对应的文件夹。更省心的是，ComfyUI 自带的模板里已经有 Qwen-Image-2.1 的文生图工作流，用的正是这套 int8 文件，推荐参数是 25 步、CFG 1、euler 采样器。鬼哥照着它写了一份 API 格式的工作流，自己测试用，也给 Open WebUI 用。&lt;/p&gt;
&lt;h2 id="第一张图招牌上的字一个都没错"&gt;第一张图：招牌上的字，一个都没错
&lt;/h2&gt;&lt;p&gt;测试提示词是模型卡上的例子：雨夜里一块霓虹招牌，写着 &amp;ldquo;QWEN IMAGE 2.1&amp;rdquo;，湿漉漉的路面有倒影。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Qwen-Image-2.1 在 Mac mini 上生成的霓虹招牌" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/qwen-neon-sign.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/qwen-neon-sign_hu_54f21b0c22eb7504.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/qwen-neon-sign.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;1024×1024、25 步，用了 222 秒，每步大约 8 秒。够鬼哥下楼嗦半碗粉。&lt;/p&gt;
&lt;p&gt;慢是真慢，但看到图的那一刻，鬼哥原谅它了。&amp;ldquo;QWEN&amp;rdquo; 是冷白色的霓虹管，&amp;ldquo;IMAGE 2.1&amp;rdquo; 是红色，字母一个没错，连 2 和 1 中间的小数点都在。地面上红灯的倒影、斑马线、远处橱窗里的灯，都像雨夜里手机随手一拍。几年前，本地生图模型写字还像鬼画符。&lt;/p&gt;
&lt;p&gt;接入 Open WebUI 之后，鬼哥又画了几张。最喜欢的是这张北京微缩沙盘：长城沿着山脊蜿蜒，故宫、天坛、鸟巢、水立方、央视大楼挤在同一块地图上，浅景深把周围的地图虚化掉，很像旅行杂志的内页。&lt;/p&gt;
&lt;p&gt;&lt;img alt="在 Open WebUI 里用一段中文描述，图直接出现在对话中" class="gallery-image" data-flex-basis="345px" data-flex-grow="144" height="2000" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/openwebui-image-chat.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/openwebui-image-chat_hu_c926d75ec217de96.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/openwebui-image-chat_hu_138c356301c9f3b1.webp 1600w, https://guige.ai/p/mac-mini-ai-workstation/openwebui-image-chat_hu_edd233e466021f12.webp 2400w, https://guige.ai/p/mac-mini-ai-workstation/openwebui-image-chat.webp 2880w" width="2880"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Qwen-Image-2.1 生成的北京微缩沙盘" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/qwen-beijing-diorama.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/qwen-beijing-diorama_hu_a6c2a9b48f482b96.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/qwen-beijing-diorama.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;它也有露怯的时候。让它画一页插画师的手绘设定稿，人物的造型、表情、比例都很有样子，页面上那些手写批注却全是天书。它擅长的是提示词里点名要写的大字；画面里顺手添的小字，基本就是装饰花纹。&lt;/p&gt;
&lt;p&gt;&lt;img alt="手绘设定稿：人物画得不错，批注小字是乱码" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/qwen-sketchbook.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/qwen-sketchbook_hu_61523fe518e88c6c.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/qwen-sketchbook.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;还有一张时装人像，左下角冒出来一个谁也没要求的&amp;quot;签名&amp;quot;，看着还挺像那么回事。鬼哥第一反应是在负面提示词里写上&amp;quot;不要水印&amp;quot;，查了参数才发现写了也白写：这套工作流的 CFG 是 1，负面提示词根本不起作用。想去掉签名，得把 &amp;ldquo;no text, no watermark, no signature&amp;rdquo; 这类要求直接写进正面提示词。官方模板的示例提示词，结尾就是一长串 &amp;ldquo;no text, no letters, no logos, no watermark&amp;rdquo;，看来官方早就防着它这一手。&lt;/p&gt;
&lt;p&gt;&lt;img alt="时装人像，左下角冒出一个假签名" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/qwen-fake-signature.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/qwen-fake-signature_hu_cc7fcf21c974d9fd.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/qwen-fake-signature.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;h2 id="两个大模型挤不进同一块内存"&gt;两个大模型，挤不进同一块内存
&lt;/h2&gt;&lt;p&gt;聊天和生图各自都能跑了，鬼哥在 Open WebUI 的图像设置里填上 ComfyUI 的地址，上传工作流，把提示词、尺寸、步数、种子分别对应到工作流里的节点。然后在聊天框里打开生图开关，直接用中文描述想要的画面。&lt;/p&gt;
&lt;p&gt;流程是这样的：Qwen3.8 先把你的描述扩写成一段详细的英文提示词，交给 ComfyUI；四分钟后，图片出现在对话里，Qwen3.8 再补一句说明。&lt;/p&gt;
&lt;p&gt;第一次端到端跑通，图出来了，鬼哥顺手看了一眼系统状态，笑容凝固了：swap 已用从 4G 涨到了 14G，交换空间上限才 15G。&lt;/p&gt;
&lt;p&gt;原因不复杂，但事先没想到：两边都舍不得放下模型。Ollama 默认会把模型在内存里留 5 分钟，方便你接着聊；ComfyUI 出完图，也会把模型留着，方便画下一张。Qwen3.8 刚写完提示词，占着 18G 不走，ComfyUI 紧接着又要加载将近 17G 的生图模型。两个加起来超过 32G，macOS 只能把内存往 SSD 上的 swap 里硬塞。&lt;/p&gt;
&lt;p&gt;两个胖子挤一张单人床，谁也睡不好。这次速度倒没怎么掉，但每生成一张图，SSD 上就要写进去十来 G 的 swap。swap 一旦用满，轻则卡顿，重则进程被系统请出去。&lt;/p&gt;
&lt;p&gt;**在 32G 的统一内存上，两个大模型不能同时在内存里，只能轮流用。**如果当初买的是 64G 的 M5 Pro，这一节大概可以直接跳过。可谁让鬼哥省下的只是米粉钱，那就只能让它们学会排队。一共三处调整。&lt;/p&gt;
&lt;p&gt;第一处，让 Ollama 早点放手。鬼哥先用 &lt;code&gt;launchctl setenv OLLAMA_KEEP_ALIVE 1m&lt;/code&gt; 把全局保留时间改成 1 分钟，然后就以为万事大吉了。后来查进程的环境变量才发现，Ollama 一直没重启，这个设置根本没生效。真正起作用的，是在 Open WebUI 里给 qwen3.8 设的 &lt;code&gt;keep_alive = 1m&lt;/code&gt;。这个设置存在 Open WebUI 的数据库里，电脑重启也不会丢。&lt;/p&gt;
&lt;p&gt;第二处，ComfyUI 一接到任务，就立刻请 Ollama 让位。Qwen3.8 的提示词已经写完、交到 ComfyUI 手里了，这一步它没事可干，占着位置纯属浪费。鬼哥在 ComfyUI 的起停脚本里加了一个后台循环：发现队列从空变成有任务，就查一下 Ollama 当前加载了哪些模型，挨个发一个 &lt;code&gt;keep_alive: 0&lt;/code&gt; 的请求。这只是把模型请出内存，文件还在硬盘上。&lt;/p&gt;
&lt;p&gt;第三处，ComfyUI 出完图，5 秒内收拾走人。这里 Mac 又有个特别的地方：ComfyUI 的 &lt;code&gt;/free&lt;/code&gt; 接口，只带 &lt;code&gt;unload_models&lt;/code&gt; 参数的话，模型只是从&amp;quot;显存&amp;quot;挪到&amp;quot;内存&amp;quot;，在 Mac 上又是左口袋换右口袋。必须同时带上 &lt;code&gt;free_memory&lt;/code&gt;，把节点缓存也清掉，内存才会真正还回来。实测，出完图后 ComfyUI 的内存占用从 9.8G 降到了 0.6G。&lt;/p&gt;
&lt;p&gt;第一处调整之后，鬼哥每改一步就盯一次生图，每 5 秒记一次 swap。三次记录放在一起看：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th style="text-align: right"&gt;只把 keep_alive 改成 1 分钟&lt;/th&gt;
 &lt;th style="text-align: right"&gt;再加上生图开始时卸载 Ollama&lt;/th&gt;
 &lt;th style="text-align: right"&gt;再加上出图后 5 秒释放&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;生图开始时 swap 峰值&lt;/td&gt;
 &lt;td style="text-align: right"&gt;15.5 GB&lt;/td&gt;
 &lt;td style="text-align: right"&gt;3.7 GB&lt;/td&gt;
 &lt;td style="text-align: right"&gt;4.0 GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;生图过程中 swap&lt;/td&gt;
 &lt;td style="text-align: right"&gt;约 5 GB&lt;/td&gt;
 &lt;td style="text-align: right"&gt;3.7 GB&lt;/td&gt;
 &lt;td style="text-align: right"&gt;3.8 GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;出图后 swap 峰值&lt;/td&gt;
 &lt;td style="text-align: right"&gt;—&lt;/td&gt;
 &lt;td style="text-align: right"&gt;12.0 GB&lt;/td&gt;
 &lt;td style="text-align: right"&gt;7.5 GB，几秒后回落&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;1024 图耗时&lt;/td&gt;
 &lt;td style="text-align: right"&gt;243 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;234 秒&lt;/td&gt;
 &lt;td style="text-align: right"&gt;235 秒&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最后那 3.8G 是其他程序早先换出去的内存，一直留在 swap 里，跟这套工作站无关。出图后那几秒的小峰值，是 Qwen3.8 急着回来写回复，ComfyUI 还没来得及收拾完，两边在门口撞了一下。内存压力不大，鬼哥决定不跟它计较。&lt;/p&gt;
&lt;p&gt;&lt;img alt="一次生图的内存接力" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1440" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/memory-relay.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/memory-relay_hu_22e0ae362537f6f1.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/memory-relay_hu_9b330611f8dbcbf8.webp 1600w, https://guige.ai/p/mac-mini-ai-workstation/memory-relay_hu_9edf3de8579fd1c1.webp 2400w, https://guige.ai/p/mac-mini-ai-workstation/memory-relay.webp 2560w" width="2560"&gt;&lt;/p&gt;
&lt;h2 id="现在这台工作站长什么样"&gt;现在这台工作站长什么样
&lt;/h2&gt;&lt;p&gt;整理下来，一次&amp;quot;聊着天出张图&amp;quot;的完整过程是这样的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="私人 AI 工作站的组成" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1440" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/mac-mini-ai-workstation/workstation-architecture.webp" srcset="https://guige.ai/p/mac-mini-ai-workstation/workstation-architecture_hu_a551005e6e148216.webp 800w, https://guige.ai/p/mac-mini-ai-workstation/workstation-architecture_hu_b7b4cad2e86dc83c.webp 1600w, https://guige.ai/p/mac-mini-ai-workstation/workstation-architecture_hu_5dfd6ba5a8042fa0.webp 2400w, https://guige.ai/p/mac-mini-ai-workstation/workstation-architecture.webp 2560w" width="2560"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;鬼哥在 Open WebUI 里用中文说想要什么画面；&lt;/li&gt;
&lt;li&gt;Qwen3.8-27B 把它写成详细的英文提示词；&lt;/li&gt;
&lt;li&gt;ComfyUI 接到任务，先请 Ollama 把 Qwen3.8 卸载掉，再加载 Qwen-Image-2.1 的 int8 模型；&lt;/li&gt;
&lt;li&gt;大约 4 分钟后出图，图片回到对话里；&lt;/li&gt;
&lt;li&gt;ComfyUI 5 秒内释放模型，Qwen3.8 重新加载，补一句说明。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;有几件事最好提前知道。速度上，一张 1024 的图要 4 分钟左右；官方默认的 2048 尺寸像素是它的 4 倍，按比例估算要十几分钟，这个鬼哥还没试，怕等到饿。许可上，Qwen-Image-2.1 用的是 Qwen Research License，个人研究和玩没问题，商用要先读条款。至于 Open WebUI 本身，0.11.4 版本新建对话时生成标题会报一个 &lt;code&gt;KeyError&lt;/code&gt;，对话只是没有自动标题，其他功能都正常，等上游修就好。&lt;/p&gt;
&lt;p&gt;它不会比云端服务快，也不会比云端的旗舰模型聪明。但写故事、改文章、画张配图这类日常活，它都能在鬼哥的桌上完成：数据不出门，不按次计费，断网也能用。深夜想到一个画面，不用先去看 API 余额，这一点比预想的更让人舒服。何况这台机器是用早餐钱换的，每多画一张图，那几个月的蛋就吃得更值一点。&lt;/p&gt;
&lt;p&gt;回到那个元夕故事。那天夜里，书生在灯海里寻了那个姑娘千百回，最后在一盏快燃尽的旧灯下找到了她。这台 Mac mini 上的两个大模型，比那两个人好安排：一个写完提示词就退场，一个画完图也退场，同一时刻，内存里只留一个。&lt;/p&gt;
&lt;p&gt;32G 统一内存能同时装下的大模型，其实只有一个。它能当私人 AI 工作站，靠的是让两个模型轮流用这块内存。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这篇文章的封面，也是这台 Mac mini 上的 Qwen-Image-2.1 画的：1344×768，大约 8 分钟。&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="附关键配置速查"&gt;附：关键配置速查
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Open WebUI 图像设置&lt;/strong&gt;（管理员面板 → 设置 → 图像）&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;设置项&lt;/th&gt;
 &lt;th&gt;值&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;引擎&lt;/td&gt;
 &lt;td&gt;ComfyUI&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Base URL&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;http://127.0.0.1:8188&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;默认模型&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;qwen_image_2.1_int8_convrot.safetensors&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;尺寸 / 步数&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1024x1024&lt;/code&gt; / &lt;code&gt;25&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;节点映射&lt;/td&gt;
 &lt;td&gt;prompt → 文本编码节点的 &lt;code&gt;prompt&lt;/code&gt;；width/height → EmptyLatentImage；steps/seed → KSampler；model → UNETLoader 的 &lt;code&gt;unet_name&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;模型文件&lt;/strong&gt;（来自 &lt;code&gt;Comfy-Org/Qwen-Image-2.1&lt;/code&gt;）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;models/diffusion_models/qwen_image_2.1_int8_convrot.safetensors 7.3 GB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;models/text_encoders/qwen3vl_8b_int8_convrot.safetensors 9.4 GB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;models/vae/qwen_image_2.1_vae_bf16.safetensors 0.7 GB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;让两个模型轮流用内存的核心逻辑&lt;/strong&gt;（ComfyUI 起停脚本里的后台循环）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 队列从空闲变成有任务：卸载 Ollama 里所有已加载的模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; name in &lt;span class="k"&gt;$(&lt;/span&gt;curl -s localhost:11434/api/ps &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;&amp;#34;name&amp;#34;:&amp;#34;[^&amp;#34;]*&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d&lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f4&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -s localhost:11434/api/generate -d &lt;span class="s2"&gt;&amp;#34;{\&amp;#34;model\&amp;#34;: \&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;, \&amp;#34;keep_alive\&amp;#34;: 0}&amp;#34;&lt;/span&gt; &amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 队列空闲 5 秒：卸载 ComfyUI 的模型并清掉缓存（Mac 上两个参数缺一不可）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s localhost:8188/free -H &lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;unload_models&amp;#34;: true, &amp;#34;free_memory&amp;#34;: true}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.apple.com/newsroom/2026/08/apple-unveils-a-more-powerful-mac-mini-featuring-the-all-new-m6-and-m5-pro/" target="_blank" rel="noopener"
 &gt;Apple Newsroom：新款 Mac mini，搭载 M6 和 M5 Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.macrumors.com/guide/m6-vs-m5-pro-mac-mini/" target="_blank" rel="noopener"
 &gt;MacRumors：M6 vs. M5 Pro Mac mini 选购指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/open-webui/open-webui" target="_blank" rel="noopener"
 &gt;Open WebUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Qwen/Qwen-Image-2.1" target="_blank" rel="noopener"
 &gt;Qwen-Image-2.1 模型卡&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Comfy-Org/Qwen-Image-2.1" target="_blank" rel="noopener"
 &gt;Comfy-Org/Qwen-Image-2.1 量化权重&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/comfyanonymous/ComfyUI" target="_blank" rel="noopener"
 &gt;ComfyUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/ollama/ollama/blob/main/docs/faq.md" target="_blank" rel="noopener"
 &gt;Ollama FAQ：如何控制模型在内存中的保留时间&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>