<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>AI 代写 on suyiiyii&#39;s blog</title>
        <link>https://suyiiyii.com/tags/ai-%E4%BB%A3%E5%86%99/</link>
        <description>Recent content in AI 代写 on suyiiyii&#39;s blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Tue, 02 Jun 2026 08:00:00 +0800</lastBuildDate><atom:link href="https://suyiiyii.com/tags/ai-%E4%BB%A3%E5%86%99/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>ASR 半年复盘：从 Whisper 到多模型 Pipeline 的工程实践</title>
        <link>https://suyiiyii.com/p/asr-%E5%8D%8A%E5%B9%B4%E5%A4%8D%E7%9B%98%E4%BB%8E-whisper-%E5%88%B0%E5%A4%9A%E6%A8%A1%E5%9E%8B-pipeline-%E7%9A%84%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/</link>
        <pubDate>Tue, 02 Jun 2026 08:00:00 +0800</pubDate>
        
        <guid>https://suyiiyii.com/p/asr-%E5%8D%8A%E5%B9%B4%E5%A4%8D%E7%9B%98%E4%BB%8E-whisper-%E5%88%B0%E5%A4%9A%E6%A8%A1%E5%9E%8B-pipeline-%E7%9A%84%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;本文由 Claude Code (DeepSeek v4) 代写，suyiiyii 审阅。写作风格参照 tw93。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;前言&#34;&gt;前言
&lt;/h2&gt;&lt;p&gt;年初在 pc-5950x 上搭了个 Whisper HTTP 服务，本来以为半天能搞定的事情，结果一路折腾了六个月。中间换了 7 个模型，写过异步队列，修过 Windows GPU 驱动 bug，拼过 speaker diarization，最后搞出了一套多模型 pipeline + benchmark 体系。&lt;/p&gt;
&lt;p&gt;我又把当时的运维记录、benchmark 数据和现在的线上服务一起过了一遍，把整个过程系统化梳理了一下。以下不是什么最佳实践，只是半年踩坑下来的一些记录和判断。&lt;/p&gt;
&lt;h2 id=&#34;六个阶段的演进&#34;&gt;六个阶段的演进
&lt;/h2&gt;&lt;p&gt;整个过程可以分成六个阶段，每个阶段其实都在解决上一阶段暴露出来的问题。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;阶段&lt;/th&gt;
          &lt;th&gt;时间&lt;/th&gt;
          &lt;th&gt;核心问题&lt;/th&gt;
          &lt;th&gt;关键决策&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1. 单模型起服务&lt;/td&gt;
          &lt;td&gt;2 月底&lt;/td&gt;
          &lt;td&gt;Whisper 中文不够好&lt;/td&gt;
          &lt;td&gt;加部署 Qwen3-ASR-1.7B&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2. 稳定性&lt;/td&gt;
          &lt;td&gt;4 月&lt;/td&gt;
          &lt;td&gt;服务频繁挂掉&lt;/td&gt;
          &lt;td&gt;修 WDDM TDR + 监控自动重启&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3. 转写质量&lt;/td&gt;
          &lt;td&gt;5 月初&lt;/td&gt;
          &lt;td&gt;长音频只出 20% 文字&lt;/td&gt;
          &lt;td&gt;异步队列 + 缩小分块&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4. 模型选型&lt;/td&gt;
          &lt;td&gt;5 月中&lt;/td&gt;
          &lt;td&gt;速度和质量的 tradeoff&lt;/td&gt;
          &lt;td&gt;6 模型对比，选 Fun-ASR-Nano&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5. 后处理实验&lt;/td&gt;
          &lt;td&gt;5 月底&lt;/td&gt;
          &lt;td&gt;专有名词仍有差距&lt;/td&gt;
          &lt;td&gt;LLM 后处理 + speaker 尝试&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;6. 云 + 本地混合&lt;/td&gt;
          &lt;td&gt;5 月底至今&lt;/td&gt;
          &lt;td&gt;长音频时间戳 + speaker 不准&lt;/td&gt;
          &lt;td&gt;StepAudio 2.5 主线 + CAM++/pyannote ensemble&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;说白了，每一步都不是主动规划的，而是被问题推着走的。&lt;/p&gt;
