<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>mijeq95's blog Blog</title>
        <link>https://mikeQ95.github.io/blog</link>
        <description>mijeq95's blog Blog</description>
        <lastBuildDate>Fri, 29 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <item>
            <title><![CDATA[用 Python 脚本下载 YouTube 视频]]></title>
            <link>https://mikeQ95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script</link>
            <guid>https://mikeQ95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script</guid>
            <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[想下载 YouTube 视频存到本地？这篇文章用一个 Python 脚本帮你搞定，配置一次，之后换链接直接用。]]></description>
            <content:encoded><![CDATA[<p>想下载 YouTube 视频存到本地？这篇文章用一个 Python 脚本帮你搞定，配置一次，之后换链接直接用。</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="配置运行环境">配置运行环境<a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#%E9%85%8D%E7%BD%AE%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="配置运行环境的直接链接" title="配置运行环境的直接链接" translate="no">​</a></h2>
<p>你的 Mac 上需要以下四个工具，按顺序装好就行。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="homebrew">Homebrew<a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#homebrew" class="hash-link" aria-label="Homebrew的直接链接" title="Homebrew的直接链接" translate="no">​</a></h3>
<p>macOS 包管理器，装其他工具的基础。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</span><br></div></code></pre></div></div>
<p>验证：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew --version</span><br></div></code></pre></div></div>
<p>✅ 正常：显示 <code>Homebrew 4.x.x</code> ❌ 异常：显示 <code>command not found</code></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ffmpeg"><a href="https://clearlove7-ai.vercel.app/?word=ffmpeg&amp;postId=2026-05-29-Download-YouTube-videos-using-a-Python-script" target="_blank" rel="noopener noreferrer" class="">ffmpeg</a><a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#ffmpeg" class="hash-link" aria-label="ffmpeg的直接链接" title="ffmpeg的直接链接" translate="no">​</a></h3>
<p>合并音视频流，缺它就只能下到没声音的视频。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew install ffmpeg</span><br></div></code></pre></div></div>
<p>验证：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ffmpeg -version</span><br></div></code></pre></div></div>
<p>✅ 正常：显示 <code>ffmpeg version 7.x.x</code> ❌ 异常：显示 <code>command not found</code></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nodejs">Node.js<a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#nodejs" class="hash-link" aria-label="Node.js的直接链接" title="Node.js的直接链接" translate="no">​</a></h3>
<p>破解 YouTube 的 JS 加密挑战，缺它格式全部丢失。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew install node</span><br></div></code></pre></div></div>
<p>验证：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">node --version</span><br></div></code></pre></div></div>
<p>✅ 正常：显示 <code>v26.x.x</code> ❌ 异常：显示 <code>command not found</code></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="yt-dlp"><a href="https://clearlove7-ai.vercel.app/?word=yt-dlp&amp;postId=2026-05-29-Download-YouTube-videos-using-a-Python-script" target="_blank" rel="noopener noreferrer" class="">yt-dlp</a><a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#yt-dlp" class="hash-link" aria-label="yt-dlp的直接链接" title="yt-dlp的直接链接" translate="no">​</a></h3>
<p>核心下载库。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">pip3 install yt-dlp --break-system-packages</span><br></div></code></pre></div></div>
<p>验证：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">yt-dlp --version</span><br></div></code></pre></div></div>
<p>✅ 正常：显示 <code>2026.x.xx</code> ❌ 异常：显示 <code>command not found</code></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="两项额外配置">两项额外配置<a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#%E4%B8%A4%E9%A1%B9%E9%A2%9D%E5%A4%96%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="两项额外配置的直接链接" title="两项额外配置的直接链接" translate="no">​</a></h3>
<p><strong>终端获得完全磁盘访问权限</strong>（读取 Safari <a href="https://clearlove7-ai.vercel.app/?word=Cookie&amp;postId=2026-05-29-Download-YouTube-videos-using-a-Python-script" target="_blank" rel="noopener noreferrer" class="">Cookie</a> 需要）</p>
<p>系统设置 → 隐私与安全性 → 完全磁盘访问权限 → 添加「终端」</p>
<p><strong>开启代理</strong>（在国内访问 YouTube 必须）</p>
<blockquote>
<p>我不可能教你这个的！</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="获取代码">获取代码<a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#%E8%8E%B7%E5%8F%96%E4%BB%A3%E7%A0%81" class="hash-link" aria-label="获取代码的直接链接" title="获取代码的直接链接" translate="no">​</a></h2>
<p>你可以直接下载我写好的脚本，也可以自己写（或者让 AI 写，见下一节）。</p>
<p><a href="https://drive.google.com/file/d/14lFupv6bSw-cicSJ2KxoWYJgkII1uHeZ/view?usp=share_link" target="_blank" rel="noopener noreferrer" class="">点击下载 main.py</a></p>
<p>代码内容如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> subprocess</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> sys</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> os</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ── 配置区 ──────────────────────────────────────────────</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">VIDEO_URL  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"XXXX"</span><span class="token plain">                           </span><span class="token comment" style="color:#999988;font-style:italic"># 替换为真实的 YouTube 链接</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">OUTPUT_DIR </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">expanduser</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"~/Desktop"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 输出到桌面</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NODE_PATH  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/opt/homebrew/bin/node"</span><span class="token plain">         </span><span class="token comment" style="color:#999988;font-style:italic"># Homebrew 安装的 Node.js 路径</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ────────────────────────────────────────────────────────</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">download_video</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> output_dir</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:#e3116c">"""</span><br></div><div class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    调用 yt-dlp 命令行下载 YouTube 视频，输出 H.264 MP4 格式。</span><br></div><div class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    output_template </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">output_dir</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%(title)s.%(ext)s"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cmd </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"yt-dlp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 优先 H.264 视频流 + 最佳音频</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"--format"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"bestvideo[vcodec^=avc1]+bestaudio/bestvideo[ext=mp4]+bestaudio/best"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 强制输出 mp4 容器</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"--merge-output-format"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"mp4"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 明确指定 Node.js 路径，用于解开 YouTube JS 加密</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"--js-runtimes"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f"node:</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">NODE_PATH</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 从 GitHub 下载 JS 挑战解密脚本（首次运行需要联网）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"--remote-components"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ejs:github"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 读取 Safari Cookie，绕过机器人检测</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"--cookies-from-browser"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"safari"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 输出文件路径模板</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"--output"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> output_template</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        url</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"[INFO] 开始下载：</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">url</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"[INFO] 输出目录：</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">output_dir</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> subprocess</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">returncode </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"\n[✓] 下载完成！视频已保存到桌面。"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"\n[✗] 下载失败，请查看上方错误信息。"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">file</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stderr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">exit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"__main__"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 支持从命令行传入链接：python3 main.py &lt;url&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> VIDEO_URL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> url </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"XXXX"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"[✗] 请将 VIDEO_URL 替换为真实链接，或通过命令行参数传入。"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token builtin">file</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stderr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"    用法：python3 main.py \"YouTube链接\""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">file</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stderr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">exit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    download_video</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OUTPUT_DIR</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="懒人做法让-ai-帮你写代码">懒人做法：让 AI 帮你写代码<a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#%E6%87%92%E4%BA%BA%E5%81%9A%E6%B3%95%E8%AE%A9-ai-%E5%B8%AE%E4%BD%A0%E5%86%99%E4%BB%A3%E7%A0%81" class="hash-link" aria-label="懒人做法：让 AI 帮你写代码的直接链接" title="懒人做法：让 AI 帮你写代码的直接链接" translate="no">​</a></h2>
<p>不想手动写代码？直接把下面的提示词丢给 ChatGPT、DeepSeek 或 Claude，它们都能给你输出一个可用的脚本。</p>
<p><strong>中文版提示词：</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">请使用 Python 写一个下载 YouTube 视频的脚本，代码写在 main.py 文件里，</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">这是需要下载的视频链接：XXXX，最终获得的视频格式要为 H.264 的 MP4，</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">并输出到桌面。</span><br></div></code></pre></div></div>
<p><strong>英文版提示词（更推荐，输出更稳定）：</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">I need you to help me set up a YouTube video download environment on macOS and write a complete Python script.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">## My Environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Device: MacBook (Apple Silicon, M-series chip)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- OS: macOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">## What I Need You To Do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">### Step 1 — Check and Install Dependencies</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Check whether the following tools are installed one by one. If not, provide the install command:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">1. Homebrew: via https://brew.sh/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">2. ffmpeg: via brew install ffmpeg</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3. Node.js: via brew install node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">4. yt-dlp: via pip3 install yt-dlp --break-system-packages</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">### Step 2 — Write the Python Script</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Filename: youtube_downloader.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Requirements:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Use subprocess to call the yt-dlp CLI (do NOT use the yt_dlp Python API)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Video format: H.264 codec, MP4 container</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Quality: automatically select the highest available quality</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Cookies: read from Safari (--cookies-from-browser safari)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Node.js path: /opt/homebrew/bin/node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Include --remote-components ejs:github to solve JS challenges</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Output directory: Desktop (~/Desktop)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Accept video URL as a command-line argument: python3 youtube_downloader.py "YouTube URL"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Add comments in English</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">### Step 3 — Tell Me How To Use It</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Explain how to run the script in one sentence.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">## Important Notes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- macOS root directory / is read-only — do NOT output files there</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Terminal needs Full Disk Access enabled in System Settings to read Safari cookies — please remind me to do this</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- Do NOT use "ios" as the player_client — it does not support cookies</span><br></div></code></pre></div></div>
<blockquote>
<p>AI 能帮你写好代码，但<strong>环境还是要自己配置</strong>（就是上面那四个工具）。如果你连这个也不想手动做，可以用 Claude Code / Codex 帮你自动执行安装命令，一路点 yes 就行。</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="使用步骤">使用步骤<a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#%E4%BD%BF%E7%94%A8%E6%AD%A5%E9%AA%A4" class="hash-link" aria-label="使用步骤的直接链接" title="使用步骤的直接链接" translate="no">​</a></h2>
<p>配置好环境之后，每次使用只需要一条命令。</p>
<p>打开终端，输入：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ~/Downloads/main.py "在这里粘贴YouTube链接"</span><br></div></code></pre></div></div>
<blockquote>
<p>如果你把 <code>main.py</code> 放在了其他位置，把 <code>~/Downloads/main.py</code> 替换成实际路径即可。<code>~/Downloads</code> 代表你的下载文件夹，不需要改成自己的用户名。</p>
</blockquote>
<p>例如：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ~/Downloads/main.py "https://www.youtube.com/watch?v=5wvq8w7YBXU"</span><br></div></code></pre></div></div>
<p>回车之后等待下载完成，视频会自动出现在<strong>桌面</strong>上。</p>
<hr>
<p><strong>每次使用前确认两件事：</strong></p>
<p>① 代理已开启（Shadowrocket 处于连接状态）</p>
<p>② 终端窗口是新开的（不是几天前没关的那个）</p>
<p>环境只需要搭建一次，之后换任何 YouTube 链接都可以直接用。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="faq">FAQ<a href="https://mikeq95.github.io/blog/2026/05/29/download-youtube-videos-using-a-python-script#faq" class="hash-link" aria-label="FAQ的直接链接" title="FAQ的直接链接" translate="no">​</a></h2>
<p><strong>什么是 Homebrew？</strong> 我的另一篇文章写过，可以去看一下。</p>
<p><strong>下载之后的视频画质是多少？</strong> 默认最高画质，脚本里这行代码决定了分辨率选择逻辑：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">"bestvideo[vcodec^=avc1]+bestaudio/bestvideo[ext=mp4]+bestaudio/best"</span><br></div></code></pre></div></div>
<p>意思是：在所有 H.264 编码的视频流里，选画质最高的那个。</p>
<p><strong>终端卡住不动？</strong> 首次运行会从网上下载解密脚本，国内网络可能较慢，耐心等一下。确认代理已开启，或者等个 1～2 分钟再看。</p>
<p><strong>提示 <code>command not found</code>？</strong> 某个依赖没装好。按照"配置运行环境"一节逐一验证，找到没安装的那个重新装一遍。</p>
<p><strong>提示 <code>permission denied</code> 或 Cookie 读取失败？</strong> 终端没有完全磁盘访问权限。去系统设置 → 隐私与安全性 → 完全磁盘访问权限 → 添加「终端」，然后重新开一个终端窗口再试。</p>
<p><strong>下载失败，看不懂报错？</strong> 按顺序排查：① 代理是否开启 ② yt-dlp 是否是最新版（<code>pip3 install -U yt-dlp --break-system-packages</code>）③ 链接是否完整、有没有被引号包裹。</p>]]></content:encoded>
            <category>macOS</category>
        </item>
        <item>
            <title><![CDATA[介绍 Homebrew]]></title>
            <link>https://mikeQ95.github.io/blog/2026/05/28/homebrew-tutorials</link>
            <guid>https://mikeQ95.github.io/blog/2026/05/28/homebrew-tutorials</guid>
            <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA["macOS 上最流行的命令行软件安装器。"]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>"macOS 上最流行的命令行软件安装器。"</p>
