<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>工具与环境 on 云雾海的博客</title><link>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/</link><description>Recent content in 工具与环境 on 云雾海的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 19 Mar 2026 11:56:51 +0800</lastBuildDate><atom:link href="https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/index.xml" rel="self" type="application/rss+xml"/><item><title>Mihomo远程部署</title><link>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/mihomo%E8%BF%9C%E7%A8%8B%E9%83%A8%E7%BD%B2/</link><pubDate>Thu, 19 Mar 2026 11:56:51 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/mihomo%E8%BF%9C%E7%A8%8B%E9%83%A8%E7%BD%B2/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/mihomo%E8%BF%9C%E7%A8%8B%E9%83%A8%E7%BD%B2/cover.jpg" alt="Featured image of post Mihomo远程部署" /&gt;&lt;h1 id="mihomo远程部署"&gt;&lt;a href="#mihomo%e8%bf%9c%e7%a8%8b%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;Mihomo远程部署&#10;&lt;/h1&gt;&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言&#10;&lt;/h2&gt;&lt;p&gt;因为在WSL中需要下载一些东西，而因为电脑又在远程，无法使用GUI，且如果直接调用Windows中的Mihomo，会导致ssh无法正常连接，故在此直接在WSL中部署Mihomo。&lt;/p&gt;&#10;&lt;h2 id="工作环境"&gt;&lt;a href="#%e5%b7%a5%e4%bd%9c%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;工作环境&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;WSL2环境&lt;/li&gt;&#10;&lt;li&gt;Tailscale&lt;/li&gt;&#10;&lt;li&gt;SSH&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="步骤"&gt;&lt;a href="#%e6%ad%a5%e9%aa%a4" class="header-anchor"&gt;&lt;/a&gt;步骤&#10;&lt;/h2&gt;&lt;h3 id="下载mihomo"&gt;&lt;a href="#%e4%b8%8b%e8%bd%bdmihomo" class="header-anchor"&gt;&lt;/a&gt;下载Mihomo&#10;&lt;/h3&gt;&lt;p&gt;此部分不要直接完全复制，请根据最新版本&lt;a class="link" href="https://github.com/MetaCubeX/mihomo/releases" target="_blank" rel="noopener"&#10; &gt;替换链接&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建目录&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir ~/mihomo &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/mihomo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载链接，根据最新链接进行替换，注意应选择mihomo-linux-amd64-vx.xx.x.gz&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/MetaCubeX/mihomo/releases/download/v1.18.9/mihomo-linux-amd64-v1.18.9.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 解压并重命名&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gunzip mihomo-linux-amd64-v1.18.9.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv mihomo-linux-amd64-v1.18.9 mihomo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x mihomo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="配置核心文件"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e6%a0%b8%e5%bf%83%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;配置核心文件&#10;&lt;/h3&gt;&lt;h4 id="下载地理文件"&gt;&lt;a href="#%e4%b8%8b%e8%bd%bd%e5%9c%b0%e7%90%86%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;下载地理文件&#10;&lt;/h4&gt;&lt;p&gt;这个文件一般Mihomo在初次运行时会自动下载，但是经常失败，所以直接手动下载&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O Country.mmdb https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="配置设置文件"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e8%ae%be%e7%bd%ae%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;配置设置文件&#10;&lt;/h4&gt;&lt;p&gt;你应该会有一个订阅链接，通过这个订阅链接可以下载一个config.yaml文件，使用以下语句进行下载：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -L -o config.yaml &lt;span class="s2"&gt;&amp;#34;https://api.v1.mk/sub?target=clash&amp;amp;url=你的订阅链接&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="初步测试"&gt;&lt;a href="#%e5%88%9d%e6%ad%a5%e6%b5%8b%e8%af%95" class="header-anchor"&gt;&lt;/a&gt;初步测试&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./mihomo -d .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果一切正常，应该会看到&lt;code&gt;Start initial configuration successful&lt;/code&gt;之类的内容，并且在shell中它展开了一个服务。&lt;/p&gt;&#10;&lt;h3 id="常驻后台"&gt;&lt;a href="#%e5%b8%b8%e9%a9%bb%e5%90%8e%e5%8f%b0" class="header-anchor"&gt;&lt;/a&gt;常驻后台&#10;&lt;/h3&gt;&lt;h4 id="移动文件"&gt;&lt;a href="#%e7%a7%bb%e5%8a%a8%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;移动文件&#10;&lt;/h4&gt;&lt;p&gt;将Mihomo文件移动到&lt;code&gt;/usr/local/bin&lt;/code&gt;中，这样就可以直接使用&lt;code&gt;mihomo&lt;/code&gt;命令了。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv mihomo /usr/local/bin/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /etc/mihomo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp Country.mmdb /etc/mihomo/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp config.yaml /etc/mihomo/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="使用systemd守护进程"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8systemd%e5%ae%88%e6%8a%a4%e8%bf%9b%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;使用systemd守护进程&#10;&lt;/h4&gt;&lt;p&gt;创建服务文件&lt;code&gt;sudo nano /etc/systemd/system/mihomo.service&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;然后写下以下内容：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-TOML" data-lang="TOML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;mihomo&lt;/span&gt; &lt;span class="nx"&gt;Daemon&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;simple&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;always&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mihomo&lt;/span&gt; &lt;span class="nx"&gt;-d&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mihomo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Install&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;multi-user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再&lt;code&gt;Ctrl+O&lt;/code&gt;、&lt;code&gt;Enter&lt;/code&gt;、&lt;code&gt;Ctrl+X&lt;/code&gt;保存文件。&lt;/p&gt;&#10;&lt;h4 id="启动服务"&gt;&lt;a href="#%e5%90%af%e5%8a%a8%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;启动服务&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; mihomo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start mihomo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="配置启动命令"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e5%90%af%e5%8a%a8%e5%91%bd%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;配置启动命令&#10;&lt;/h3&gt;&lt;p&gt;在&lt;code&gt;~/.bashrc&lt;/code&gt;中添加以下内容：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 代理开关快捷键&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;export https_proxy=&amp;#39;http://127.0.0.1:7890&amp;#39;; export http_proxy=&amp;#39;http://127.0.0.1:7890&amp;#39;; echo &amp;#39;Proxy ON&amp;#39;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;unproxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;unset https_proxy; unset http_proxy; echo &amp;#39;Proxy OFF&amp;#39;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后&lt;code&gt;source ~/.bashrc&lt;/code&gt;使其生效。&lt;/p&gt;&#10;&lt;p&gt;之后输入&lt;code&gt;proxy&lt;/code&gt;命令，即可使用代理。输入&lt;code&gt;unproxy&lt;/code&gt;命令，即可取消代理。&lt;/p&gt;&#10;&lt;h3 id="界面化配置"&gt;&lt;a href="#%e7%95%8c%e9%9d%a2%e5%8c%96%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;界面化配置&#10;&lt;/h3&gt;&lt;p&gt;我们有时候需要修改连接线路，如果直接在config里面修改很麻烦，通过yacd可以很方便地解决这一问题。&lt;/p&gt;&#10;&lt;h4 id="安装yacd"&gt;&lt;a href="#%e5%ae%89%e8%a3%85yacd" class="header-anchor"&gt;&lt;/a&gt;安装yacd&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /etc/mihomo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo git clone -b gh-pages https://github.com/haishanh/yacd.git dashboard&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="修改configyaml"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9configyaml" class="header-anchor"&gt;&lt;/a&gt;修改&lt;code&gt;config.yaml&lt;/code&gt;&#10;&lt;/h4&gt;&lt;p&gt;在&lt;code&gt;config.yaml&lt;/code&gt;中添加以下内容：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;external-controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.0.0.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;9090&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 允许外部连接控制端口&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;external-ui&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;dashboard &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 刚才下载的文件夹名称&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;你的密码&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 设置一个密码，防止别人乱动&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后重启mihomo：&lt;code&gt;sudo systemctl restart mihomo&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h4 id="访问yacd"&gt;&lt;a href="#%e8%ae%bf%e9%97%aeyacd" class="header-anchor"&gt;&lt;/a&gt;访问yacd&#10;&lt;/h4&gt;&lt;p&gt;在浏览器中输入&lt;code&gt;http://tailscale的IP地址:9090/ui&lt;/code&gt;，即可访问yacd。&lt;/p&gt;&#10;&lt;p&gt;至此，Mihomo的远程部署就完成了。&lt;/p&gt;&#10;</description></item><item><title>Qwen3-ASR远程部署</title><link>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/qwen3-asr%E8%BF%9C%E7%A8%8B%E9%83%A8%E7%BD%B2/</link><pubDate>Wed, 18 Mar 2026 16:46:38 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/qwen3-asr%E8%BF%9C%E7%A8%8B%E9%83%A8%E7%BD%B2/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/qwen3-asr%E8%BF%9C%E7%A8%8B%E9%83%A8%E7%BD%B2/cover.jpg" alt="Featured image of post Qwen3-ASR远程部署" /&gt;&lt;h1 id="qwen3-asr部署"&gt;&lt;a href="#qwen3-asr%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;Qwen3-ASR部署&#10;&lt;/h1&gt;&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言&#10;&lt;/h2&gt;&lt;h3 id="模型介绍"&gt;&lt;a href="#%e6%a8%a1%e5%9e%8b%e4%bb%8b%e7%bb%8d" class="header-anchor"&gt;&lt;/a&gt;模型介绍&#10;&lt;/h3&gt;&lt;p&gt;Qwen3-ASR是阿里的千问团队开发的一个语音识别模型，包括两个版本Qwen3-ASR-1.7B 与 Qwen3-ASR-0.6B，以及一个创新的语音强制对齐模型 Qwen3-ForcedAligner-0.6B。&lt;/p&gt;&#10;&lt;p&gt;Qwen3-ASR最具特色的是其支持52个语种和方言的语种识别和语音识别，这在传统只能标准英语和普通话的语音识别模型中有较大突破。&lt;/p&gt;&#10;&lt;h3 id="部署目标"&gt;&lt;a href="#%e9%83%a8%e7%bd%b2%e7%9b%ae%e6%a0%87" class="header-anchor"&gt;&lt;/a&gt;部署目标&#10;&lt;/h3&gt;&lt;p&gt;本人有一台装有4070TIS的Windows主机，同时有一台性能普通的笔记本。因为个人研究需求，需要将Qwen3-ASR模型部署到一台服务器上，刚好这个Windows主机就可以成为我的测试服务器，而笔记本作为客户端与服务器进行通信调用。&lt;/p&gt;&#10;&lt;h3 id="部署思路"&gt;&lt;a href="#%e9%83%a8%e7%bd%b2%e6%80%9d%e8%b7%af" class="header-anchor"&gt;&lt;/a&gt;部署思路&#10;&lt;/h3&gt;&lt;p&gt;基本的部署思路是，在Windows主机中通过WSL安装miniconda环境，然后部署Qwen3-ASR环境，通过tailscale将主机与笔记本连接，通过ssh在笔记本控制运行WSL，通过tailscale提供的局域网进行通信。本文主要详述Qwen3-ASR部署流程，关于远程部署部分只会简单提及，有需求可以根据提及的部分进行对应搜索。&lt;/p&gt;&#10;&lt;h2 id="准备工作"&gt;&lt;a href="#%e5%87%86%e5%a4%87%e5%b7%a5%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;准备工作&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;一台高性能Windows主机，在本文中其显卡为4070TIS，系统为Windows11，后续我们称为服务器。&lt;/li&gt;&#10;&lt;li&gt;另一台电脑，本文中为笔记本，系统为Windows11，后续我们称为客户端。&lt;/li&gt;&#10;&lt;li&gt;服务器Windows系统中的tailscale和OpenSSH Server服务。因为我很早之前就已经为这个主机安装了ssh服务器，所以本文默认已经在Windows系统中有ssh服务，并且整个操作均在远端通过ssh访问，而因为服务器没有公网，所以内网穿透由tailscale提供。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="部署流程"&gt;&lt;a href="#%e9%83%a8%e7%bd%b2%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;部署流程&#10;&lt;/h2&gt;&lt;h3 id="wsl安装"&gt;&lt;a href="#wsl%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;WSL安装&#10;&lt;/h3&gt;&lt;p&gt;经过尝试，直接在Windows上部署Qwen3-ASR模型的话，比较容易安装失败，尽管可以通过docker安装，但是在后续开发上仍然可能出现一些类似的踩坑，毕竟我们是为了进行软件开发，所以在WSL上进行安装是更好的选择。&lt;/p&gt;&#10;&lt;p&gt;关于WSL的安装，可以参考&lt;a class="link" href="https://learn.microsoft.com/zh-cn/windows/wsl/install" target="_blank" rel="noopener"&#10; &gt;官方文档&lt;/a&gt;进行，我直接默认安装的Ubuntu系统。&lt;/p&gt;&#10;&lt;h3 id="tailscale安装"&gt;&lt;a href="#tailscale%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;tailscale安装&#10;&lt;/h3&gt;&lt;p&gt;安装完WSL后，我们需要在WSL中安装tailscale，这样我们就可以在远端直接用ssh访问WSL的文件系统了，尽管我们也可以先访问Windows，然后在一个Powershell终端里面通过&lt;code&gt;wsl&lt;/code&gt;命令访问WSL，但是这种做法无法打开WSL的文件系统，所以直接用tailscale在内部穿透是比较好的方法。关于tailscale的安装，可以参考&lt;a class="link" href="https://tailscale.com/docs/install/windows/wsl2" target="_blank" rel="noopener"&#10; &gt;官方文档&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h3 id="ssh服务器"&gt;&lt;a href="#ssh%e6%9c%8d%e5%8a%a1%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;ssh服务器&#10;&lt;/h3&gt;&lt;p&gt;在tailscale安装完成后，就已经获得了一个新的内网IP，此时我们可以通过ssh连接WSL了，不过在此之前需要为WSL安装ssh服务器，安装命令如下：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install openssh-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;由于 WSL2 的一些限制（如默认不支持密码登录或端口冲突），我们需要微调一下配置文件：&lt;code&gt;sudo nano /etc/ssh/sshd_config&lt;/code&gt;&#10;取消以下内容的注释并根据需要进行修改：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Port 2222（建议将端口改为 2222，因为 Windows 自身可能已经占用了 22 端口）。&#10;PasswordAuthentication yes（如果你想用密码登录，请确保这里是 yes）。&#10;ListenAddress 0.0.0.0（允许从任何 IP 访问）。&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最后保存并退出，按&lt;code&gt;Ctrl+O&lt;/code&gt;保存，&lt;code&gt;Enter&lt;/code&gt;确认，&lt;code&gt;Ctrl+X&lt;/code&gt;退出。&lt;/p&gt;&#10;&lt;p&gt;然后重启服务：&lt;code&gt;sudo service ssh restart&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;通过&lt;code&gt;tailscale ip&lt;/code&gt;指令可以获取IP地址，然后通过ssh连接WSL。&lt;/p&gt;&#10;&lt;p&gt;为了方便，我们可以在vscode中安装&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack" target="_blank" rel="noopener"&#10; &gt;Remote Development&lt;/a&gt;来辅助远程开发。&lt;/p&gt;&#10;&lt;h3 id="miniconda安装"&gt;&lt;a href="#miniconda%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;Miniconda安装&#10;&lt;/h3&gt;&lt;p&gt;我们当然不希望只在WSL中安装一个Qwen3-ASR模型后就不玩其它模型了，所以Python环境管理工具是很重要的，因为我们在WSL中且不需要什么界面环境，所以安装miniconda即可，参考&lt;a class="link" href="https://www.anaconda.com/docs/getting-started/miniconda/install/linux-install" target="_blank" rel="noopener"&#10; &gt;官方文档&lt;/a&gt;进行安装。&lt;/p&gt;&#10;&lt;p&gt;安装完成后，我们创建一个conda环境：&lt;code&gt;conda create -n qwen-asr-env python=3.10 -y&lt;/code&gt;。实际上官方推荐的使用&lt;code&gt;python=3.12&lt;/code&gt;，但是因为我个人的需求，部分依赖库没有后续更新，所以我选择了&lt;code&gt;3.10&lt;/code&gt;版本。&lt;/p&gt;&#10;&lt;p&gt;之后启动这个环境&lt;code&gt;conda activate qwen-asr-env&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="qwen3-asr安装"&gt;&lt;a href="#qwen3-asr%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;Qwen3-ASR安装&#10;&lt;/h3&gt;&lt;p&gt;其实到这一步后，部署就已经很简单了：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install -U qwen-asr&lt;span class="o"&gt;[&lt;/span&gt;vllm&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAX_JOBS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; pip install -U flash-attn --no-build-isolation&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两步就可以完成，但是事实上，在安装Flash Attention的时候很容易失败，我之前是在Windows中安装，就反复失败，但是在WSL中就成功了。另外如果觉得下载很慢，可以修改镜像，只需要通过&lt;code&gt;export PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple&lt;/code&gt;修改镜像源即可，当然也可以在&lt;code&gt;install&lt;/code&gt;命令里面直接添加镜像。&lt;/p&gt;&#10;&lt;h3 id="qwen3-asr远程调用"&gt;&lt;a href="#qwen3-asr%e8%bf%9c%e7%a8%8b%e8%b0%83%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;Qwen3-ASR远程调用&#10;&lt;/h3&gt;&lt;p&gt;在完成部署后，我们就可以在客户端进行远程调用了，因为我们已经通过tailscale分配了IP，现在只需要指定端口即可。下面我写了两个Python脚本，分别运行在客户端和服务器上，实现了包含VAD功能的类流式语音识别，代码没有精修，大概能运行的程度。&lt;/p&gt;&#10;&lt;h4 id="服务器端"&gt;&lt;a href="#%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%af" class="header-anchor"&gt;&lt;/a&gt;服务器端&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;struct&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;qwen_asr&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Qwen3ASRModel&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;torch.distributed&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;dist&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置参数&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ASR_MODEL_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Qwen/Qwen3-ASR-1.7B&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;HOST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;100.xx.xx.xx&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 换成自己的Tailscale IP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8823&lt;/span&gt; &lt;span class="c1"&gt;# 端口号&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SAMPLE_RATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16000&lt;/span&gt; &lt;span class="c1"&gt;# 采样率&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;BYTES_PER_SAMPLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="c1"&gt;# float32 = 4 bytes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;recv_exact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;接收精确长度的字节数据，直到收满或连接断开&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;packet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;packet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;packet&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;正在初始化 vLLM 模型...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;asr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Qwen3ASRModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ASR_MODEL_PATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gpu_memory_utilization&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;max_model_len&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 可根据需要调整&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;模型加载完成，启动 TCP 服务器...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_sock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setsockopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOL_SOCKET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SO_REUSEADDR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;服务器监听 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;HOST&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;，等待客户端连接...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client_sock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;server_sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;客户端 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_addr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 已连接&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;len_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recv_exact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_sock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;len_data&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;客户端断开连接&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;!I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;len_data&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data_len&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;audio_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recv_exact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_sock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;audio_data&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;客户端断开连接&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;audio_seg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frombuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;init_streaming_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;unfixed_chunk_num&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;unfixed_token_num&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;chunk_size_sec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;asr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;streaming_transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_seg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;asr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;finish_streaming_transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_addr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;处理客户端 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_addr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 时出错: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client_sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;客户端 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_addr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 连接关闭&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;服务器关闭&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;asr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;close&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;asr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_initialized&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;destroy_process_group&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="客户端"&gt;&lt;a href="#%e5%ae%a2%e6%88%b7%e7%ab%af" class="header-anchor"&gt;&lt;/a&gt;客户端&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;struct&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pyaudio&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;torch&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;silero_vad&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VADIterator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get_speech_timestamps&lt;/span&gt; &lt;span class="c1"&gt;# 导入新库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SERVER_IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;100.xx.xx.xx&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# 服务器的Tailscale IP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SERVER_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8823&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SAMPLE_RATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16000&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CHUNK_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FORMAT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyaudio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;paInt16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CHANNELS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;正在加载 Silero VAD 模型...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;silero_vad&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_silero_vad&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_silero_vad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;vad_iterator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VADIterator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SAMPLE_RATE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;VAD 模型加载完成。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;SERVER_IP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SERVER_PORT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;已连接到服务器 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SERVER_IP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SERVER_PORT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyaudio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PyAudio&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FORMAT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CHANNELS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SAMPLE_RATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;frames_per_buffer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CHUNK_SIZE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_audio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int16_bytes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;将 int16 音频转换为 float32 并发送给服务器&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# int16 -&amp;gt; float32 (归一化到 [-1, 1])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;audio_float32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frombuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int16_bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;32768.0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;audio_float32&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tobytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 发送长度前缀 + 音频数据&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;!I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[客户端] 已发送一句话，长度: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int16_bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 字节&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;开始监听麦克风...（按 Ctrl+C 退出）&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;speech_buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="c1"&gt;# 用于缓存当前这句话的音频帧&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;audio_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CHUNK_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exception_on_overflow&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 转换为 numpy 数组 (int16)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;audio_int16&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frombuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 转换为 float32 torch tensor (Silero 要求的格式)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;audio_tensor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;audio_int16&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;32768.0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;audio_tensor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_numpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_tensor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;speech_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vad_iterator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_tensor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;speech_dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 如果检测到语音开始 (&amp;#39;start&amp;#39; key)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;start&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;speech_dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;检测到语音开始&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 如果检测到语音结束 (&amp;#39;end&amp;#39; key)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;end&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;speech_dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;检测到语音结束&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 将缓存的所有音频帧拼接并发送&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;speech_buffer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;full_sentence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speech_buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;send_audio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_sentence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;speech_buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="c1"&gt;# 清空缓存，准备下一句&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;警告：检测到语音结束，但缓存为空&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;speech_buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;用户中断&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 处理最后可能残留的音频（如果程序在说话中间被中断）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;speech_buffer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;处理最后残留的音频...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speech_buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;CHUNK_SIZE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;SAMPLE_RATE&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;full_sentence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speech_buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;send_audio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_sentence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;正在清理资源...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_stream&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;terminate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;客户端已关闭。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过上述步骤，我们成功地在 Tailscale 网络中部署了一个基于 Silero VAD 的 Qwen3-ASR 服务，并实现了客户端与服务器之间的音频传输和语音识别功能。客户端通过麦克风捕获音频，并发送给服务器进行语音识别，服务器将识别结果返回给客户端，通过ssh可以看到结果。&lt;/p&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;以上就是关于Qwen3-ASR远程部署的过程，整体流程比较粗狂，不过可以作为一个参考，毕竟安装环境只要安装上就行了。享受这个新AI吧。&lt;/p&gt;&#10;</description></item><item><title>如何在hugo博客中添加mermaid支持</title><link>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/%E5%A6%82%E4%BD%95%E5%9C%A8hugo%E5%8D%9A%E5%AE%A2%E4%B8%AD%E6%B7%BB%E5%8A%A0mermaid%E6%94%AF%E6%8C%81/</link><pubDate>Fri, 31 Oct 2025 20:52:57 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/%E5%A6%82%E4%BD%95%E5%9C%A8hugo%E5%8D%9A%E5%AE%A2%E4%B8%AD%E6%B7%BB%E5%8A%A0mermaid%E6%94%AF%E6%8C%81/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/%E5%A6%82%E4%BD%95%E5%9C%A8hugo%E5%8D%9A%E5%AE%A2%E4%B8%AD%E6%B7%BB%E5%8A%A0mermaid%E6%94%AF%E6%8C%81/cover.jpg" alt="Featured image of post 如何在hugo博客中添加mermaid支持" /&gt;&lt;h1 id="如何在hugo博客中添加mermaid支持"&gt;&lt;a href="#%e5%a6%82%e4%bd%95%e5%9c%a8hugo%e5%8d%9a%e5%ae%a2%e4%b8%ad%e6%b7%bb%e5%8a%a0mermaid%e6%94%af%e6%8c%81" class="header-anchor"&gt;&lt;/a&gt;如何在hugo博客中添加mermaid支持&#10;&lt;/h1&gt;&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言&#10;&lt;/h2&gt;&lt;p&gt;对于很多hugo博客的主题，他们并没有直接填完关于mermaid语法的支持，这也就导致了我们制作的一些mermaid图表无法被渲染，可读性急剧下降。为此，为hugo添加mermaid支持就非常有必要了。&lt;/p&gt;&#10;&lt;p&gt;在很多博客里面，我们可以看到可以通过添加短代码的方式来实现添加mermaid支持，但是通过这种方式支持的mermaid需要在markdown文件中添加短代码语法，类似于这样：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; mermaid &amp;gt;}}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;graph LR&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; A[开始] --&amp;gt; B{思考}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; B --&amp;gt;|是| C[行动]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; B --&amp;gt;|否| D[放弃]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; /mermaid &amp;gt;}}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而不是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```markdown&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;graph LR&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; A[开始] --&amp;gt; B{思考}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; B --&amp;gt;|是| C[行动]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; B --&amp;gt;|否| D[放弃]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这让页面组织会显得有点怪，而且这篇文章如果需要发到某些支持mermaid的markdown的平台上时就会产生混乱。&lt;/p&gt;&#10;&lt;p&gt;为此我们可以选择通过hugo的partial功能来实现这个效果。&lt;/p&gt;&#10;&lt;h2 id="创建局部模板文件"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e5%b1%80%e9%83%a8%e6%a8%a1%e6%9d%bf%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;创建局部模板文件&#10;&lt;/h2&gt;&lt;p&gt;在&lt;code&gt;layouts/partials&lt;/code&gt;目录下创建一个局部模板，我们将其命名为&lt;code&gt;mermaid.html&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;然后将以下代码填入其中：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ if .Params.mermaid }}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;module&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;mermaidModule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mermaid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mermaidModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;mermaid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;startOnLoad&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;neutral&amp;#39;&lt;/span&gt;&#9;&lt;span class="c1"&gt;// 可以修改主题&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementsByClassName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;language-mermaid&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`&amp;lt;div class=&amp;#34;mermaid&amp;#34;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;&amp;lt;/div&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;mermaid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.mermaid&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Mermaid 加载失败，图表将显示为代码块:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在，我们就拥有了mermaid模块了，可以将其添加在一个界面模板中，以供加载。&lt;/p&gt;&#10;&lt;h2 id="修改文章模板"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9%e6%96%87%e7%ab%a0%e6%a8%a1%e6%9d%bf" class="header-anchor"&gt;&lt;/a&gt;修改文章模板&#10;&lt;/h2&gt;&lt;p&gt;将个人主题的文章模板&lt;code&gt;single.html&lt;/code&gt;复制到根目录的&lt;code&gt;layouts/_default&lt;/code&gt;文件夹中，然后在其中的合适位置，例如&lt;code&gt;{{ .Content}}&lt;/code&gt;的下方，插入一行代码：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{- partial &amp;#34;mermaid.html&amp;#34; . -}}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种先将文章模板复制再进行修改的方法，可以防止后来主题更新将我们的修改覆盖掉（相较于在主题文件里修改），同时也保证了原本主题的完整性（相较于不复制直接创建一个空白的&lt;code&gt;single.html&lt;/code&gt;）。&lt;/p&gt;&#10;&lt;h2 id="按需启用"&gt;&lt;a href="#%e6%8c%89%e9%9c%80%e5%90%af%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;按需启用&#10;&lt;/h2&gt;&lt;p&gt;如果你需要在某一个文章中启用mermaid，只需要在这个文章的Front Matter中添加&lt;code&gt;mermaid: true&lt;/code&gt;，以此来声明需要加载mermaid即可。&lt;/p&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;通过这种方式，我们就实现了hugo博客对于mermaid的支持，本片博客就是通过这个方法实现的对mermaid的支持，以下是实现效果。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; A[开始集成Mermaid] --&gt; B[创建mermaid.html局部模板]&#10; B --&gt; C[在single.html中插入模板调用]&#10; C --&gt; D[在文章Front Matter中设置mermaid: true]&#10; D --&gt; E[在文章中使用mermaid代码块]&#10; E --&gt; F[完成集成]&lt;/pre&gt;&lt;p&gt;其实理论上，我们还可以用hooks来实现，但是我没有试验成功，所以就不在此赘述了。&lt;/p&gt;&#10;</description></item><item><title>Qt Creator打开时报错python27.dll和报错应用程序错误解决办法</title><link>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/qt-creator%E6%89%93%E5%BC%80%E6%97%B6%E6%8A%A5%E9%94%99python27.dll%E5%92%8C%E6%8A%A5%E9%94%99%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95%E7%BD%91%E5%9D%80/</link><pubDate>Thu, 05 May 2022 23:00:50 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/qt-creator%E6%89%93%E5%BC%80%E6%97%B6%E6%8A%A5%E9%94%99python27.dll%E5%92%8C%E6%8A%A5%E9%94%99%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95%E7%BD%91%E5%9D%80/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/qt-creator%E6%89%93%E5%BC%80%E6%97%B6%E6%8A%A5%E9%94%99python27.dll%E5%92%8C%E6%8A%A5%E9%94%99%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95%E7%BD%91%E5%9D%80/cover.jpg" alt="Featured image of post Qt Creator打开时报错python27.dll和报错应用程序错误解决办法" /&gt;&lt;p&gt;&lt;strong&gt;记录一下，实测有效&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.csdn.net/qq_31721897/article/details/124076326?spm=1001.2014.3001.5502" target="_blank" rel="noopener"&#10; &gt;《 QT找不到python27.dll解决办法》&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.csdn.net/weixin_52764460/article/details/119110317" target="_blank" rel="noopener"&#10; &gt;《打开Qt Creator软件时报警告：xxx.exe应用程序错误》&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Git笔记</title><link>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/git%E7%AC%94%E8%AE%B0/</link><pubDate>Sat, 15 Jan 2022 21:07:07 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/git%E7%AC%94%E8%AE%B0/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/git%E7%AC%94%E8%AE%B0/cover.jpg" alt="Featured image of post Git笔记" /&gt;&lt;p&gt;&lt;em&gt;本文是基于&lt;a class="link" href="https://www.liaoxuefeng.com/wiki/896043488029600" target="_blank" rel="noopener"&#10; &gt;廖雪峰大佬的Git教程&lt;/a&gt;进行的记忆笔记，主要目的是用于快速回忆和精炼Git的一些常用命令，同时补充结合一些网络上的其它关于git的知识，本笔记不适合直接用来零基础学习，如果需要可以通过前面的链接跳转至廖雪峰的教程。本笔记可能存在疏漏，如有问题欢迎指正。&lt;/em&gt;&lt;/p&gt;&#10;&lt;!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} --&gt;&#10;&lt;!-- code_chunk_output --&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%ae%89%e8%a3%85" &gt;安装&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bb%93%e5%ba%93%e7%ae%a1%e7%90%86repository" &gt;仓库管理（repository）&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%88%9b%e5%bb%ba%e4%bb%93%e5%ba%93" &gt;创建仓库&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%85%8b%e9%9a%86%e4%bb%93%e5%ba%93" &gt;克隆仓库&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6" &gt;版本控制&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%93%e5%ad%98%e4%bf%ae%e6%94%b9" &gt;缓存修改&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%8f%90%e4%ba%a4%e4%bf%ae%e6%94%b9" &gt;提交修改&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9f%a5%e7%9c%8b%e7%8a%b6%e6%80%81" &gt;查看状态&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%86%85%e5%ae%b9%e6%af%94%e8%be%83" &gt;内容比较&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%89%88%e6%9c%ac%e6%97%a5%e5%bf%97" &gt;版本日志&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%92%a4%e9%94%80%e4%bf%ae%e6%94%b9" &gt;撤销修改&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%88%a0%e9%99%a4%e6%96%87%e4%bb%b6" &gt;删除文件&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%89%88%e6%9c%ac%e5%9b%9e%e9%80%80" &gt;版本回退&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%bf%9c%e7%a8%8b%e6%93%8d%e4%bd%9c" &gt;远程操作&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e5%85%b3%e8%81%94" &gt;添加关联&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9f%a5%e7%9c%8b%e5%85%b3%e8%81%94" &gt;查看关联&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%8f%96%e6%b6%88%e5%85%b3%e8%81%94" &gt;取消关联&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%b8%8a%e4%bc%a0%e4%bb%a3%e7%a0%81" &gt;上传代码&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%b8%8b%e8%bd%bd%e4%bb%a3%e7%a0%81" &gt;下载代码&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%88%86%e6%94%af%e7%ae%a1%e7%90%86" &gt;分支管理&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%bf%9e%e6%8e%a5%e5%88%86%e6%94%af" &gt;连接分支&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%88%9b%e5%bb%ba%e5%88%86%e6%94%af" &gt;创建分支&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%88%87%e6%8d%a2%e5%88%86%e6%94%af" &gt;切换分支&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%90%88%e5%b9%b6%e5%88%86%e6%94%af" &gt;合并分支&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%88%a0%e9%99%a4%e5%88%86%e6%94%af" &gt;删除分支&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9f%a5%e7%9c%8b%e5%88%86%e6%94%af" &gt;查看分支&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%8e%b0%e5%9c%ba%e7%ae%a1%e7%90%86" &gt;现场管理&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bf%9d%e5%ad%98%e7%8e%b0%e5%9c%ba" &gt;保存现场&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9f%a5%e7%9c%8b%e7%8e%b0%e5%9c%ba" &gt;查看现场&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%81%a2%e5%a4%8d%e7%8e%b0%e5%9c%ba" &gt;恢复现场&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%88%a0%e9%99%a4%e7%8e%b0%e5%9c%ba" &gt;删除现场&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%8e%b7%e5%8f%96%e4%bf%ae%e6%94%b9" &gt;获取修改&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%a0%87%e7%ad%be%e7%ae%a1%e7%90%86" &gt;标签管理&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e6%a0%87%e7%ad%be" &gt;添加标签&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9f%a5%e7%9c%8b%e6%a0%87%e7%ad%be" &gt;查看标签&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%88%a0%e9%99%a4%e6%a0%87%e7%ad%be" &gt;删除标签&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%8e%a8%e9%80%81%e6%a0%87%e7%ad%be" &gt;推送标签&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;!-- /code_chunk_output --&gt;&#10;&lt;h2 id="安装"&gt;&lt;a href="#%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;安装&#10;&lt;/h2&gt;&lt;p&gt;Linux直接用apt安装，Windows官网下载安装，Mac用Xcode安装，安装完毕后在命令行使用如下内容进行设置：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.name &lt;span class="s2"&gt;&amp;#34;Your Name&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.email &lt;span class="s2"&gt;&amp;#34;email@example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;若要使用Github或Gitee等远程仓库，其初始化过程请在往上自行搜索。&lt;/p&gt;&#10;&lt;h2 id="仓库管理repository"&gt;&lt;a href="#%e4%bb%93%e5%ba%93%e7%ae%a1%e7%90%86repository" class="header-anchor"&gt;&lt;/a&gt;仓库管理（repository）&#10;&lt;/h2&gt;&lt;h3 id="创建仓库"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e4%bb%93%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;创建仓库&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git init&lt;/code&gt;：将一个文件夹初始化为git仓库，可以在命令行中进入该文件夹并使用此命令。&lt;/p&gt;&#10;&lt;h3 id="克隆仓库"&gt;&lt;a href="#%e5%85%8b%e9%9a%86%e4%bb%93%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;克隆仓库&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git clone &amp;lt;URL&amp;gt; &amp;lt;name&amp;gt;&lt;/code&gt;：将远程仓库拷贝到自己电脑上，其中&lt;code&gt;&amp;lt;URL&amp;gt;&lt;/code&gt;为远程仓库地址，&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;为赋值后对该项目进行重命名（文件夹的名字）。&lt;/p&gt;&#10;&lt;h2 id="版本控制"&gt;&lt;a href="#%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;版本控制&#10;&lt;/h2&gt;&lt;h3 id="缓存修改"&gt;&lt;a href="#%e7%bc%93%e5%ad%98%e4%bf%ae%e6%94%b9" class="header-anchor"&gt;&lt;/a&gt;缓存修改&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git add &amp;lt;file&amp;gt;&lt;/code&gt;：将工作区修改过的文件存入缓存区，其中&lt;code&gt;&amp;lt;file&amp;gt;&lt;/code&gt;为需要缓存的文件，可同时添加多个文件，也可以添加文件夹，若输入&lt;code&gt;git add .&lt;/code&gt;则将该路径下所有的内容全部添加。&lt;/p&gt;&#10;&lt;h3 id="提交修改"&gt;&lt;a href="#%e6%8f%90%e4%ba%a4%e4%bf%ae%e6%94%b9" class="header-anchor"&gt;&lt;/a&gt;提交修改&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git commit &amp;lt;file&amp;gt; -m &amp;lt;message&amp;gt;&lt;/code&gt;：将缓存区的内容提交至本地仓库，其中&lt;code&gt;&amp;lt;file&amp;gt;&lt;/code&gt;为需要提交的文件，可多个或文件夹，若不填写则全部提交。&lt;code&gt;-m &amp;lt;message&amp;gt;&lt;/code&gt;为添加注释内容，如果在其中添加&lt;code&gt;-a&lt;/code&gt;指令，如&lt;code&gt;git commit -am &amp;lt;message&amp;gt;&lt;/code&gt;，则可以跳过&lt;code&gt;add&lt;/code&gt;步骤，直接工作区内容提交到本地仓库中。同时每次commit也相当于提交了一个新的版本。&lt;/p&gt;&#10;&lt;h3 id="查看状态"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;查看状态&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git status&lt;/code&gt;：查看当前仓库的状态，例如有无未缓存或未提交之类的信息。&lt;/p&gt;&#10;&lt;h3 id="内容比较"&gt;&lt;a href="#%e5%86%85%e5%ae%b9%e6%af%94%e8%be%83" class="header-anchor"&gt;&lt;/a&gt;内容比较&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git diff&lt;/code&gt;：比较工作区和暂存区的差异，可找到例如未缓存但已修改的内容。添加&lt;code&gt;--cached&lt;/code&gt;参数则比较暂存区与上一次提交之间的差异，其它参数可在网上查询。&lt;/p&gt;&#10;&lt;h3 id="版本日志"&gt;&lt;a href="#%e7%89%88%e6%9c%ac%e6%97%a5%e5%bf%97" class="header-anchor"&gt;&lt;/a&gt;版本日志&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git log&lt;/code&gt;：查询过去的版本，包括日期、作者、版本号等信息，添加&lt;code&gt;--pretty=oneline&lt;/code&gt;可以精简上述信息至只有版本号和你commit时添加的注释。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git reflog&lt;/code&gt;：查询未来的版本，即你曾经回退过版本，现在想取消回退，可以通过这个命令进行查询。&lt;/p&gt;&#10;&lt;h3 id="撤销修改"&gt;&lt;a href="#%e6%92%a4%e9%94%80%e4%bf%ae%e6%94%b9" class="header-anchor"&gt;&lt;/a&gt;撤销修改&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git checkout -- &amp;lt;file&amp;gt;&lt;/code&gt;：将工作区的文件恢复为之前暂存区存储的内容。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git reset HEAD &amp;lt;file&amp;gt;&lt;/code&gt;：将暂存区某文件的内容恢复为之前仓库存储的内容。&lt;/p&gt;&#10;&lt;h3 id="删除文件"&gt;&lt;a href="#%e5%88%a0%e9%99%a4%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;删除文件&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git rm &amp;lt;file&amp;gt;&lt;/code&gt;：将文件从暂存区和工作区删除，若未使用该语句而直接将文件删除，则暂存区仍然会保留该文件，且在查询状态时告知你删除了文件，此时可以使用撤销修改进行恢复。若删除之前进行过修改，缓存至了暂存区且尚未提交，则此命令需要使用&lt;code&gt;-f&lt;/code&gt;参数才可进行强制删除。若仅想删除暂存区内的修改但保留工作区的文件，则需要添加&lt;code&gt;--cached&lt;/code&gt;参数。&lt;/p&gt;&#10;&lt;h3 id="版本回退"&gt;&lt;a href="#%e7%89%88%e6%9c%ac%e5%9b%9e%e9%80%80" class="header-anchor"&gt;&lt;/a&gt;版本回退&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git reset &amp;lt;--soft|--mix|--hard&amp;gt; &amp;lt;commit_id&amp;gt;&lt;/code&gt;：将仓库重置至另外某个版本的状态。&lt;/p&gt;&#10;&lt;p&gt;其中&lt;code&gt;&amp;lt;--soft|--mix|--hard&amp;gt;&lt;/code&gt;为三选一参数：&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;--soft&lt;/code&gt;为变更&lt;code&gt;HEAD&lt;/code&gt;所指向的版本（&lt;code&gt;HEAD&lt;/code&gt;版本即为分支顶端的别名）。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;--hard&lt;/code&gt;为除了变更&lt;code&gt;HEAD&lt;/code&gt;所指向的版本外，还会把工程的一切都变成该历史版本的样子，该操作有丢失掉当前所有修改的风险。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;--mix&lt;/code&gt;为除了变更&lt;code&gt;HEAD&lt;/code&gt;所指向的版本外，还会将暂存区重置以匹配&lt;code&gt;HEAD&lt;/code&gt;，但工作区不会改变。&lt;/p&gt;&#10;&lt;p&gt;其中&lt;code&gt;&amp;lt;commit_id&amp;gt;&lt;/code&gt;为版本号，通过版本日志可以查询，若设置为&lt;code&gt;HEAD&lt;/code&gt;则为当前版本，若使用&lt;code&gt;HEAD^&lt;/code&gt;可退回上一个版本，使用&lt;code&gt;HEAD^^&lt;/code&gt;或&lt;code&gt;HEAD^2&lt;/code&gt;可退回上上个版本，通过增加&lt;code&gt;^&lt;/code&gt;的数量或增加数字，可退回的层数以此类推增长。&lt;/p&gt;&#10;&lt;h2 id="远程操作"&gt;&lt;a href="#%e8%bf%9c%e7%a8%8b%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;远程操作&#10;&lt;/h2&gt;&lt;h3 id="添加关联"&gt;&lt;a href="#%e6%b7%bb%e5%8a%a0%e5%85%b3%e8%81%94" class="header-anchor"&gt;&lt;/a&gt;添加关联&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git remote add &amp;lt;name&amp;gt; &amp;lt;URL&amp;gt;&lt;/code&gt;：将本地已有仓库与一个远程仓库进行关联，其中&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;为对该远程仓库取得别名，常用origin作为该别名，&lt;code&gt;&amp;lt;URL&amp;gt;&lt;/code&gt;为远程仓库的地址。&lt;/p&gt;&#10;&lt;h3 id="查看关联"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e5%85%b3%e8%81%94" class="header-anchor"&gt;&lt;/a&gt;查看关联&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git remote -v&lt;/code&gt;：查看当前全部已关联库。&lt;/p&gt;&#10;&lt;h3 id="取消关联"&gt;&lt;a href="#%e5%8f%96%e6%b6%88%e5%85%b3%e8%81%94" class="header-anchor"&gt;&lt;/a&gt;取消关联&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git remote rm &amp;lt;name&amp;gt;&lt;/code&gt;：删除某个关联的&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;分支。&lt;/p&gt;&#10;&lt;h3 id="上传代码"&gt;&lt;a href="#%e4%b8%8a%e4%bc%a0%e4%bb%a3%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;上传代码&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git push &amp;lt;name&amp;gt; &amp;lt;branch&amp;gt;&lt;/code&gt;：将本地仓库名为&lt;code&gt;&amp;lt;branch&amp;gt;&lt;/code&gt;的分支上传至远程&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;仓库并合并，若两边分支名不同则应使用&lt;code&gt;&amp;lt;brach_local&amp;gt;:&amp;lt;branch_origin&amp;gt;&lt;/code&gt;分别填写上两边的分支名然后上传，若两边版本差异则需要添加&lt;code&gt;--force&lt;/code&gt;参数强制推送，若想未来简化&lt;code&gt;git push&lt;/code&gt;操作，可在&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;前添加&lt;code&gt;-u&lt;/code&gt;参数，未来&lt;code&gt;git push&lt;/code&gt;即可直接代替&lt;code&gt;git push &amp;lt;name&amp;gt; &amp;lt;branch&amp;gt;&lt;/code&gt;指令。&lt;/p&gt;&#10;&lt;h3 id="下载代码"&gt;&lt;a href="#%e4%b8%8b%e8%bd%bd%e4%bb%a3%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;下载代码&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git pull &amp;lt;name&amp;gt; &amp;lt;branch&amp;gt;&lt;/code&gt;：将远程&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;主机&lt;code&gt;&amp;lt;branch&amp;gt;&lt;/code&gt;分支的代码合并到本地，也可使用&lt;code&gt;&amp;lt;branch_origin&amp;gt;:&amp;lt;branch_local&amp;gt;&lt;/code&gt;来确定分支，当团队之间合作代码push推送失败时，可以使用&lt;code&gt;git pull&lt;/code&gt;来获取最新的提交，然后本地修改合并后再推送。注意，pull操作会直接合并，如果在合并前需要对照之类的操作应该使用fetch。&lt;/p&gt;&#10;&lt;h2 id="分支管理"&gt;&lt;a href="#%e5%88%86%e6%94%af%e7%ae%a1%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;分支管理&#10;&lt;/h2&gt;&lt;h3 id="连接分支"&gt;&lt;a href="#%e8%bf%9e%e6%8e%a5%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;连接分支&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git branch --set-upstream-to &amp;lt;branch&amp;gt; &amp;lt;name&amp;gt;/&amp;lt;branch&amp;gt;&lt;/code&gt;：如果pull失败并提示&lt;code&gt;no tracking information&lt;/code&gt;，则说明本地分支和远程分支没有连接，使用上述方法方法即可完成连接。&lt;/p&gt;&#10;&lt;h3 id="创建分支"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;创建分支&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git branch &amp;lt;name&amp;gt;&lt;/code&gt;：创建一个名为&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;的分支，创建分支并不会对之前分支的工作区产生改变。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git switch -c &amp;lt;branch&amp;gt; &amp;lt;name&amp;gt;/&amp;lt;branch&amp;gt;&lt;/code&gt;：跟踪一个远端&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;主机的&lt;code&gt;&amp;lt;branch&amp;gt;&lt;/code&gt;分支到本地。&lt;/p&gt;&#10;&lt;h3 id="切换分支"&gt;&lt;a href="#%e5%88%87%e6%8d%a2%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;切换分支&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git checkout &amp;lt;name&amp;gt;&lt;/code&gt;：切换到&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;分支，若中间加上&lt;code&gt;-b&lt;/code&gt;参数，则可以创建并切换。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git switch &amp;lt;name&amp;gt;&lt;/code&gt;：新版git提供的新指令，用于替代checkout，切换到&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;分支，若中间加上&lt;code&gt;-c&lt;/code&gt;参数，则可以创建并切换。&lt;/p&gt;&#10;&lt;h3 id="合并分支"&gt;&lt;a href="#%e5%90%88%e5%b9%b6%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;合并分支&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git merge &amp;lt;name&amp;gt;&lt;/code&gt;：将&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;分支合并到当前分支，如果合并产生了冲突，则需要手动合并冲突（即手动将文件编辑为我们想要的内容，git将在文件合并冲突位置处添加符号标注）。合并时如果加上&lt;code&gt;--no-ff&lt;/code&gt;参数即可使用普通模式合并，这样合并后的历史有分支，可以看出曾经做过合并，而如果不加则看不出来曾经做个合并。&lt;/p&gt;&#10;&lt;h3 id="删除分支"&gt;&lt;a href="#%e5%88%a0%e9%99%a4%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;删除分支&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git push &amp;lt;name&amp;gt; --delete &amp;lt;branch&amp;gt;&lt;/code&gt;：删除远端&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;仓库的&lt;code&gt;&amp;lt;branch&amp;gt;&lt;/code&gt;分支。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git branch -d &amp;lt;branch&amp;gt;&lt;/code&gt;：删除本地&lt;code&gt;&amp;lt;branch&amp;gt;&lt;/code&gt;分支，在删除前需要先切换到其它分支，若d改为大写D，则为强制删除。&lt;/p&gt;&#10;&lt;h3 id="查看分支"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;查看分支&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git branch&lt;/code&gt;：查看本地分支。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git branch -r&lt;/code&gt;：查看远端分支。&lt;/p&gt;&#10;&lt;h2 id="现场管理"&gt;&lt;a href="#%e7%8e%b0%e5%9c%ba%e7%ae%a1%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;现场管理&#10;&lt;/h2&gt;&lt;h3 id="保存现场"&gt;&lt;a href="#%e4%bf%9d%e5%ad%98%e7%8e%b0%e5%9c%ba" class="header-anchor"&gt;&lt;/a&gt;保存现场&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git stash&lt;/code&gt;：当急需继续对某另一分支进行操作而当前任务尚未结束无法提交，可以先保存现场，去处理完其它任务后再回来重新工作，保存现场后当前工作区将会恢复为上一次commit时的状态，直到恢复现场。&lt;/p&gt;&#10;&lt;h3 id="查看现场"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e7%8e%b0%e5%9c%ba" class="header-anchor"&gt;&lt;/a&gt;查看现场&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git stash list&lt;/code&gt;：查看现在已保存的现场，每个保存的现场均会拥有一个id进行标识。&lt;/p&gt;&#10;&lt;h3 id="恢复现场"&gt;&lt;a href="#%e6%81%a2%e5%a4%8d%e7%8e%b0%e5%9c%ba" class="header-anchor"&gt;&lt;/a&gt;恢复现场&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git stash pop&lt;/code&gt;：恢复现场并删除保存记录，如果产生冲突，文件会出现和合并时类似的改变。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git stash apply &amp;lt;id&amp;gt;&lt;/code&gt;：恢复id为&lt;code&gt;&amp;lt;id&amp;gt;&lt;/code&gt;的现场但不会删除记录，需要手动删除&lt;/p&gt;&#10;&lt;h3 id="删除现场"&gt;&lt;a href="#%e5%88%a0%e9%99%a4%e7%8e%b0%e5%9c%ba" class="header-anchor"&gt;&lt;/a&gt;删除现场&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git stash drop &amp;lt;id&amp;gt;&lt;/code&gt;：删除id为&lt;code&gt;&amp;lt;id&amp;gt;&lt;/code&gt;的现场。&lt;/p&gt;&#10;&lt;h3 id="获取修改"&gt;&lt;a href="#%e8%8e%b7%e5%8f%96%e4%bf%ae%e6%94%b9" class="header-anchor"&gt;&lt;/a&gt;获取修改&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git cherry-pick &amp;lt;commit_id&amp;gt;&lt;/code&gt;：从其它地方获取更改，但不同于merge，其获取的更改是以commit为单位而非分支，所以&lt;code&gt;&amp;lt;commit_id&amp;gt;&lt;/code&gt;即为所交commit的id，可以在对应分支通过log查询。&lt;/p&gt;&#10;&lt;h2 id="标签管理"&gt;&lt;a href="#%e6%a0%87%e7%ad%be%e7%ae%a1%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;标签管理&#10;&lt;/h2&gt;&lt;h3 id="添加标签"&gt;&lt;a href="#%e6%b7%bb%e5%8a%a0%e6%a0%87%e7%ad%be" class="header-anchor"&gt;&lt;/a&gt;添加标签&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git tag &amp;lt;TAG&amp;gt;&lt;/code&gt;：为一个commit打上标签，&lt;code&gt;&amp;lt;TAG&amp;gt;&lt;/code&gt;为标签内容。通过&lt;code&gt;git tag -a &amp;lt;TAG&amp;gt; -m &amp;lt;message&amp;gt; &amp;lt;commit_id&amp;gt;&lt;/code&gt;可以为id为&lt;code&gt;&amp;lt;commit_id&amp;gt;&lt;/code&gt;的提交打上标签&lt;code&gt;&amp;lt;TAG&amp;gt;&lt;/code&gt;并添加说明文字&lt;code&gt;&amp;lt;message&amp;gt;&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="查看标签"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e6%a0%87%e7%ad%be" class="header-anchor"&gt;&lt;/a&gt;查看标签&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git tag&lt;/code&gt;：可以查看历史打过的标签。&lt;/p&gt;&#10;&lt;h3 id="删除标签"&gt;&lt;a href="#%e5%88%a0%e9%99%a4%e6%a0%87%e7%ad%be" class="header-anchor"&gt;&lt;/a&gt;删除标签&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git tag -d &amp;lt;TAG&amp;gt;&lt;/code&gt;：删除名为&lt;code&gt;&amp;lt;TAG&amp;gt;&lt;/code&gt;的标签。&lt;/p&gt;&#10;&lt;h3 id="推送标签"&gt;&lt;a href="#%e6%8e%a8%e9%80%81%e6%a0%87%e7%ad%be" class="header-anchor"&gt;&lt;/a&gt;推送标签&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git push &amp;lt;name&amp;gt; &amp;lt;TAG&amp;gt;&lt;/code&gt;：标签本身不会自动上传到远端服务器，通过此指令可以将&lt;code&gt;&amp;lt;TAG&amp;gt;&lt;/code&gt;推送到远端&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;主机上。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git push &amp;lt;name&amp;gt; :refs/tags/&amp;lt;TAG&amp;gt;&lt;/code&gt;：通过本指令可以将已上传至远端的标签删除。&lt;/p&gt;&#10;</description></item><item><title>如何在Vim中使用系统剪贴板</title><link>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/%E5%A6%82%E4%BD%95%E5%9C%A8vim%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%B3%BB%E7%BB%9F%E5%89%AA%E8%B4%B4%E6%9D%BF/</link><pubDate>Fri, 25 Dec 2020 21:10:10 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/%E5%A6%82%E4%BD%95%E5%9C%A8vim%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%B3%BB%E7%BB%9F%E5%89%AA%E8%B4%B4%E6%9D%BF/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/%E5%A6%82%E4%BD%95%E5%9C%A8vim%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%B3%BB%E7%BB%9F%E5%89%AA%E8%B4%B4%E6%9D%BF/cover.jpg" alt="Featured image of post 如何在Vim中使用系统剪贴板" /&gt;&lt;p&gt;作为一名砖业的CV攻城狮候补，在使用vim时因为vim的剪贴板是一块单独的内存，不能很方便地CV我们在网上找到的优秀代码，这实在让我感到非常头疼，故而在网上搜了一下如何让vim能够使用系统剪贴板，在这里记录一下。&lt;/p&gt;&#10;&lt;p&gt;首先在终端里执行&lt;code&gt;vim --version | grep clipboard&lt;/code&gt;指令，这句话的意思大概是在vim的配置中搜索clipboard（剪贴板），然后我们可以看到一个配置名全称就是clipboard，它前面的符号有两种情况，如果是+号则说明可以在vim中使用系统剪贴板，只是需要一点特殊的指令。而如果是-号则说明暂时不能在vim中使用系统剪贴板，在这种情况下我们需要下载插件。根据我在网上看到的各种帖子，有两种方法，一是&lt;code&gt;sudo apt-get install vim-gnome&lt;/code&gt;另一个是&lt;code&gt;sudo apt-get install vim-gtk&lt;/code&gt;，我先是使用了第一种安装vim-gnome，但是不知道为什么无法安装，显示的已被引用。&lt;/p&gt;&#10;&lt;p&gt;我搜了很多帖子并且尝试了很多方法，但是这个vim-gnome始终无法安装上去，所以这个方法就被我pass了，不过我没有直接使用vim-gtk这种方法，而是直接用.vimrc文件来配置了一下，先是通过vim处理.vimrc配置文件：&lt;code&gt;vim ~/.vimrc&lt;/code&gt;，然后在.vimrc文件中输入一行&lt;code&gt;set clipboard=unnamedplus&lt;/code&gt;这句话的意思是让vim的剪贴板与外部剪贴板连接。然后我就直接可以在vim中使用y、p、d、x指令与系统剪贴板连通了。感觉这句话的意思有可能是让系统剪贴板和vim剪贴板的地址直接相等，这样在这段内存中Linux系统与vim就可以直接公用了。&lt;/p&gt;&#10;&lt;p&gt;然后因为各种原因，我重装了一个新的Linux，这一次我使用了上面说的第二种方法，安装了vim-gtk，然后在安装了这个插件后，使用&lt;code&gt;vim --version | grep clipboard&lt;/code&gt;就可以看见clipboard的配置前面的符号变成了+号，这个时候如果进入vim，就可以使用&lt;code&gt;“+y&lt;/code&gt;这类语句调用系统剪贴板了。详细可见&lt;a class="link" href="https://www.zhihu.com/question/47691414/answer/374044474" target="_blank" rel="noopener"&#10; &gt;知乎回答&lt;/a&gt;。&lt;/p&gt;&#10;</description></item><item><title>3D打印机打印中途停止且显示挤出头温度过低</title><link>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/3d%E6%89%93%E5%8D%B0%E6%9C%BA%E6%89%93%E5%8D%B0%E4%B8%AD%E9%80%94%E5%81%9C%E6%AD%A2%E4%B8%94%E6%98%BE%E7%A4%BA%E6%8C%A4%E5%87%BA%E5%A4%B4%E6%B8%A9%E5%BA%A6%E8%BF%87%E4%BD%8E/</link><pubDate>Mon, 24 Aug 2020 23:49:15 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/3d%E6%89%93%E5%8D%B0%E6%9C%BA%E6%89%93%E5%8D%B0%E4%B8%AD%E9%80%94%E5%81%9C%E6%AD%A2%E4%B8%94%E6%98%BE%E7%A4%BA%E6%8C%A4%E5%87%BA%E5%A4%B4%E6%B8%A9%E5%BA%A6%E8%BF%87%E4%BD%8E/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/3d%E6%89%93%E5%8D%B0%E6%9C%BA%E6%89%93%E5%8D%B0%E4%B8%AD%E9%80%94%E5%81%9C%E6%AD%A2%E4%B8%94%E6%98%BE%E7%A4%BA%E6%8C%A4%E5%87%BA%E5%A4%B4%E6%B8%A9%E5%BA%A6%E8%BF%87%E4%BD%8E/cover.jpg" alt="Featured image of post 3D打印机打印中途停止且显示挤出头温度过低" /&gt;&lt;h1 id="3d-打印机打印中途停止且显示挤出头温度过低"&gt;&lt;a href="#3d-%e6%89%93%e5%8d%b0%e6%9c%ba%e6%89%93%e5%8d%b0%e4%b8%ad%e9%80%94%e5%81%9c%e6%ad%a2%e4%b8%94%e6%98%be%e7%a4%ba%e6%8c%a4%e5%87%ba%e5%a4%b4%e6%b8%a9%e5%ba%a6%e8%bf%87%e4%bd%8e" class="header-anchor"&gt;&lt;/a&gt;3D 打印机打印中途停止且显示挤出头温度过低&#10;&lt;/h1&gt;&lt;!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} --&gt;&#10;&lt;!-- code_chunk_output --&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#3d-%e6%89%93%e5%8d%b0%e6%9c%ba%e6%89%93%e5%8d%b0%e4%b8%ad%e9%80%94%e5%81%9c%e6%ad%a2%e4%b8%94%e6%98%be%e7%a4%ba%e6%8c%a4%e5%87%ba%e5%a4%b4%e6%b8%a9%e5%ba%a6%e8%bf%87%e4%bd%8e" &gt;3D 打印机打印中途停止且显示挤出头温度过低&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%89%93%e5%8d%b0%e6%9c%ba%e5%9e%8b%e5%8f%b7" &gt;打印机型号&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%97%ae%e9%a2%98" &gt;问题&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95" &gt;解决方法&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b3%a8%e6%84%8f" &gt;注意&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;!-- /code_chunk_output --&gt;&#10;&lt;h2 id="打印机型号"&gt;&lt;a href="#%e6%89%93%e5%8d%b0%e6%9c%ba%e5%9e%8b%e5%8f%b7" class="header-anchor"&gt;&lt;/a&gt;打印机型号&#10;&lt;/h2&gt;&lt;p&gt;Anycubic chiron3D&lt;/p&gt;&#10;&lt;h2 id="问题"&gt;&lt;a href="#%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;问题&#10;&lt;/h2&gt;&lt;p&gt;PLA 在 200℃ 打印过程中突然停止，挤出头在屏幕上显示温度降到约 120 度左右，喷头处于打印件之间出现明显的结节，退回到主菜单显示挤出头温度过低。同时打印件部分平面有明显的缺陷空隙，在点击结束打印后再次进入打印界面无模型文件。&lt;/p&gt;&#10;&lt;h2 id="解决方法"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;解决方法&#10;&lt;/h2&gt;&lt;p&gt;因为故障后无法读取存储卡文件，怀疑是固件问题，通过 USB 接口将电脑连接打印机，使用切片软件（我用的 Cura4.6），选择打印机-&amp;gt;上传固件，同时将之前的 gcode 文件重新生成（不确定这一步是否必须）。&lt;/p&gt;&#10;&lt;h2 id="注意"&gt;&lt;a href="#%e6%b3%a8%e6%84%8f" class="header-anchor"&gt;&lt;/a&gt;注意&#10;&lt;/h2&gt;&lt;p&gt;以上仅为我个人在此次遇到这种问题时的解决方法，并不一定适用于所有机器以及所有情况，其他情况还有：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;使用电脑直接联机打印，可能中间在数据传输过程中出现问题。&lt;/li&gt;&#10;&lt;li&gt;储存卡中文件异常，可能是切片软件使用了某种不应该使用的插件，或是在导出或生成过程中出现错误，或是存储卡热插拔导致存储失败。&lt;/li&gt;&#10;&lt;li&gt;供电电压不稳定，确定好供电电压是否正常，且确定是否和打印机工作电压相匹配。&lt;/li&gt;&#10;&lt;li&gt;如在使用我的解决办法后没有解决且以上可能都排除后，请确定存储卡、挤出头、挤出机等设备是否出现问题，若是非 DIY 产品最好找客服。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item></channel></rss>