&lt;h2 id=&#34;模型选型的几个关键判断&#34;&gt;模型选型的几个关键判断
&lt;/h2&gt;&lt;p&gt;折腾了 7 个模型之后，发现 ASR 这边其实就两类架构，各有各的问题。&lt;/p&gt;
&lt;h3 id=&#34;两类架构的本质区别&#34;&gt;两类架构的本质区别
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;纯声学模型&lt;/th&gt;
          &lt;th&gt;LLM 骨架模型&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;代表&lt;/td&gt;
          &lt;td&gt;SenseVoice-Small (234M)、Paraformer-large (220M)&lt;/td&gt;
          &lt;td&gt;Qwen3-ASR (1.7B)、Fun-ASR-Nano (800M)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;推理方式&lt;/td&gt;
          &lt;td&gt;非自回归，一次前向出全文&lt;/td&gt;
          &lt;td&gt;自回归，逐 token 生成&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;速度&lt;/td&gt;
          &lt;td&gt;RTF 0.01x，14 分钟音频 8 秒搞定&lt;/td&gt;
          &lt;td&gt;RTF 0.15-1.0x，14 分钟音频 1.5-14 分钟&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;专有名词&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;chatgpt.com&lt;/code&gt; → &lt;code&gt;chGBT 点 com&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;chatgpt.com&lt;/code&gt; → &lt;code&gt;ChatGPT.com&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;长音频表现&lt;/td&gt;
          &lt;td&gt;稳定，不退化&lt;/td&gt;
          &lt;td&gt;大多数会退化或崩溃&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;核心矛盾&lt;/strong&gt;：纯声学模型快但专有名词很差，LLM 骨架模型专有名词好但慢且长音频不稳定。目前没有一个&amp;quot;全都要&amp;quot;的方案。&lt;/p&gt;
&lt;h3 id=&#34;长音频退化是选型的决定性因素&#34;&gt;长音频退化是选型的决定性因素
&lt;/h3&gt;&lt;p&gt;实测数据（11.7 分钟中文音频）：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;模型&lt;/th&gt;
          &lt;th&gt;输出字数&lt;/th&gt;
          &lt;th&gt;字/秒&lt;/th&gt;
          &lt;th&gt;退化情况&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Fun-ASR-Nano&lt;/td&gt;
          &lt;td&gt;2,477&lt;/td&gt;
          &lt;td&gt;3.5&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;无退化&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Qwen3-ASR-1.7B&lt;/td&gt;
          &lt;td&gt;841&lt;/td&gt;
          &lt;td&gt;1.2（后半段）&lt;/td&gt;
          &lt;td&gt;退化 3x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GLM-ASR-Nano&lt;/td&gt;
          &lt;td&gt;85&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;完全崩溃&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Qwen3-ASR 在短音频上是我用过最好的本地模型，但长音频后半段基本上在划水。Fun-ASR-Nano 是唯一一个长音频不退化、专有名词也还行的选择。不过它的 VAD 模块有 bug（funasr 1.3.1 的 &lt;code&gt;KeyError: 0&lt;/code&gt;），得手动修一下源码。&lt;/p&gt;
&lt;h3 id=&#34;最终选择&#34;&gt;最终选择
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;场景&lt;/th&gt;
          &lt;th&gt;方案&lt;/th&gt;
          &lt;th&gt;理由&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;生产主线&lt;/td&gt;
          &lt;td&gt;StepAudio 2.5（云端）&lt;/td&gt;
          &lt;td&gt;0.15 元/小时，质量和速度都最好&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;本地 backup&lt;/td&gt;
          &lt;td&gt;Fun-ASR-Nano（8002）&lt;/td&gt;
          &lt;td&gt;离线可用，质量接近商用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;实验&lt;/td&gt;
          &lt;td&gt;Qwen3-ASR（8003）&lt;/td&gt;
          &lt;td&gt;专有名词好，短音频可用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Speaker&lt;/td&gt;
          &lt;td&gt;CAM++ + pyannote ensemble&lt;/td&gt;
          &lt;td&gt;gate 通过率 5/5&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;windows-上跑-gpu-服务的几个坑&#34;&gt;Windows 上跑 GPU 服务的几个坑