</blockquote>
<p>在 Mac 上装软件，你是不是还在官网一个个找安装包？有了 Homebrew，一条命令搞定一切——安装、更新、卸载，全部统一管理，告别手动下载的烦恼。</p>
<p>Homebrew 是一个用于 macOS 和 Linux 的<a href="https://clearlove7-ai.vercel.app/?word=%E5%8C%85%E7%AE%A1%E7%90%86%E5%99%A8&amp;postId=2026-05-28-homebrew-tutorials" target="_blank" rel="noopener noreferrer" class="">包管理器</a>，它的核心价值就一句话：<strong>用命令行统一管理你电脑上的所有软件</strong>。</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安装-homebrew">安装 Homebrew<a href="https://mikeq95.github.io/blog/2026/05/28/homebrew-tutorials#%E5%AE%89%E8%A3%85-homebrew" class="hash-link" aria-label="安装 Homebrew的直接链接" title="安装 Homebrew的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="在中国">在中国<a href="https://mikeq95.github.io/blog/2026/05/28/homebrew-tutorials#%E5%9C%A8%E4%B8%AD%E5%9B%BD" class="hash-link" aria-label="在中国的直接链接" title="在中国的直接链接" translate="no">​</a></h3>
<p>由于网络原因，推荐使用国内镜像脚本：<a href="https://github.com/ineo6/homebrew-install" target="_blank" rel="noopener noreferrer" class="">来源</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="在中国以外">在中国以外<a href="https://mikeq95.github.io/blog/2026/05/28/homebrew-tutorials#%E5%9C%A8%E4%B8%AD%E5%9B%BD%E4%BB%A5%E5%A4%96" class="hash-link" aria-label="在中国以外的直接链接" title="在中国以外的直接链接" translate="no">​</a></h3>
<p>使用官方脚本：<a href="https://brew.sh/" target="_blank" rel="noopener noreferrer" class="">来源</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</span><br></div></code></pre></div></div>
<blockquote>
<p>"中国有他自己的世界，嗯"</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="核心概念formula-和-cask">核心概念：formula 和 cask<a href="https://mikeq95.github.io/blog/2026/05/28/homebrew-tutorials#%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5formula-%E5%92%8C-cask" class="hash-link" aria-label="核心概念：formula 和 cask的直接链接" title="核心概念：formula 和 cask的直接链接" translate="no">​</a></h2>
<p>在用 Homebrew 之前，先搞清楚两个概念：</p>
<ul>
<li class=""><strong><a href="https://clearlove7-ai.vercel.app/?word=formula&amp;postId=2026-05-28-homebrew-tutorials" target="_blank" rel="noopener noreferrer" class="">formula</a>（配方）</strong>：用来安装<strong>命令行工具</strong>，比如 <code>git</code>、<code>python</code>，没有图形界面</li>
<li class=""><strong><a href="https://clearlove7-ai.vercel.app/?word=cask&amp;postId=2026-05-28-homebrew-tutorials" target="_blank" rel="noopener noreferrer" class="">cask</a>（酒桶）</strong>：用来安装<strong>有图形界面的 App</strong>，比如 Firefox、VS Code</li>
</ul>
<blockquote>
<p>我说的不是英雄联盟的那个酒桶😂</p>
</blockquote>
<p>简单记忆：<strong>有图标的 App → cask，纯命令行工具 → formula</strong>。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安装软件">安装软件<a href="https://mikeq95.github.io/blog/2026/05/28/homebrew-tutorials#%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6" class="hash-link" aria-label="安装软件的直接链接" title="安装软件的直接链接" translate="no">​</a></h2>
<p>安装命令行工具（formula），比如 git：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew install git  # 安装 git</span><br></div></code></pre></div></div>
<p>安装图形界面 App（cask），比如 Firefox：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew install --cask firefox  # 安装 Firefox</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="更新软件">更新软件<a href="https://mikeq95.github.io/blog/2026/05/28/homebrew-tutorials#%E6%9B%B4%E6%96%B0%E8%BD%AF%E4%BB%B6" class="hash-link" aria-label="更新软件的直接链接" title="更新软件的直接链接" translate="no">​</a></h2>
<p>在升级之前，先刷新一下 Homebrew 的软件列表，确保拿到最新版本：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew update  # 刷新软件列表（类似刷新 App Store）</span><br></div></code></pre></div></div>
<p>然后再升级指定软件，比如 Python：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew upgrade python  # 升级 Python 到最新版</span><br></div></code></pre></div></div>
<blockquote>
<p><strong>注意</strong>：<code>brew update</code> 是更新 Homebrew 自己的清单，<code>brew upgrade</code> 才是真正升级软件，两者不一样哦。</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="锁定版本">锁定版本<a href="https://mikeq95.github.io/blog/2026/05/28/homebrew-tutorials#%E9%94%81%E5%AE%9A%E7%89%88%E6%9C%AC" class="hash-link" aria-label="锁定版本的直接链接" title="锁定版本的直接链接" translate="no">​</a></h2>
<p>有时候你不想让某个软件自动升级——比如你的项目依赖特定版本的 Python，升级了反而会出问题。这时候可以用 <code>pin</code> 锁定版本：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew pin python  # 锁定 python，阻止自动升级</span><br></div></code></pre></div></div>
<p>查看已经锁定的软件：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew list --pinned</span><br></div></code></pre></div></div>
<p>想解锁了，允许升级：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew unpin python  # 解锁 python</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="卸载软件">卸载软件<a href="https://mikeq95.github.io/blog/2026/05/28/homebrew-tutorials#%E5%8D%B8%E8%BD%BD%E8%BD%AF%E4%BB%B6" class="hash-link" aria-label="卸载软件的直接链接" title="卸载软件的直接链接" translate="no">​</a></h2>
<p>卸载命令行工具：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew uninstall node  # 卸载 node</span><br></div></code></pre></div></div>
<p>卸载图形界面 App：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">brew uninstall --cask firefox  # 卸载 Firefox</span><br></div></code></pre></div></div>
<p>卸载 Homebrew 本身：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/uninstall.sh)"</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结">总结<a href="https://mikeq95.github.io/blog/2026/05/28/homebrew-tutorials#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>操作</th><th>命令</th></tr></thead><tbody><tr><td>安装命令行工具</td><td><code>brew install &lt;名称&gt;</code></td></tr><tr><td>安装图形 App</td><td><code>brew install --cask &lt;名称&gt;</code></td></tr><tr><td>刷新软件列表</td><td><code>brew update</code></td></tr><tr><td>升级软件</td><td><code>brew upgrade &lt;名称&gt;</code></td></tr><tr><td>锁定版本</td><td><code>brew pin &lt;名称&gt;</code></td></tr><tr><td>查看已锁定</td><td><code>brew list --pinned</code></td></tr><tr><td>解锁版本</td><td><code>brew unpin &lt;名称&gt;</code></td></tr><tr><td>卸载软件</td><td><code>brew uninstall &lt;名称&gt;</code></td></tr></tbody></table>
<p>以上这些命令，已经覆盖了日常使用 Homebrew 的绝大多数场景。在我看来，Homebrew 是 Mac 上必装的工具，实在是太方便了。</p>]]></content:encoded>
            <category>macOS</category>
        </item>
        <item>
            <title><![CDATA[Marker 使用教程]]></title>
            <link>https://mikeQ95.github.io/blog/2026/05/28/marker-github-project-tutorial</link>
            <guid>https://mikeQ95.github.io/blog/2026/05/28/marker-github-project-tutorial</guid>
            <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[我个人很喜欢浏览instructables这个网站，网站很贴心的在右上角给了你”将文章导出为PDF”的选项，但是没有”导出为markdown”的选项。我很希望格式是md，因为在AI更喜欢读md而不是PDF的文件。我在网上搜索，最终找到这个github项目。]]></description>
            <content:encoded><![CDATA[<p>我个人很喜欢浏览<a href="https://www.instructables.com/" target="_blank" rel="noopener noreferrer" class="">instructables</a>这个网站，网站很贴心的在右上角给了你”将文章导出为PDF”的选项，但是没有”导出为markdown”的选项。我很希望格式是md，因为在AI更喜欢读md而不是PDF的文件。我在网上搜索，最终找到这个github项目。
Marker 是一个开源工具，可以把 PDF、Word、PPT 等文件转成 Markdown 格式，速度快，识别准确率也不错。这篇文章记录一下怎么把它跑起来。</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="部署环境">部署环境<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E9%83%A8%E7%BD%B2%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="部署环境的直接链接" title="部署环境的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="前置条件">前置条件<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E5%89%8D%E7%BD%AE%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前置条件的直接链接" title="前置条件的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Python 3.10 或以上</li>
<li class="">推荐用 <a href="https://clearlove7-ai.vercel.app/?word=Conda&amp;postId=2026-05-28-marker-github-project-tutorial" target="_blank" rel="noopener noreferrer" class="">Conda</a> 管理环境（下面会说为什么）</li>
</ul>
<p>如果你用的是 Mac M1/M2/M3，不需要额外配置，PyTorch 已经原生支持。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="安装-conda">安装 Conda<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E5%AE%89%E8%A3%85-conda" class="hash-link" aria-label="安装 Conda的直接链接" title="安装 Conda的直接链接" translate="no">​</a></h3>
<p>推荐装 Miniforge，体积小，对 Apple Silicon 支持好。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># macOS Apple Silicon</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">bash Miniforge3-MacOSX-arm64.sh</span><br></div></code></pre></div></div>
<p>装完之后运行这条命令，让终端认识 conda：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">~/miniforge3/bin/conda init zsh</span><br></div></code></pre></div></div>
<p>然后关掉终端，重新打开。你会看到命令行前面多了一个 <code>(base)</code>，说明 conda 好了。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="创建虚拟环境">创建虚拟环境<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="创建虚拟环境的直接链接" title="创建虚拟环境的直接链接" translate="no">​</a></h3>
<p>简单理解：<a href="https://clearlove7-ai.vercel.app/?word=%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83&amp;postId=2026-05-28-marker-github-project-tutorial" target="_blank" rel="noopener noreferrer" class="">虚拟环境</a>就是给这个项目单独开一个"房间"，里面装的东西不会影响你电脑上别的项目。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">conda create -n marker python=3.11 -y</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">conda activate marker</span><br></div></code></pre></div></div>
<p>进入环境后，命令行前面会从 <code>(base)</code> 变成 <code>(marker)</code>。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="安装-marker">安装 Marker<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E5%AE%89%E8%A3%85-marker" class="hash-link" aria-label="安装 Marker的直接链接" title="安装 Marker的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">pip install marker-pdf</span><br></div></code></pre></div></div>
<p>如果还需要转 Word、PPT、EPUB 这些格式：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">pip install marker-pdf[full]</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="验证一下">验证一下<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E9%AA%8C%E8%AF%81%E4%B8%80%E4%B8%8B" class="hash-link" aria-label="验证一下的直接链接" title="验证一下的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">marker_single --help</span><br></div></code></pre></div></div>
<p>等个十几秒，输出一堆参数说明就是成功了。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="以后每次用之前">以后每次用之前<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E4%BB%A5%E5%90%8E%E6%AF%8F%E6%AC%A1%E7%94%A8%E4%B9%8B%E5%89%8D" class="hash-link" aria-label="以后每次用之前的直接链接" title="以后每次用之前的直接链接" translate="no">​</a></h3>
<p>每次打开终端，记得先进环境：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">conda activate marker</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="怎么用">怎么用<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E6%80%8E%E4%B9%88%E7%94%A8" class="hash-link" aria-label="怎么用的直接链接" title="怎么用的直接链接" translate="no">​</a></h2>
<p>基本格式就一行：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">marker_single 你的文件路径 --output_dir 输出目录</span><br></div></code></pre></div></div>
<p>几个常用参数：</p>
<ul>
<li class=""><code>--output_dir</code>：指定输出到哪个文件夹</li>
<li class=""><code>--output_format</code>：输出格式，可以选 markdown、json、html</li>
<li class=""><code>--page_range</code>：只转某几页，比如 <code>"0,5-10"</code>（页码从 0 开始）</li>
<li class=""><code>--force_ocr</code>：强制 <a href="https://clearlove7-ai.vercel.app/?word=OCR&amp;postId=2026-05-28-marker-github-project-tutorial" target="_blank" rel="noopener noreferrer" class="">OCR</a>，PDF 里文字是图片时用这个</li>
<li class=""><code>--langs zh</code>：告诉它文档是中文，识别更准</li>
<li class=""><code>--use_llm</code>：用大模型辅助，精度更高，需要配 API Key</li>
</ul>
<p>转换完成后，输出目录里会有一个 <code>.md</code> 文件和提取出来的图片，用 Typora 或 Obsidian 打开就能正常显示。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="实际使用示例">实际使用示例<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E5%AE%9E%E9%99%85%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="实际使用示例的直接链接" title="实际使用示例的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="转一篇论文">转一篇论文<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E8%BD%AC%E4%B8%80%E7%AF%87%E8%AE%BA%E6%96%87" class="hash-link" aria-label="转一篇论文的直接链接" title="转一篇论文的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">marker_single ~/Downloads/paper.pdf \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --output_dir ~/Documents/notes</span><br></div></code></pre></div></div>
<p>第一次跑会下载 AI 模型，大概 1GB 左右，耐心等一下。跑完之后数学公式会变成 <a href="https://clearlove7-ai.vercel.app/?word=LaTeX&amp;postId=2026-05-28-marker-github-project-tutorial" target="_blank" rel="noopener noreferrer" class="">LaTeX</a>，表格和标题格式都会保留，效果还不错。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="转扫描版-pdf">转扫描版 PDF<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E8%BD%AC%E6%89%AB%E6%8F%8F%E7%89%88-pdf" class="hash-link" aria-label="转扫描版 PDF的直接链接" title="转扫描版 PDF的直接链接" translate="no">​</a></h3>
<p>扫描版 PDF 里的文字是图片，普通方式识别不出来，要加 <code>--force_ocr</code>：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">marker_single ~/Downloads/scanned.pdf \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --output_dir ~/Desktop/output \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --force_ocr \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --langs zh</span><br></div></code></pre></div></div>
<p>这个模式比较慢，一页大约要 5～15 秒，别中途关掉。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="只转某几页输出-json">只转某几页，输出 JSON<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E5%8F%AA%E8%BD%AC%E6%9F%90%E5%87%A0%E9%A1%B5%E8%BE%93%E5%87%BA-json" class="hash-link" aria-label="只转某几页，输出 JSON的直接链接" title="只转某几页，输出 JSON的直接链接" translate="no">​</a></h3>
<p>比如一份 200 页的报告，只需要第 1、5 到 10、20 页：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">marker_single ~/Downloads/report.pdf \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --output_dir ~/Desktop/output \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --page_range "0,4-9,19" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --output_format json</span><br></div></code></pre></div></div>
<p>JSON 格式输出的是结构化数据，适合拿来做进一步处理，比如导入数据库或者喂给大模型。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="用-ai-工具帮你自动部署">用 AI 工具帮你自动部署<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E7%94%A8-ai-%E5%B7%A5%E5%85%B7%E5%B8%AE%E4%BD%A0%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="用 AI 工具帮你自动部署的直接链接" title="用 AI 工具帮你自动部署的直接链接" translate="no">​</a></h2>
<p>如果觉得上面的步骤麻烦，可以把下面这段提示词丢给 Claude Code、Cursor 这类 AI 工具，让它帮你自动把环境跑通。</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">你是一个专业的 Python 环境配置工程师。请帮我在这台电脑上完整部署 marker-pdf 的运行环境。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">我的环境：macOS Apple Silicon（M1 Pro），Shell 为 zsh，Conda 安装在 ~/miniforge3。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">请依次完成以下步骤，每步执行完检查结果，遇到报错立即分析并修复：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">1. 检查 conda 是否可用（conda --version），不可用则运行 ~/miniforge3/bin/conda init zsh 并提示我重开终端</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">2. 创建并激活虚拟环境：conda create -n marker python=3.11 -y &amp;&amp; conda activate marker</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3. 安装 marker：pip install marker-pdf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">4. 验证 PyTorch：python -c "import torch; print(torch.__version__)"，若报 libtorch_cpu.dylib 错误，立即重装：pip uninstall torch torchvision torchaudio -y &amp;&amp; pip install torch torchvision torchaudio</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">5. 验证 marker：运行 marker_single --help，等待约 20 秒，输出参数列表即为成功</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">每步执行前先告诉我你要做什么，不要修改系统级配置。完成后输出已安装的 Python、PyTorch、marker-pdf 版本号。</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="卸载">卸载<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E5%8D%B8%E8%BD%BD" class="hash-link" aria-label="卸载的直接链接" title="卸载的直接链接" translate="no">​</a></h2>
<p>只卸载 marker 包，保留环境：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">conda activate marker</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pip uninstall marker-pdf</span><br></div></code></pre></div></div>
<p>直接删掉整个环境（更彻底）：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">conda deactivate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">conda env remove -n marker</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="常见问题">常见问题<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" class="hash-link" aria-label="常见问题的直接链接" title="常见问题的直接链接" translate="no">​</a></h2>
<p><strong>终端卡住不动？</strong> 第一次运行会下载模型，国内网络可能很慢。给终端配个代理再试：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">export https_proxy=http://127.0.0.1:你的端口</span><br></div></code></pre></div></div>
<p><strong>Mac 上报 <code>libtorch_cpu.dylib</code> 错误？</strong> 重装一下 <a href="https://clearlove7-ai.vercel.app/?word=PyTorch&amp;postId=2026-05-28-marker-github-project-tutorial" target="_blank" rel="noopener noreferrer" class="">PyTorch</a> 就好：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">pip uninstall torch torchvision torchaudio -y</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pip install torch torchvision torchaudio</span><br></div></code></pre></div></div>
<p><strong>中文识别效果差？</strong> 加上 <code>--langs zh</code>，如果是扫描件再加 <code>--force_ocr</code>。</p>
<p><strong>提示 command not found？</strong> 没激活环境，先运行 <code>conda activate marker</code>。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结">总结<a href="https://mikeq95.github.io/blog/2026/05/28/marker-github-project-tutorial#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接" translate="no">​</a></h2>
<p>Marker 本质上是一个<strong>本地运行的文档解析引擎</strong>，底层用的是专门针对文档版面训练的 AI 模型，而不是通用大模型，所以速度快、可离线运行、不需要 API Key 就能有不错的效果。它最擅长处理格式复杂的学术 PDF——数学公式转 LaTeX、表格保留结构、图片单独提取，这些场景下的输出质量明显优于直接复制粘贴。如果你有大量文档需要整理进知识库，或者想把 PDF 内容喂给大模型二次处理，Marker 是目前开源方案里性价比最高的选择之一。</p>
<hr>
<p><em>基于 <a href="https://github.com/datalab-to/marker" target="_blank" rel="noopener noreferrer" class="">datalab-to/marker</a>，适用于 marker v1.x</em></p>]]></content:encoded>
            <category>GitHub</category>
            <category>macOS</category>
        </item>
        <item>
            <title><![CDATA[我最喜欢的歌（周杰伦）]]></title>
            <link>https://mikeQ95.github.io/blog/2026/05/24/my-favorite-songs</link>
            <guid>https://mikeQ95.github.io/blog/2026/05/24/my-favorite-songs</guid>
            <pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[周杰伦的经典歌曲陪伴了我的整个青春。以下是我最喜欢的一些歌曲：]]></description>
            <content:encoded><![CDATA[<p>周杰伦的经典歌曲陪伴了我的整个青春。以下是我最喜欢的一些歌曲：</p>
<!-- -->
<ol>
<li class=""><strong>七里香</strong> - 经典的旋律，夏天的味道。</li>
<li class=""><strong>夜曲</strong> - 前奏一响，回忆涌上心头。</li>
<li class=""><strong>晴天</strong> - 青春期的暗恋与遗憾。</li>
<li class=""><strong>以父之名</strong> - 暗黑风格的巅峰之作。</li>
<li class=""><strong>青花瓷</strong> - 唯美的中国风。</li>
</ol>
<p>这些歌曲不仅仅是旋律的组合，更是岁月的印记。</p>
<hr>
<p>想听这些歌？点击下方进入播放器，支持上传本地音频和 <code>.lrc</code> 歌词文件，还原 Apple Music 风格的滚动歌词体验。</p>
<a href="https://mikeq95.github.io/music-player" target="_blank" rel="noopener noreferrer" style="display:flex;align-items:center;gap:12px;padding:16px 20px;border-radius:12px;border:1px solid var(--ifm-color-emphasis-300);text-decoration:none;color:inherit;margin-top:12px;transition:box-shadow 0.2s"><span style="font-size:32px">🎵</span><div><div style="font-weight:bold;font-size:16px">打开在线音乐播放器</div><div style="font-size:13px;color:var(--ifm-color-emphasis-500);margin-top:2px">歌词滚动 · Apple Music 风格 · 在新标签页中打开</div></div><span style="margin-left:auto;font-size:20px;color:var(--ifm-color-emphasis-400)">↗</span></a>]]></content:encoded>
            <category>Music</category>
            <category>Jay Chou</category>
        </item>
        <item>
            <title><![CDATA[🌐 macOS 网络重置命令速查]]></title>
            <link>https://mikeQ95.github.io/blog/2025/05/16/quick-reference-for-macOS network-reset-commands</link>
            <guid>https://mikeQ95.github.io/blog/2025/05/16/quick-reference-for-macOS network-reset-commands</guid>
            <pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[一般情况下，只需运行 DNS 刷新 + DHCP 重置 即可解决大多数网络问题。]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>一般情况下，只需运行 <strong>DNS 刷新 + DHCP 重置</strong> 即可解决大多数网络问题。</p>