&lt;/h2&gt;&lt;p&gt;这部分其实是耗时最长的。Windows 当服务器用，有三个问题绕不开。&lt;/p&gt;
&lt;h3 id=&#34;wddm-tdr&#34;&gt;WDDM TDR
&lt;/h3&gt;&lt;p&gt;Windows 的 GPU 保护机制：GPU 操作超过 2 秒没响应 → 直接杀进程。日志来不及写，就是 0 字节。&lt;/p&gt;
&lt;p&gt;修法：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;reg&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;TdrDelay&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;REG_DWORD&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;从 2 秒改到 10 秒。不是根治，但触发频率大幅降低。&lt;/p&gt;
&lt;h3 id=&#34;进程持久化&#34;&gt;进程持久化
&lt;/h3&gt;&lt;p&gt;Windows 计划任务 + PowerShell 脚本的组合能用，但问题很多。后台进程的 GPU 资源访问权限受限，进程优先级也低。后来换到 WSL2 + systemd 管理，体验好了不少。&lt;/p&gt;
&lt;h3 id=&#34;消费级-gpu-的限制&#34;&gt;消费级 GPU 的限制
&lt;/h3&gt;&lt;p&gt;RTX 2060 SUPER 不支持持久化模式，每次进程重启都要重新初始化 GPU 驱动。这个没办法解决，是硬件限制。&lt;/p&gt;
&lt;h2 id=&#34;benchmark-体系建设&#34;&gt;Benchmark 体系建设
&lt;/h2&gt;&lt;p&gt;没有 benchmark 之前，模型选型基本靠感觉。后来设计了 5 段覆盖不同场景的测试集：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;样本&lt;/th&gt;
          &lt;th&gt;时长&lt;/th&gt;
          &lt;th&gt;内容类型&lt;/th&gt;
          &lt;th&gt;难度&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;差评君&lt;/td&gt;
          &lt;td&gt;11.3min&lt;/td&gt;
          &lt;td&gt;单人讲解，科技类&lt;/td&gt;
          &lt;td&gt;低&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;罗福莉访谈&lt;/td&gt;
          &lt;td&gt;30min&lt;/td&gt;
          &lt;td&gt;双人对话，AI 技术&lt;/td&gt;
          &lt;td&gt;中&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;姚顺宇访谈&lt;/td&gt;
          &lt;td&gt;60min&lt;/td&gt;
          &lt;td&gt;双人对话，AI 训练&lt;/td&gt;
          &lt;td&gt;中&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;团山北路&lt;/td&gt;
          &lt;td&gt;27.9min&lt;/td&gt;
          &lt;td&gt;三人自然对话&lt;/td&gt;
          &lt;td&gt;高&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;暂停实验室&lt;/td&gt;
          &lt;td&gt;16.7min&lt;/td&gt;
          &lt;td&gt;单人播客，心理类&lt;/td&gt;
          &lt;td&gt;低&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;以豆包 ASR 输出作为近似基准，用文本相似度做客观对比。当前 8006 服务（StepAudio 2.5 + speaker ensemble）的 benchmark 结果：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;样本&lt;/th&gt;
          &lt;th&gt;文本相似度&lt;/th&gt;
          &lt;th&gt;速度&lt;/th&gt;
          &lt;th&gt;Speaker&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;差评君&lt;/td&gt;
          &lt;td&gt;0.9696&lt;/td&gt;
          &lt;td&gt;9.10x&lt;/td&gt;
          &lt;td&gt;stable / 1 人&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;罗福莉&lt;/td&gt;
          &lt;td&gt;0.9260&lt;/td&gt;
          &lt;td&gt;7.32x&lt;/td&gt;
          &lt;td&gt;stable / 2 人&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;姚顺宇&lt;/td&gt;
          &lt;td&gt;0.9500&lt;/td&gt;
          &lt;td&gt;7.47x&lt;/td&gt;
          &lt;td&gt;stable / 2 人&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;团山北路&lt;/td&gt;
          &lt;td&gt;0.8999&lt;/td&gt;
          &lt;td&gt;9.99x&lt;/td&gt;
          &lt;td&gt;stable / 3 人&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;暂停实验室&lt;/td&gt;
          &lt;td&gt;0.9856&lt;/td&gt;
          &lt;td&gt;8.36x&lt;/td&gt;
          &lt;td&gt;stable / 1 人&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;团山北路分数最低，但不是模型的问题——这段是三人自然对话，豆包偏书面整理，StepAudio 偏口语保留，风格不同导致相似度低。speaker 方面，豆包给了 8 个人，但实际只有 3 人在说话，这也印证了 speaker 不能直接用 ASR 自带的结果。&lt;/p&gt;
&lt;h2 id=&#34;当前架构&#34;&gt;当前架构
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;客户端&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;→&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Caddy&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;99&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ECS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Basic&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Auth&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;TLS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           &lt;span class=&#34;err&#34;&gt;→&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Tailscale&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;err&#34;&gt;→&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;WSL2&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5950&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 &lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8006&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;StepAudio&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.5&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;主线&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;~&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.15&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;元&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;小时&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 &lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8002&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Fun&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ASR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Nano&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;backup&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;离线可用&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 &lt;span class=&#34;err&#34;&gt;└──&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Speaker&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;CAM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;pyannote&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ensemble&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;gate&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;通过才输出&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;设计原则按优先级排：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;语义真实性&lt;/strong&gt; — 不做 LLM 改写、不做 ITN、保留语气词和口语表达&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;经济性&lt;/strong&gt; — 主线 0.15 元/小时，低于 0.25 元/小时的心理预算&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;说话人识别&lt;/strong&gt; — 默认关闭，需要时开启，gate 不通过就不输出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效率&lt;/strong&gt; — 纯 ASR 7-10x，开 speaker 仍高于 2x&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;后续&#34;&gt;后续
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;speaker memory 现在只是匿名 cluster label，需要升级到真实声纹 embedding&lt;/li&gt;
&lt;li&gt;团山北路的 speaker 时间轴需要人工听音频复核&lt;/li&gt;
&lt;li&gt;长音频边界 chunk 的合并策略还可以优化&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;划重点&#34;&gt;划重点
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;ASR 模型分纯声学和 LLM 骨架两类，前者快但专有名词差，后者相反，目前没有全都要的方案&lt;/li&gt;
&lt;li&gt;长音频退化是选型的决定性因素——短音频跑得好的模型，不一定能撑住 30 分钟以上&lt;/li&gt;
&lt;li&gt;Windows 跑 GPU 服务，WDDM TDR 是第一个要解决的问题&lt;/li&gt;
&lt;li&gt;Fun-ASR-Nano 是目前最好的本地方案，StepAudio 2.5 是性价比最高的云端方案&lt;/li&gt;
&lt;li&gt;没有 benchmark 之前，模型选型基本靠感觉；有了 benchmark，讨论才有共同基础&lt;/li&gt;
&lt;li&gt;Speaker diarization 要加 gate——不稳定就不输出，比输出错误结果好&lt;/li&gt;
&lt;li&gt;用 Notion 写文章 + Elog 同步 + CF Pages 自动部署，改个 status 就能触发上线&lt;/li&gt;
&lt;li&gt;本地 ASR 能做到商用 API 90-98% 的文本相似度，专有名词差距在缩小&lt;/li&gt;
&lt;li&gt;0.15 元/小时的云端 ASR + 本地 backup 的组合，目前用起来最舒服&lt;/li&gt;
&lt;li&gt;这套东西从&amp;quot;搭个 HTTP 服务&amp;quot;膨胀到多模型 pipeline，本质是被问题推着走的，不是提前设计的&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;参考：FunASR 团队、StepFun、豆包 ASR、pyannote、CAM++。如果你有更好的 ASR 实践经验，也欢迎一起交流。&lt;/em&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>ASR 折腾记：从 Whisper 到多模型 Pipeline 的半年探索</title>
        <link>https://suyiiyii.com/p/asr-%E6%8A%98%E8%85%BE%E8%AE%B0%E4%BB%8E-whisper-%E5%88%B0%E5%A4%9A%E6%A8%A1%E5%9E%8B-pipeline-%E7%9A%84%E5%8D%8A%E5%B9%B4%E6%8E%A2%E7%B4%A2/</link>
        <pubDate>Tue, 02 Jun 2026 08:00:00 +0800</pubDate>
        
        <guid>https://suyiiyii.com/p/asr-%E6%8A%98%E8%85%BE%E8%AE%B0%E4%BB%8E-whisper-%E5%88%B0%E5%A4%9A%E6%A8%A1%E5%9E%8B-pipeline-%E7%9A%84%E5%8D%8A%E5%B9%B4%E6%8E%A2%E7%B4%A2/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;本文由 Claude Code (DeepSeek v4) 代写，suyiiyii 审阅。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;摘要&#34;&gt;摘要
&lt;/h2&gt;&lt;p&gt;在 RTX 2060 SUPER 上，从搭一个 Whisper HTTP 服务开始，到折腾 7 个 ASR 模型、改异步队列、修 WDDM TDR、拼 speaker diarization、写 benchmark——半年时间，把一台 Windows 游戏机搞成了能打的生产级语音转写平台。&lt;/p&gt;
&lt;h2 id=&#34;背景&#34;&gt;背景
&lt;/h2&gt;&lt;p&gt;有录音转写的需求。一开始的想法很简单：pc-5950x 上有张 RTX 2060 SUPER 8G，闲着也是闲着，装个 Speaches（faster-whisper 的 OpenAI 兼容包装），起个 HTTP API，完事。&lt;/p&gt;
&lt;p&gt;2026 年 2 月 21 号，照着文档把 Speaches 部署好了。Whisper large-v3，GPU float16 推理，&lt;code&gt;POST /v1/audio/transcriptions&lt;/code&gt;，返回 &lt;code&gt;{&amp;quot;text&amp;quot;: &amp;quot;...&amp;quot;}&lt;/code&gt;。挺顺利的。&lt;/p&gt;
&lt;p&gt;然后发现 Whisper 的中文转写质量不太行。行吧，再部署一个 Qwen3-ASR-1.7B。2 月 27 号搞完，端口 8002，同样是 OpenAI 兼容 API。两个服务并存，客户端切个 &lt;code&gt;base_url&lt;/code&gt; 就能换模型。&lt;/p&gt;
&lt;p&gt;一切都很好。直到服务开始莫名其妙挂掉。&lt;/p&gt;
&lt;h2 id=&#34;windows-教你做人wddm-tdr&#34;&gt;Windows 教你做人——WDDM TDR
&lt;/h2&gt;&lt;h3 id=&#34;服务又挂了&#34;&gt;服务又挂了
&lt;/h3&gt;&lt;p&gt;某天打开 Uptime Kuma，8002 端口红了。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ curl http://100.67.187.87:8002/health
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl: &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; Failed to connect
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;SSH 上去看，GPU 正常、系统没重启、端口没监听。去看日志文件——全部 0 字节。进程被杀了，但没留下任何痕迹。&lt;/p&gt;
&lt;p&gt;这种事情发生了不止一次。4 月 12 号一次，4 月 26 号又一次。每次都是手动重启，过几天又挂。&lt;/p&gt;
&lt;h3 id=&#34;根因&#34;&gt;根因
&lt;/h3&gt;&lt;p&gt;经过深入调查（读了半天微软文档），找到了罪魁祸首：&lt;strong&gt;WDDM TDR（Timeout Detection and Recovery）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Windows 有一个 GPU 保护机制：如果 GPU 操作超过 2 秒没响应，系统会&lt;strong&gt;直接杀掉进程&lt;/strong&gt;并重置 GPU 驱动。不打招呼，不给时间写日志，秒退。&lt;/p&gt;
&lt;p&gt;RTX 2060 SUPER 是消费级显卡，不支持持久化模式。而且通过计划任务启动的后台进程，更容易被系统资源管理器&amp;quot;特殊照顾&amp;quot;。&lt;/p&gt;
&lt;p&gt;Qwen3-ASR 跑的是自回归推理，一个长 chunk 的 GPU 操作可能超过 2 秒——然后就被 Windows 判了死刑。&lt;/p&gt;
&lt;p&gt;一开始以为是 Python 代码的问题——可能是显存泄漏、可能是 uvicorn 挂了。看了半天日志（空的），又检查了 GPU 状态（正常），最后查到 Windows 事件查看器才发现：进程是被系统杀的。根因是 Windows 的设计限制，不是代码 bug。&lt;/p&gt;
&lt;h3 id=&#34;解决方案&#34;&gt;解决方案
&lt;/h3&gt;&lt;p&gt;三步走：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 改 TDR 超时&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;reg&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TdrDelay&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REG_DWORD&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;reg&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TdrDdiDelay&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REG_DWORD&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;从 2 秒改到 10 秒。不是根治，但大幅降低了触发概率。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 自动监控 + 重启&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;写了个 PowerShell 脚本，每 5 分钟调一次 &lt;code&gt;/health&lt;/code&gt;。挂了就自动重启。最多 5 分钟 downtime，不需要人工干预。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 提升进程优先级&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;启动脚本里加了 &lt;code&gt;PriorityClass = &amp;quot;AboveNormal&amp;quot;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;搞完之后：可用性从 ~95% 提到了 &amp;gt;99.5%。虽然 WDDM TDR 的根本问题还在（这是 Windows 的事），但至少不会一挂就是半天没人管了。&lt;/p&gt;
&lt;h2 id=&#34;转写质量14-分钟音频只出了-1180-个字&#34;&gt;转写质量——&amp;ldquo;14 分钟音频只出了 1180 个字？&amp;rdquo;
&lt;/h2&gt;&lt;h3 id=&#34;并发崩溃--文本截断&#34;&gt;并发崩溃 + 文本截断
&lt;/h3&gt;&lt;p&gt;5 月 5 号，遇到了两个新问题。&lt;/p&gt;
&lt;p&gt;第一个：3 个 subagent 同时提交 14 分钟音频到 &lt;code&gt;/v1/audio/transcriptions&lt;/code&gt;，服务直接崩了。原因是同步 API 设计——客户端上传文件后要维持长连接等 4 分钟处理完。3 个大文件同时加载到内存，OOM。&lt;/p&gt;
&lt;p&gt;第二个更严重：14 分钟的音频，转写出来只有 ~1180 个字符。同样的音频，火山引擎（豆包）付费 API 给出了 5606 字符。差了将近 5 倍。&lt;/p&gt;
&lt;h3 id=&#34;排查&#34;&gt;排查
&lt;/h3&gt;&lt;p&gt;先怀疑 &lt;code&gt;max_new_tokens=256&lt;/code&gt; 不够。改成 2048——结果还是 1180 字。&lt;del&gt;不是 token 限制。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;又怀疑是分块的问题。尝试去掉分块，840s 音频整段直传模型——encoder 直接 OOM。8G 显存确实装不下。&lt;/p&gt;
&lt;p&gt;emmmmm。&lt;/p&gt;
&lt;p&gt;回看之前的边界测试数据：30s chunk → 6.0 chars/s，300s chunk → 1.35 chars/s。&lt;/p&gt;
&lt;p&gt;💡！chunk 越大，模型越倾向于&amp;quot;总结式&amp;quot;转写而非&amp;quot;逐字式&amp;quot;转写。300s 的 chunk，模型觉得&amp;quot;这太长了，我帮你概括一下吧&amp;quot;——然后就只输出了 20% 的内容。&lt;/p&gt;
&lt;h3 id=&#34;解决&#34;&gt;解决
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;异步 Job 队列&lt;/strong&gt;：把同步 API 改成异步。POST 立即返回 &lt;code&gt;job_id&lt;/code&gt;，后台 Worker 串行处理，客户端轮询。不再崩了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;分块优化&lt;/strong&gt;：&lt;code&gt;MAX_CHUNK_MS&lt;/code&gt; 从 300000 → 120000，&lt;code&gt;max_new_tokens&lt;/code&gt; 从 256 → 2048。&lt;/p&gt;
&lt;p&gt;结果：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方案&lt;/th&gt;
          &lt;th&gt;chunk&lt;/th&gt;
          &lt;th&gt;max_tokens&lt;/th&gt;
          &lt;th&gt;字符数&lt;/th&gt;
          &lt;th&gt;完整度&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;v0.8.0 本地&lt;/td&gt;
          &lt;td&gt;300s&lt;/td&gt;
          &lt;td&gt;256&lt;/td&gt;
          &lt;td&gt;1,180&lt;/td&gt;
          &lt;td&gt;~20%&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;v0.9.0 本地&lt;/td&gt;
          &lt;td&gt;120s&lt;/td&gt;
          &lt;td&gt;2048&lt;/td&gt;
          &lt;td&gt;5,620&lt;/td&gt;
          &lt;td&gt;~95%&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;火山引擎付费&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;5,606&lt;/td&gt;
          &lt;td&gt;~95%&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;本地 ASR 和付费 API 基本持平了。虽然速度慢一些（RTF ~1.0x，就是 1:1），但质量能打。😁&lt;/p&gt;