</blockquote>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="常用命令按推荐顺序">常用命令（按推荐顺序）<a href="https://mikeq95.github.io/blog/2025/05/16/quick-reference-for-macOS%20network-reset-commands#%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%8C%89%E6%8E%A8%E8%8D%90%E9%A1%BA%E5%BA%8F" class="hash-link" aria-label="常用命令（按推荐顺序）的直接链接" title="常用命令（按推荐顺序）的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-刷新-dns-缓存">1. 刷新 <a href="https://clearlove7-ai.vercel.app/?word=DNS%E7%BC%93%E5%AD%98&amp;postId=2025-05-16-quick-reference-for-macOS%20network-reset-commands" target="_blank" rel="noopener noreferrer" class="">DNS 缓存</a><a href="https://mikeq95.github.io/blog/2025/05/16/quick-reference-for-macOS%20network-reset-commands#1-%E5%88%B7%E6%96%B0-dns-%E7%BC%93%E5%AD%98" class="hash-link" aria-label="1-刷新-dns-缓存的直接链接" title="1-刷新-dns-缓存的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-释放并重新获取-ipdhcp">2. 释放并重新获取 IP（<a href="https://clearlove7-ai.vercel.app/?word=DHCP&amp;postId=2025-05-16-quick-reference-for-macOS%20network-reset-commands" target="_blank" rel="noopener noreferrer" class="">DHCP</a>）<a href="https://mikeq95.github.io/blog/2025/05/16/quick-reference-for-macOS%20network-reset-commands#2-%E9%87%8A%E6%94%BE%E5%B9%B6%E9%87%8D%E6%96%B0%E8%8E%B7%E5%8F%96-ipdhcp" class="hash-link" aria-label="2-释放并重新获取-ipdhcp的直接链接" title="2-释放并重新获取-ipdhcp的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sudo ipconfig set en0 DHCP</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-重启-wi-fi">3. 重启 Wi-Fi<a href="https://mikeq95.github.io/blog/2025/05/16/quick-reference-for-macOS%20network-reset-commands#3-%E9%87%8D%E5%90%AF-wi-fi" class="hash-link" aria-label="3. 重启 Wi-Fi的直接链接" title="3. 重启 Wi-Fi的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">networksetup -setairportpower en0 off &amp;&amp; networksetup -setairportpower en0 on</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-重启网络接口">4. 重启网络接口<a href="https://mikeq95.github.io/blog/2025/05/16/quick-reference-for-macOS%20network-reset-commands#4-%E9%87%8D%E5%90%AF%E7%BD%91%E7%BB%9C%E6%8E%A5%E5%8F%A3" class="hash-link" aria-label="4. 重启网络接口的直接链接" title="4. 重启网络接口的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sudo ifconfig en0 down &amp;&amp; sudo ifconfig en0 up</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-完整重置网络设置较彻底">🔧 完整重置网络设置（较彻底）<a href="https://mikeq95.github.io/blog/2025/05/16/quick-reference-for-macOS%20network-reset-commands#-%E5%AE%8C%E6%95%B4%E9%87%8D%E7%BD%AE%E7%BD%91%E7%BB%9C%E8%AE%BE%E7%BD%AE%E8%BE%83%E5%BD%BB%E5%BA%95" class="hash-link" aria-label="🔧 完整重置网络设置（较彻底）的直接链接" title="🔧 完整重置网络设置（较彻底）的直接链接" translate="no">​</a></h2>
<p>删除网络偏好设置文件，重启后自动重建：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sudo rm /Library/Preferences/SystemConfiguration/com.apple.network.identification.plist</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo rm /Library/Preferences/SystemConfiguration/preferences.plist</span><br></div></code></pre></div></div>
<blockquote>
<p>⚠️ <strong>注意：</strong> 执行后需重启 Mac，所有网络配置将重置为默认状态，Wi-Fi 等需重新配置。</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-补充说明">📌 补充说明<a href="https://mikeq95.github.io/blog/2025/05/16/quick-reference-for-macOS%20network-reset-commands#-%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E" class="hash-link" aria-label="📌 补充说明的直接链接" title="📌 补充说明的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>接口</th><th>说明</th></tr></thead><tbody><tr><td><code>en0</code></td><td>通常为 Wi-Fi 无线网卡</td></tr><tr><td><code>en1</code></td><td>通常为有线以太网卡</td></tr></tbody></table>
<p>如不确定接口名称，可运行 <code>ifconfig</code> 查看确认。</p>]]></content:encoded>
            <category>macOS</category>
        </item>
        <item>
            <title><![CDATA[搜索引擎使用指南]]></title>
            <link>https://mikeQ95.github.io/blog/2026/05/16/earch-engine-user-guide</link>
            <guid>https://mikeQ95.github.io/blog/2026/05/16/earch-engine-user-guide</guid>
            <pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[一、搜索引擎选择]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="一搜索引擎选择">一、搜索引擎选择<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E4%B8%80%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E9%80%89%E6%8B%A9" class="hash-link" aria-label="一、搜索引擎选择的直接链接" title="一、搜索引擎选择的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="推荐排序">推荐排序<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E6%8E%A8%E8%8D%90%E6%8E%92%E5%BA%8F" class="hash-link" aria-label="推荐排序的直接链接" title="推荐排序的直接链接" translate="no">​</a></h4>