&lt;h2 id=&#34;模型大乱斗到底哪个最好用&#34;&gt;模型大乱斗——到底哪个最好用？
&lt;/h2&gt;&lt;p&gt;Qwen3-ASR 能用，但太慢了。14 分钟音频要跑 14 分钟。于是开始物色替代方案。&lt;/p&gt;
&lt;h3 id=&#34;候选模型&#34;&gt;候选模型
&lt;/h3&gt;&lt;p&gt;拉出来测了 6 个模型：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;模型&lt;/th&gt;
          &lt;th&gt;类型&lt;/th&gt;
          &lt;th&gt;参数量&lt;/th&gt;
          &lt;th&gt;架构&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Whisper large-v3&lt;/td&gt;
          &lt;td&gt;纯声学&lt;/td&gt;
          &lt;td&gt;1.5B&lt;/td&gt;
          &lt;td&gt;Transformer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Qwen3-ASR-1.7B&lt;/td&gt;
          &lt;td&gt;LLM 骨架&lt;/td&gt;
          &lt;td&gt;1.7B&lt;/td&gt;
          &lt;td&gt;自回归&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SenseVoice-Small&lt;/td&gt;
          &lt;td&gt;纯声学&lt;/td&gt;
          &lt;td&gt;234M&lt;/td&gt;
          &lt;td&gt;非自回归&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Paraformer-large&lt;/td&gt;
          &lt;td&gt;纯声学&lt;/td&gt;
          &lt;td&gt;220M&lt;/td&gt;
          &lt;td&gt;非自回归&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Fun-ASR-Nano-2512&lt;/td&gt;
          &lt;td&gt;LLM 骨架&lt;/td&gt;
          &lt;td&gt;800M&lt;/td&gt;
          &lt;td&gt;LLM+encoder&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GLM-ASR-Nano&lt;/td&gt;
          &lt;td&gt;LLM 骨架&lt;/td&gt;
          &lt;td&gt;1.5B&lt;/td&gt;
          &lt;td&gt;LLM+encoder&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;测试音频统一用了一段 54 秒中文录音 + 3 分钟片段 + 11.7 分钟完整音频。&lt;/p&gt;
&lt;h3 id=&#34;结果&#34;&gt;结果
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;纯声学模型（SenseVoice、Paraformer）&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;快是真的快。SenseVoice-Small 的 RTF 只有 0.01x——14 分钟音频 8 秒搞定，100 倍于 Qwen3-ASR。显存才吃 1.5G。&lt;/p&gt;
&lt;p&gt;但专有名词全崩：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chatgpt.com&lt;/code&gt; → &lt;code&gt;chGBT 点 com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chatgpt.com&lt;/code&gt; → &lt;code&gt;charge BT 点 com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;音近误识。纯声学模型没有语言模型纠错，遇到不常见的词就直接音译。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;带 LLM 骨架的模型&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;Qwen3-ASR 短音频的专有名词最好（&lt;code&gt;chatgpt.com&lt;/code&gt; 正确识别），但&lt;strong&gt;长音频会退化&lt;/strong&gt;——字/秒从 3.5 跌到 1.2，后半段基本在划水。&lt;/p&gt;
&lt;p&gt;GLM-ASR-Nano 更离谱——长音频直接崩溃/编造。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun-ASR-Nano&lt;/strong&gt;：唯一一个长音频不退化、专有名词准确的。11.7 分钟全程 3.5 字/秒稳定输出，&lt;code&gt;CHATGPT.COM&lt;/code&gt; 正确识别。&lt;/p&gt;
&lt;p&gt;但是。Fun-ASR-Nano 的 VAD 模块有 bug。funasr 1.3.1 版本，&lt;code&gt;vad_model=&amp;quot;fsmn-vad&amp;quot;&lt;/code&gt; 直接抛 &lt;code&gt;KeyError: 0&lt;/code&gt;。修了半天——去翻了源码，发现是 VAD 后处理时一个字典 key 不存在，加了个 &lt;code&gt;.get()&lt;/code&gt; 搞定。&lt;/p&gt;
&lt;h3 id=&#34;选定&#34;&gt;选定
&lt;/h3&gt;&lt;p&gt;Fun-ASR-Nano 胜出，部署为生产服务。速度确实比 SenseVoice 慢（98s vs 8s），但质量靠谱。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;指标&lt;/th&gt;
          &lt;th&gt;Qwen3-ASR (迁移前)&lt;/th&gt;
          &lt;th&gt;Fun-ASR-Nano (迁移后)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;11.7min 耗时&lt;/td&gt;
          &lt;td&gt;165.9s&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;98.4s&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;11.7min 文字数&lt;/td&gt;
          &lt;td&gt;841 字&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;2477 字&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;长音频退化&lt;/td&gt;
          &lt;td&gt;⚠️ 字/秒从 3.5→1.2&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;无退化&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;chatgpt.com&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;chatgpt.com&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;CHATGPT.COM&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;参数量&lt;/td&gt;
          &lt;td&gt;1.7B&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;800M&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;显存&lt;/td&gt;
          &lt;td&gt;~3.5GB&lt;/td&gt;
          &lt;td&gt;~4GB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;能用就行，又不是不能用。😝&lt;/p&gt;