<p>抛弃百度，以下引擎均可替代：</p>
<table><thead><tr><th>引擎</th><th>适合场景</th></tr></thead><tbody><tr><td><strong>Google</strong></td><td>日常搜索首选</td></tr><tr><td><strong>DuckDuckGo</strong></td><td>争议话题、隐私保护</td></tr><tr><td><strong>Yandex</strong></td><td>劲爆内容、软件资源、音乐</td></tr><tr><td><strong>Brave</strong></td><td>日常搜索备选</td></tr><tr><td><strong>Bing（国内版）</strong></td><td>萌新过渡使用</td></tr></tbody></table>
<!-- -->
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="各引擎特点">各引擎特点<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E5%90%84%E5%BC%95%E6%93%8E%E7%89%B9%E7%82%B9" class="hash-link" aria-label="各引擎特点的直接链接" title="各引擎特点的直接链接" translate="no">​</a></h4>
<ul>
<li class=""><strong>Google</strong>：搜争议内容时结果偏 PC，反方观点少且力度弱，不够尖锐</li>
<li class=""><strong>DuckDuckGo</strong>：比 Google 中立，搜索词无高亮显示（可用脚本改善，见文末）</li>
<li class=""><strong>Yandex</strong>：完全不理会西方政治正确那套，适合搜敏感/劲爆内容<!-- -->
<ul>
<li class="">例：搜「爱泼斯坦名单」，只有 Yandex 将名单置顶</li>
<li class="">例：搜「好莱坞丑闻」，只有 Yandex 显示激烈结果</li>
</ul>
</li>
<li class=""><strong><a href="https://clearlove7-ai.vercel.app/?word=%E6%94%BF%E6%B2%BB%E6%AD%A3%E7%A1%AE&amp;postId=2026-05-16-earch-engine-user-guide" target="_blank" rel="noopener noreferrer" class="">政治正确</a>程度</strong>：<code>Google &gt; Brave &gt; DuckDuckGo &gt; Yandex</code></li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="二实用搜索技巧">二、实用搜索技巧<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E4%BA%8C%E5%AE%9E%E7%94%A8%E6%90%9C%E7%B4%A2%E6%8A%80%E5%B7%A7" class="hash-link" aria-label="二、实用搜索技巧的直接链接" title="二、实用搜索技巧的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="软件资源学生党">软件资源（学生党）<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%BA%90%E5%AD%A6%E7%94%9F%E5%85%9A" class="hash-link" aria-label="软件资源（学生党）的直接链接" title="软件资源（学生党）的直接链接" translate="no">​</a></h4>
<p>用 <strong>Yandex</strong> 搜索：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">软件名 + cracked / premium / unlocked</span><br></div></code></pre></div></div>
<p>安卓、PC、Mac 均适用。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="免费音乐下载学生党">免费音乐下载（学生党）<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E5%85%8D%E8%B4%B9%E9%9F%B3%E4%B9%90%E4%B8%8B%E8%BD%BD%E5%AD%A6%E7%94%9F%E5%85%9A" class="hash-link" aria-label="免费音乐下载（学生党）的直接链接" title="免费音乐下载（学生党）的直接链接" translate="no">​</a></h4>
<p>用 <strong>Yandex</strong> 搜索：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">歌名 + free download</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">歌名 + Скачать</span><br></div></code></pre></div></div>
<p>结果中找带俄语的链接，一般可直接下载。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="限定网站搜索">限定网站搜索<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E9%99%90%E5%AE%9A%E7%BD%91%E7%AB%99%E6%90%9C%E7%B4%A2" class="hash-link" aria-label="限定网站搜索的直接链接" title="限定网站搜索的直接链接" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">关键词 site:https://x.com</span><br></div></code></pre></div></div>
<p>适合某些自带搜索功能较差的资源网站。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="搜电子书annas-archive--z-library">搜电子书（Anna's Archive / Z-Library）<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E6%90%9C%E7%94%B5%E5%AD%90%E4%B9%A6annas-archive--z-library" class="hash-link" aria-label="搜电子书（Anna's Archive / Z-Library）的直接链接" title="搜电子书（Anna's Archive / Z-Library）的直接链接" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">关键词 + edition      # 搜再版书，质量通常更好，例：tort edition</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">关键词 + 译           # 搜中译版，例：文明史 译</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="用豆瓣找好书">用豆瓣找好书<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E7%94%A8%E8%B1%86%E7%93%A3%E6%89%BE%E5%A5%BD%E4%B9%A6" class="hash-link" aria-label="用豆瓣找好书的直接链接" title="用豆瓣找好书的直接链接" translate="no">​</a></h4>
<p>豆瓣搜索关键词 → 筛选高分书单；书籍详情页下方也会推荐同类书籍。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="三duckduckgo-搜索词高亮脚本">三、DuckDuckGo 搜索词高亮脚本<a href="https://mikeq95.github.io/blog/2026/05/16/earch-engine-user-guide#%E4%B8%89duckduckgo-%E6%90%9C%E7%B4%A2%E8%AF%8D%E9%AB%98%E4%BA%AE%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="三、DuckDuckGo 搜索词高亮脚本的直接链接" title="三、DuckDuckGo 搜索词高亮脚本的直接链接" translate="no">​</a></h3>
<blockquote>
<p>需安装 <a href="https://clearlove7-ai.vercel.app/?word=Tampermonkey&amp;postId=2026-05-16-earch-engine-user-guide" target="_blank" rel="noopener noreferrer" class="">Tampermonkey</a> 浏览器插件后使用。</p>
</blockquote>
<p>javascript</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// ==UserScript==</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// @name         DuckDuckGo 搜索词高亮</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// @namespace    http://tampermonkey.net/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// @version      2025-08-05</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// @description  为 DuckDuckGo 搜索结果中的关键词添加高亮颜色</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// @author       You</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// @match        https://duckduckgo.com/?*</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// @grant        GM_addStyle</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ==/UserScript==</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'use strict'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function maybe-class-name" style="color:#d73a49">GM_addStyle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">        .kY2IgmnCmOGjharHErah span b {</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">            color: #ff897e !important;</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">    </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Collection</category>
        </item>
        <item>
            <title><![CDATA[用 Kokoro 把文章变成播客音频 —— 从零部署教程]]></title>
            <link>https://mikeQ95.github.io/blog/2026/05/16/kokoro-tts-tutorial</link>
            <guid>https://mikeQ95.github.io/blog/2026/05/16/kokoro-tts-tutorial</guid>
            <pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本文记录了如何在 Mac (Apple Silicon) 上通过 Docker 本地部署 Kokoro TTS，将英文/中文文章转换为高质量音频。]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>本文记录了如何在 Mac (Apple Silicon) 上通过 <a href="https://clearlove7-ai.vercel.app/?word=Docker&amp;postId=2026-05-16-kokoro-tts-tutorial" target="_blank" rel="noopener noreferrer" class="">Docker</a> 本地部署 Kokoro <a href="https://clearlove7-ai.vercel.app/?word=TTS&amp;postId=2026-05-16-kokoro-tts-tutorial" target="_blank" rel="noopener noreferrer" class="">TTS</a>，将英文/中文文章转换为高质量音频。</p>