&lt;h2 id=&#34;顺便暴露到公网--llm-后处理实验&#34;&gt;顺便：暴露到公网 + LLM 后处理实验
&lt;/h2&gt;&lt;p&gt;既然搞好了，那就暴露出去用。通过 &lt;a class=&#34;link&#34; href=&#34;http://99.suyiiyii.top/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;99.suyiiyii.top&lt;/a&gt; 的 Caddy 反代 + Tailscale 内网穿透，把 8002 端口暴露到了公网：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;公网&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;→&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//asr.99.suyiiyii.top:443 (Caddy TLS+Basic Auth)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;→&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Tailscale&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;→&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;100.67&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;187.87&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8002&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5950&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;WSL2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;加了 Basic Auth，没有认证返回 401。Let&amp;rsquo;s Encrypt 证书 Caddy 自动续，不用管。&lt;/p&gt;
&lt;p&gt;&lt;del&gt;闲着也是闲着&lt;/del&gt;，还试了下用 DeepSeek 给 ASR 结果做后处理。确实能修一些同音错词——&lt;code&gt;淘定律&lt;/code&gt; → &lt;code&gt;韬定律&lt;/code&gt;——但也可能把原文&amp;quot;合理化改写&amp;quot;。最后决定：后处理默认关，保留原文。语义真实性优先。&lt;/p&gt;
&lt;h2 id=&#34;上云stepaudio-25--speaker-diarization&#34;&gt;上云——StepAudio 2.5 + Speaker Diarization
&lt;/h2&gt;&lt;h3 id=&#34;为什么又换&#34;&gt;为什么又换？
&lt;/h3&gt;&lt;p&gt;Fun-ASR-Nano 跑了三周，发现了两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;长音频时间戳覆盖异常&lt;/strong&gt;——超过 30 分钟的音频，时间戳就开始漂移&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;说话人识别不行&lt;/strong&gt;——多人对话场景，speaker 标签基本不可用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;算了笔账：StepAudio 2.5 的 API 费用 ~0.15 元/小时。按每个月转写 20 小时算，一个月 3 块钱。低于心理预算（0.25 元/小时）。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;又不是不能用&amp;rdquo; → &amp;ldquo;那就用更好的&amp;rdquo;。💡&lt;/p&gt;
&lt;h3 id=&#34;asr-8006-架构&#34;&gt;ASR 8006 架构
&lt;/h3&gt;&lt;p&gt;5 月 31 号，部署了新的 8006 服务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主转录&lt;/strong&gt;：StepAudio 2.5 ASR（云端），不做 LLM 改写，不做 ITN&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speaker&lt;/strong&gt;：本地 CAM++ + pyannote ensemble，gate 通过才输出，不稳定就 suppress&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计原则&lt;/strong&gt;：语义真实性 &amp;gt; 经济性 &amp;gt; 说话人识别 &amp;gt; 效率 &amp;gt; 语气保真&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了客观评估，设计了 5 段 benchmark：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;样本&lt;/th&gt;
          &lt;th&gt;时长&lt;/th&gt;
          &lt;th&gt;内容&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bv1zr_chip_full&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;11.3min&lt;/td&gt;
          &lt;td&gt;差评君：为什么汽车需要一块不一样的芯片&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bv1iv_luofuli_first30m&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;30min&lt;/td&gt;
          &lt;td&gt;罗福莉 3.5 小时访谈&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bv1yr_yaoshunyu_first60m&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;60min&lt;/td&gt;
          &lt;td&gt;姚顺宇 4 小时访谈&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tuanshanbeilu_full&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;27.9min&lt;/td&gt;
          &lt;td&gt;团山北路（多人对话）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pause_lab_full&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;16.7min&lt;/td&gt;
          &lt;td&gt;暂停实验室播客&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;以豆包 ASR 输出作为近似基准，用文本相似度做客观对比。&lt;/p&gt;
&lt;h3 id=&#34;benchmark-结果&#34;&gt;Benchmark 结果
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;样本&lt;/th&gt;
          &lt;th&gt;文本相似度 (norm)&lt;/th&gt;
          &lt;th&gt;速度&lt;/th&gt;
          &lt;th&gt;Speaker&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;:&amp;mdash;:&lt;/td&gt;
          &lt;td&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bv1zr_chip_full&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;0.9696&lt;/td&gt;
          &lt;td&gt;9.10x&lt;/td&gt;
          &lt;td&gt;stable / 1 人&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bv1iv_luofuli_first30m&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;0.9260&lt;/td&gt;
          &lt;td&gt;7.32x&lt;/td&gt;
          &lt;td&gt;stable / 2 人&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bv1yr_yaoshunyu_first60m&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;0.9500&lt;/td&gt;
          &lt;td&gt;7.47x&lt;/td&gt;
          &lt;td&gt;stable / 2 人&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tuanshanbeilu_full&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;0.8999&lt;/td&gt;
          &lt;td&gt;9.99x&lt;/td&gt;
          &lt;td&gt;stable / 3 人&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pause_lab_full&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;0.9856&lt;/td&gt;
          &lt;td&gt;8.36x&lt;/td&gt;
          &lt;td&gt;stable / 1 人&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;5/5 speaker gate 通过，全部选了 CAM++。速度 7-10x，远超 2x 目标。文本相似度 0.90-0.99 vs 豆包。&lt;/p&gt;