</blockquote>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一为什么选-kokoro">一、为什么选 Kokoro？<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E4%B8%80%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89-kokoro" class="hash-link" aria-label="一、为什么选 Kokoro？的直接链接" title="一、为什么选 Kokoro？的直接链接" translate="no">​</a></h2>
<p>在调研了多个开源 TTS 方案后，最终选择&nbsp;<strong>Kokoro + kokoro-web</strong>&nbsp;的原因：</p>
<table><thead><tr><th>方案</th><th>Stars</th><th>英文效果</th><th>声音种类</th><th>协议</th></tr></thead><tbody><tr><td><strong>Kokoro</strong></td><td>7k+</td><td>⭐ 顶级</td><td>88 种可选</td><td><a href="https://clearlove7-ai.vercel.app/?word=Apache+2.0&amp;postId=2026-05-16-kokoro-tts-tutorial" target="_blank" rel="noopener noreferrer" class="">Apache 2.0</a></td></tr><tr><td>ChatTTS</td><td>~33k</td><td>中等</td><td>随机生成，不可选</td><td>CC BY-NC（不可商用）</td></tr><tr><td>CosyVoice</td><td>高</td><td>一般</td><td>中文最强</td><td>Apache 2.0</td></tr></tbody></table>
<p><strong>Kokoro 的核心优势：</strong></p>
<ul>
<li class="">英文效果接近 ElevenLabs 商业级别</li>
<li class="">88 种声音（美式/英式，男/女，A~D 分级）</li>
<li class="">82M 参数，轻量，M1 Mac CPU 可直接运行</li>
<li class="">Apache 2.0，免费商用</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="二声音分级说明">二、声音分级说明<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E4%BA%8C%E5%A3%B0%E9%9F%B3%E5%88%86%E7%BA%A7%E8%AF%B4%E6%98%8E" class="hash-link" aria-label="二、声音分级说明的直接链接" title="二、声音分级说明的直接链接" translate="no">​</a></h2>
<p>Kokoro 的声音按质量分为 A~D 级，<strong>A 级最高</strong>：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="english-us-推荐">English (US) 推荐<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#english-us-%E6%8E%A8%E8%8D%90" class="hash-link" aria-label="English (US) 推荐的直接链接" title="English (US) 推荐的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>声音</th><th>级别</th><th>风格</th></tr></thead><tbody><tr><td>Heart</td><td>A</td><td>温暖女声（推荐首选）</td></tr><tr><td>Bella</td><td>A-</td><td>高质量女声</td></tr><tr><td>Nicole</td><td>B-</td><td>自然女声</td></tr><tr><td>Michael</td><td>C+</td><td>成熟男声</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="english-uk-推荐">English (UK) 推荐<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#english-uk-%E6%8E%A8%E8%8D%90" class="hash-link" aria-label="English (UK) 推荐的直接链接" title="English (UK) 推荐的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>声音</th><th>级别</th><th>风格</th></tr></thead><tbody><tr><td>Emma</td><td>B-</td><td>英式女声</td></tr><tr><td>George</td><td>C</td><td>英式男声</td></tr></tbody></table>
<blockquote>
<p>💡 每个声音第一次使用时会下载对应的&nbsp;<code>.bin</code>&nbsp;文件，之后自动缓存，无需重复下载。</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="三部署方式对比">三、部署方式对比<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E4%B8%89%E9%83%A8%E7%BD%B2%E6%96%B9%E5%BC%8F%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="三、部署方式对比的直接链接" title="三、部署方式对比的直接链接" translate="no">​</a></h2>
<table><thead><tr><th></th><th><a href="https://clearlove7-ai.vercel.app/?word=Docker+Compose&amp;postId=2026-05-16-kokoro-tts-tutorial" target="_blank" rel="noopener noreferrer" class="">Docker Compose</a></th><th>源码运行</th><th>纯浏览器（<a href="https://clearlove7-ai.vercel.app/?word=WebGPU&amp;postId=2026-05-16-kokoro-tts-tutorial" target="_blank" rel="noopener noreferrer" class="">WebGPU</a>）</th></tr></thead><tbody><tr><td>难度</td><td>⭐⭐</td><td>⭐⭐⭐</td><td>⭐</td></tr><tr><td>需要安装</td><td>Docker</td><td>Node.js + npm</td><td>无</td></tr><tr><td>推荐场景</td><td>本地长期使用</td><td>开发者改源码</td><td>偶尔体验</td></tr></tbody></table>
<p><strong>结论：日常使用推荐 Docker Compose 方式。</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="四环境准备">四、环境准备<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E5%9B%9B%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87" class="hash-link" aria-label="四、环境准备的直接链接" title="四、环境准备的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-安装-docker-desktop">1. 安装 Docker Desktop<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#1-%E5%AE%89%E8%A3%85-docker-desktop" class="hash-link" aria-label="1. 安装 Docker Desktop的直接链接" title="1. 安装 Docker Desktop的直接链接" translate="no">​</a></h3>
<p>由于国内访问 Docker 官网较慢，建议从阿里云镜像下载：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">https://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/</span><br></div></code></pre></div></div>
<p>下载&nbsp;<code>.dmg</code>&nbsp;文件，双击安装，打开 Docker Desktop 等待启动（菜单栏出现 🐳 图标）。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-配置命令行路径永久生效">2. 配置命令行路径（永久生效）<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#2-%E9%85%8D%E7%BD%AE%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%B7%AF%E5%BE%84%E6%B0%B8%E4%B9%85%E7%94%9F%E6%95%88" class="hash-link" aria-label="2. 配置命令行路径（永久生效）的直接链接" title="2. 配置命令行路径（永久生效）的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">echo 'export PATH="$PATH:/Applications/Docker.app/Contents/Resources/bin"' &gt;&gt; ~/.zshrc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source ~/.zshrc</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-验证安装">3. 验证安装<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#3-%E9%AA%8C%E8%AF%81%E5%AE%89%E8%A3%85" class="hash-link" aria-label="3. 验证安装的直接链接" title="3. 验证安装的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker --version &amp;&amp; docker compose version</span><br></div></code></pre></div></div>
<p>输出类似以下内容即为成功：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Docker version 29.4.3, build 055a478</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Docker Compose version v5.1.3</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="五部署-kokoro-web">五、部署 kokoro-web<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E4%BA%94%E9%83%A8%E7%BD%B2-kokoro-web" class="hash-link" aria-label="五、部署 kokoro-web的直接链接" title="五、部署 kokoro-web的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-创建项目目录">1. 创建项目目录<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#1-%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE%E7%9B%AE%E5%BD%95" class="hash-link" aria-label="1. 创建项目目录的直接链接" title="1. 创建项目目录的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">mkdir kokoro-web &amp;&amp; cd kokoro-web</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-创建composeyaml">2. 创建&nbsp;<code>compose.yaml</code><a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#2-%E5%88%9B%E5%BB%BAcomposeyaml" class="hash-link" aria-label="2-创建composeyaml的直接链接" title="2-创建composeyaml的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cat &gt; compose.yaml &lt;&lt; 'EOF'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">services:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  kokoro-web:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    image: ghcr.io/eduardolat/kokoro-web:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ports:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      - "3000:3000"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    environment:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      - KW_SECRET_API_KEY=my-secret-key</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    volumes:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      - ./kokoro-cache:/kokoro/cache  # 模型缓存，避免重复下载</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    restart: unless-stopped</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></div></code></pre></div></div>
<blockquote>
<p><code>KW_SECRET_API_KEY</code>&nbsp;是本地服务的访问密码，本地使用随便填即可。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-启动服务">3. 启动服务<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#3-%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1" class="hash-link" aria-label="3. 启动服务的直接链接" title="3. 启动服务的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker compose up -d</span><br></div></code></pre></div></div>
<p>第一次启动会拉取镜像，需要几分钟。国内访问&nbsp;<code>ghcr.io</code>&nbsp;较慢，耐心等待。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-验证运行">4. 验证运行<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#4-%E9%AA%8C%E8%AF%81%E8%BF%90%E8%A1%8C" class="hash-link" aria-label="4. 验证运行的直接链接" title="4. 验证运行的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker compose logs -f</span><br></div></code></pre></div></div>
<p>看到&nbsp;<code>Listening on http://0.0.0.0:3000</code>&nbsp;即为成功。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="六使用-webui">六、使用 WebUI<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E5%85%AD%E4%BD%BF%E7%94%A8-webui" class="hash-link" aria-label="六、使用 WebUI的直接链接" title="六、使用 WebUI的直接链接" translate="no">​</a></h2>
<p>打开浏览器访问：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">http://localhost:3000</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="关键设置">关键设置<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E5%85%B3%E9%94%AE%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="关键设置的直接链接" title="关键设置的直接链接" translate="no">​</a></h3>
<table><thead><tr><th>选项</th><th>推荐值</th><th>说明</th></tr></thead><tbody><tr><td><strong>Execution place</strong></td><td><code>API (Self-hosted)</code></td><td>使用本地 Docker 模型，而非浏览器</td></tr><tr><td><strong>API URL</strong></td><td><code>http://localhost:3000/api/v1</code></td><td>本地服务地址</td></tr><tr><td><strong>API Key</strong></td><td><code>my-secret-key</code></td><td>就是 compose.yaml 里设置的那个</td></tr><tr><td><strong>Model quantization</strong></td><td><code>model (q8f16)</code></td><td>速度和音质最平衡</td></tr><tr><td><strong>Voice quality</strong></td><td><code>Heart (A)</code></td><td>推荐首选</td></tr></tbody></table>
<blockquote>
<p>⚠️&nbsp;<strong>重要</strong>：<code>Execution place</code>&nbsp;一定要选&nbsp;<code>API (Self-hosted)</code>，否则会在浏览器内运行，速度很慢。</p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="七关于-markdown-文件输入">七、关于 Markdown 文件输入<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E4%B8%83%E5%85%B3%E4%BA%8E-markdown-%E6%96%87%E4%BB%B6%E8%BE%93%E5%85%A5" class="hash-link" aria-label="七、关于 Markdown 文件输入的直接链接" title="七、关于 Markdown 文件输入的直接链接" translate="no">​</a></h2>
<p>Kokoro 原生只接受纯文本，直接输入&nbsp;<code>.md</code>&nbsp;文件会把&nbsp;<code>##</code>、<code>**bold**</code>&nbsp;等 Markdown 语法也读出来。</p>
<p><strong>解决方案</strong>：用&nbsp;<code>pandoc</code>&nbsp;先转换：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 安装 pandoc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew install pandoc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 转换并生成音频</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pandoc article.md -t plain | kokoro-tts - output.mp3 --voice am_michael</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="八生成速度说明">八、生成速度说明<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E5%85%AB%E7%94%9F%E6%88%90%E9%80%9F%E5%BA%A6%E8%AF%B4%E6%98%8E" class="hash-link" aria-label="八、生成速度说明的直接链接" title="八、生成速度说明的直接链接" translate="no">​</a></h2>
<p>影响生成速度的因素：</p>
<ul>
<li class=""><strong>文章长度</strong>：线性增长，300 词约需 30~60 秒</li>
<li class=""><strong><a href="https://clearlove7-ai.vercel.app/?word=%E6%A8%A1%E5%9E%8B%E9%87%8F%E5%8C%96&amp;postId=2026-05-16-kokoro-tts-tutorial" target="_blank" rel="noopener noreferrer" class="">模型量化</a></strong>：<code>fp32</code>&nbsp;最慢，<code>q8f16</code>&nbsp;平衡，<code>q4</code>&nbsp;最快</li>
<li class=""><strong>运行位置</strong>：<code>API (Self-hosted)</code>&nbsp;用 CPU 跑；<code>Browser</code>&nbsp;用 GPU 跑但首次需下载模型到浏览器</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="九常用管理命令">九、常用管理命令<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E4%B9%9D%E5%B8%B8%E7%94%A8%E7%AE%A1%E7%90%86%E5%91%BD%E4%BB%A4" class="hash-link" aria-label="九、常用管理命令的直接链接" title="九、常用管理命令的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker compose logs -f    # 查看实时日志</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose stop       # 停止服务</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose start      # 启动服务</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose restart    # 重启服务</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker compose pull       # 更新到最新版本</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="十相关链接">十、相关链接<a href="https://mikeq95.github.io/blog/2026/05/16/kokoro-tts-tutorial#%E5%8D%81%E7%9B%B8%E5%85%B3%E9%93%BE%E6%8E%A5" class="hash-link" aria-label="十、相关链接的直接链接" title="十、相关链接的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>资源</th><th>地址</th></tr></thead><tbody><tr><td>Kokoro 模型（核心）</td><td>github.com/hexgrad/kokoro</td></tr><tr><td>模型权重下载</td><td>huggingface.co/hexgrad/Kokoro-82M</td></tr><tr><td>在线试听 Demo</td><td>hf.co/spaces/hexgrad/Kokoro-TTS</td></tr><tr><td>kokoro-web（WebUI）</td><td>github.com/eduardolat/kokoro-web</td></tr></tbody></table>
<hr>
<p><em>部署环境：MacBook Pro M1 Pro · macOS · Docker Desktop 29.4.3</em></p>]]></content:encoded>
            <category>GitHub</category>
            <category>macOS</category>
        </item>
        <item>
            <title><![CDATA[编程英语单词短语收集]]></title>
            <link>https://mikeQ95.github.io/blog/2026/04/29/coding-english-vocabulary</link>
            <guid>https://mikeQ95.github.io/blog/2026/04/29/coding-english-vocabulary</guid>
            <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[1.  demonstrate]]></description>
            <content:encoded><![CDATA[<ol>
<li class="">
<p><strong>demonstrate</strong></p>
<ul>
<li class="">例句: This tutorial no longer ==demonstrates== current <a href="https://clearlove7-ai.vercel.app/?word=SwiftUI&amp;postId=2026-04-29-coding-english-vocabulary" target="_blank" rel="noopener noreferrer" class="">SwiftUI</a> or Xcode practices.</li>
<li class="">译文: 本教程不再演示当前的 SwiftUI 或 Xcode 实践。</li>
<li class="">释义: 演示</li>
</ul>
</li>
</ol>
<!-- -->
<ol start="2">
<li class="">
<p><strong>prevent</strong></p>
<ul>
<li class="">例句: This option will ==prevent== Shadowrocket from being set as the default route.</li>
<li class="">译文: 此选项将阻止 Shadowrocket 被设置为默认路由。</li>
<li class="">释义: 阻止</li>
</ul>
</li>
<li class="">
<p><strong>modifier</strong></p>
<ul>
<li class="">例句: A new ==modifier== creates a new view based on the original one.</li>
<li class="">译文: 一个新的修饰符基于原始的样子，会创建一个新的视图。</li>
<li class="">释义: 修饰符</li>
</ul>
</li>
<li class="">
<p><strong>components</strong></p>
<ul>
<li class="">例句: One of the most common and recognizable user interface ==components== is the combination of an icon and a label.</li>
<li class="">译文: 最常见、最容易识别的用户界面组件之一，就是图标+文字的组合。</li>
<li class="">释义: 零件，组件</li>
</ul>
</li>
<li class="">
<p><strong>idiom</strong></p>
<ul>
<li class="">例句: This ==idiom== appears across many kinds of apps and shows up in collections, lists, menus of action items, and disclosable lists, just to name a few.</li>
<li class="">译文: 这种惯用组合出现在许多类型的应用程序中，也出现在集合视图、列表、操作菜单以及可展开列表里——仅举几例而已。</li>
<li class="">释义: 惯用模式，惯用组合</li>
</ul>
</li>
<li class="">
<p><strong>just to name a few</strong></p>
<ul>
<li class="">例句: This idiom appears across many kinds of apps and shows up in collections, lists, menus of action items, and disclosable lists, ==just to name a few==.</li>
<li class="">译文: 这种惯用组合出现在许多类型的应用程序中，也出现在集合视图、列表、操作菜单以及可展开列表里——仅举几例而已。</li>
<li class="">释义: 仅举几例 / 只是列举这么多</li>
</ul>
</li>
<li class="">
<p><strong>interface</strong></p>
<ul>
<li class="">例句: You create the user ==interface==, or UI, for your app inside the body, the entire contents of your app are in the code below.</li>
<li class="">译文: 你在 body 属性中创建应用的用户界面（UI），应用程序的全部内容都在下面的代码中。</li>
<li class="">释义: 界面</li>
</ul>
</li>
</ol>
<div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// NOTE: - 演示代码</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ContentView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">systemName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"globe"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">imageScale</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">large</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">foregroundColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">tint</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Hello World"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token other-directive property" style="color:#36acaa">#Preview</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">ContentView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<ol start="8">
<li class="">
<p><strong>instance</strong></p>
<ul>
<li class="">例句: To construct your narrative, the app needs an ==instance== of Story, which takes an array of StoryPage instances.</li>
<li class="">译文: 要构建你的叙事，该应用需要一个 Story 实例，该实例接受一个 StoryPage 实例数组。</li>
<li class="">释义: 实例</li>
</ul>
</li>
<li class="">
<p><strong>hold</strong></p>
<ul>
<li class="">例句: The text property ==holds== a String that describes the choice readers can make.</li>
<li class="">译文: 文本属性保存一个字符串，用于描述读者可以做出的选择。</li>
<li class="">释义: 保存，持有</li>
</ul>
</li>
<li class="">
<p><strong>present</strong></p>
<ul>
<li class="">例句: Use a <a href="https://clearlove7-ai.vercel.app/?word=NavigationStack&amp;postId=2026-04-29-coding-english-vocabulary" target="_blank" rel="noopener noreferrer" class="">navigation stack</a> to ==present= a stack of views over a root view.</li>
<li class="">译文: 使用导航堆栈在根视图上呈现一系列视图。</li>
<li class="">释义: 显示，呈现</li>
</ul>
</li>
<li class="">
<p><strong>indicates</strong></p>
<ul>
<li class="">例句: A value-destination ==indicates== that you are pushing a value onto the path.</li>
<li class="">译文: "Value destination"这种用法表明/意味着你正在将一个值推送到导航路径（Navigation path）上。</li>
<li class="">释义: 表明，意味着</li>
</ul>
</li>
</ol>]]></content:encoded>
            <category>English</category>
            <category>Swift</category>
            <category>Collection</category>
        </item>
        <item>
            <title><![CDATA[通用英语单词短语收集]]></title>
            <link>https://mikeQ95.github.io/blog/2026/04/29/general-english-vocabulary</link>
            <guid>https://mikeQ95.github.io/blog/2026/04/29/general-english-vocabulary</guid>
            <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[1. Based on the principle of voluntariness]]></description>
            <content:encoded><![CDATA[<ol>
<li class="">
<p><strong>Based on the principle of voluntariness</strong></p>
<ul>
<li class="">例句: Membership in the union is ==based on the principle of voluntariness==—no employee is forced to join.</li>
<li class="">译文: 加入工会遵循自愿原则，没有任何员工被强迫参加。</li>
<li class="">释义: 根据自愿的原则</li>
</ul>
</li>
</ol>
<!-- -->
<ol start="2">
<li class="">
<p><strong>One for all, all for one</strong></p>
<ul>
<li class="">例句: The three friends made a pact: ==one for all, all for one==. They promised to stand by each other no matter what challenges lay ahead.</li>
<li class="">译文: 三位朋友立下誓言：人人为我，我为人人。他们承诺无论未来面临何种挑战，都会相互扶持。</li>
<li class="">释义: 人人为我，我为人人</li>
</ul>
</li>
<li class="">
<p><strong>Be careful, though</strong></p>
<ul>
<li class="">例句: The restaurant is amazing and cheap. ==Be careful==, though: it gets really crowded on weekends.</li>
<li class="">译文: 那家餐厅很棒，还很便宜。不过要注意：周末人会特别多。</li>
<li class="">释义: 不过要注意（用于补充警示信息）</li>
</ul>
</li>
<li class="">
<p><strong>embedded in</strong></p>
<ul>
<li class="">例句: These attitudes are ==embedded in== our society.</li>
<li class="">译文: 这些观念根植于我们的社会之中。</li>
<li class="">释义: 根植于，深深嵌入</li>
</ul>
</li>
<li class="">
<p><strong>enthusiasts</strong></p>
<ul>
<li class="">例句: She is one of the most dedicated fitness ==enthusiasts== I have ever met.</li>
<li class="">译文: 她是我见过的最投入的健身爱好者之一。</li>
<li class="">释义: 爱好者，发烧友</li>
</ul>
</li>
</ol>]]></content:encoded>
            <category>English</category>
            <category>Collection</category>
        </item>
    </channel>
</rss>