&lt;p&gt;团山北路的相似度最低（0.8999），因为那是多人自然对话，三家 ASR（豆包、StepAudio、Fun-ASR）的输出风格差异很大——豆包偏书面整理，StepAudio 偏口语保留。不是谁对谁错的问题，是风格不同。&lt;/p&gt;
&lt;p&gt;顺便一提：团山北路的 speaker，豆包给了 8 个人——但实际只有 3 个人在说话。这也是为什么 speaker 不能直接用 ASR 自带的结果，要自己做 diarization。&lt;/p&gt;
&lt;h3 id=&#34;当前架构总览&#34;&gt;当前架构总览
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;┌──────────┐&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;┌──────────────────┐&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;┌─────────────────────┐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;客户端&lt;/span&gt;    &lt;span class=&#34;err&#34;&gt;│────▶│&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Caddy&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;99&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ECS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;   &lt;span class=&#34;err&#34;&gt;│────▶│&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;WSL2&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5950&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;          &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;asr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;99.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;suyiiyii&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;                     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;          &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;443&lt;/span&gt;          &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8006&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;StepAudio&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;主路&lt;/span&gt;  &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;          &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Basic&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Auth&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;TLS&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8002&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Fun&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ASR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;backup&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;└──────────┘&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;└──────────────────┘&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;└─────────────────────┘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                   &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;┌──────────────┴──────────────┐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;StepAudio&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.5&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ASR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;云端&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;•&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;mono&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;规范化&lt;/span&gt;           &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;•&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;min&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;chunk&lt;/span&gt;               &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;•&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;不做&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ITN&lt;/span&gt;                  &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;•&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;费用&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;~&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.15&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;元&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;小时&lt;/span&gt;        &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;├─────────────────────────────┤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Speaker&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Diarization&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;本地&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;   &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;•&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;CAM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;pyannote&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ensemble&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;•&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;speaker&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;gate&lt;/span&gt;              &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;•&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;可选&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;anonymous&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;memory&lt;/span&gt;     &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;err&#34;&gt;└─────────────────────────────┘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;p&gt;半年，一台 RTX 2060 SUPER，7 个模型，无数次崩溃和重启。&lt;/p&gt;
&lt;p&gt;从&amp;quot;搭个 HTTP 服务就完事&amp;quot;到&amp;quot;多模型 pipeline + speaker diarization + benchmark 体系&amp;quot;，中间踩的坑比想象的多得多。&lt;/p&gt;
&lt;p&gt;Windows 跑 GPU 服务是真的折磨——WDDM TDR 一生之敌。但也确实能跑，改改注册表、加个监控，又不是不能用。&lt;/p&gt;
&lt;p&gt;模型方面：纯声学模型快但专有名词差、LLM 骨架模型质量好但慢且长音频不稳定——目前没有一个&amp;quot;全都要&amp;quot;的完美方案。Fun-ASR-Nano 是本地方案里最好的，但离商用 API 还有差距。StepAudio 2.5 云服务性价比不错，0.15 元/小时，一杯奶茶钱转写几十个小时。&lt;/p&gt;
&lt;p&gt;Speaker diarization 这条线才刚开始。CAM++ ensemble + gate 的框架搭好了，benchmark 也过了，但团山北路的 speaker 时间轴还没做人工复核。下一步要把 speaker memory 从匿名 cluster label 升级到真实声纹 embedding。&lt;/p&gt;
&lt;p&gt;总的来说还是一次很爽的折腾。从遇到问题到不断换方案，每一步都学到了东西。现在这套东西跑得挺稳的，以后有新模型出来再接着测。💪&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;相关阅读：&lt;/em&gt;[&lt;em&gt;我的 homelab(5): nerdctl：docker 的升级版 / 镜像拉取缓存和加速&lt;/em&gt;](&lt;a class=&#34;link&#34; href=&#34;https://www.notion.so/p/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.notion.so/p/&lt;/a&gt;我的-homelab5-nerdctldocker-的升级版 - 镜像拉取缓存和加速/)&lt;em&gt;、&lt;/em&gt;[&lt;em&gt;k8s 折腾记：使用 Loki 统一管理集群日志（PLG）&lt;/em&gt;](&lt;a class=&#34;link&#34; href=&#34;https://www.notion.so/p/k8s-&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.notion.so/p/k8s-&lt;/a&gt;折腾记使用-loki-统一管理集群日志 plg/)&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
