[{"content":"写了 19 年代码，也折腾了 15 年创业。\n各种语言和技术都玩过，技术栈一直在变，做的事情倒没怎么变：发现问题，然后想办法解决。 这里就记录这些想法，怎么冒出来，怎么折腾，最后又变成了什么。\nGitHub # github.com/harry0703 136k+ 开源仓库 Stars 21k+ 开源仓库 Forks 3.9k GitHub 关注者 2013 加入 GitHub 开源项目 # MoneyPrinterTurbo 基于 AI 大模型和自动化工作流，从主题或关键词生成文案、配音、字幕和完整短视频\nPython 130k 20.4k MangoDisk 面向 macOS 和 Windows 的磁盘清理与空间分析工具，支持深度清理、重复文件处理和应用卸载\nRust · Tauri 4k 277 FlashVoice 本地优先的 macOS 与 Windows 语音输入工具，支持端侧语音识别、全局输入、文件转写和可选 AI 校对\nVue · Rust 44 12 AudioNotes 结合 FunASR 和本地大模型提取音视频内容，并整理成便于阅读和检索的结构化 Markdown 笔记\nPython 2.5k 370 ","date":"2024-04-20","externalUrl":null,"permalink":"/about/","section":"Harry0703 | 开源软件与 AI 工程实践","summary":"写了 19 年代码，也折腾了 15 年创业。\n各种语言和技术都玩过，技术栈一直在变，做的事情倒没怎么变：发现问题，然后想办法解决。 这里就记录这些想法，怎么冒出来，怎么折腾，最后又变成了什么。\n","title":"关于","type":"page"},{"content":" 开源项目 # MoneyPrinterTurbo 用 AI 工作流把一个主题转成完整短视频\nPython 130k 20.4k MangoDisk 安全、透明的跨平台磁盘清理与空间分析工具\nRust · Tauri 4k 277 AudioNotes 把音视频内容整理成结构化 Markdown 笔记\nPython 2.5k 370 ","date":"2026-10-12","externalUrl":null,"permalink":"/","section":"Harry0703 | 开源软件与 AI 工程实践","summary":"开源项目 # MoneyPrinterTurbo 用 AI 工作流把一个主题转成完整短视频\n","title":"Harry0703 | 开源软件与 AI 工程实践","type":"page"},{"content":"","date":"2026-10-12","externalUrl":null,"permalink":"/tags/mangodisk/","section":"标签","summary":"","title":"MangoDisk","type":"tags"},{"content":"","date":"2026-10-12","externalUrl":null,"permalink":"/tags/","section":"标签","summary":"","title":"标签","type":"tags"},{"content":"","date":"2026-10-12","externalUrl":null,"permalink":"/tags/%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4%E5%88%86%E6%9E%90/","section":"标签","summary":"","title":"磁盘空间分析","type":"tags"},{"content":"","date":"2026-10-12","externalUrl":null,"permalink":"/categories/","section":"分类","summary":"","title":"分类","type":"categories"},{"content":"","date":"2026-10-12","externalUrl":null,"permalink":"/tags/%E7%9F%A9%E5%BD%A2%E6%A0%91%E5%9B%BE/","section":"标签","summary":"","title":"矩形树图","type":"tags"},{"content":"","date":"2026-10-12","externalUrl":null,"permalink":"/categories/%E5%BC%80%E5%8F%91%E9%9A%8F%E8%AE%B0/","section":"分类","summary":"","title":"开发随记","type":"categories"},{"content":"","date":"2026-10-12","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96/","section":"标签","summary":"","title":"数据可视化","type":"tags"},{"content":"","date":"2026-10-12","externalUrl":null,"permalink":"/post/","section":"文章","summary":"","title":"文章","type":"post"},{"content":"","date":"2026-10-12","externalUrl":null,"permalink":"/tags/%E6%97%AD%E6%97%A5%E5%9B%BE/","section":"标签","summary":"","title":"旭日图","type":"tags"},{"content":"以前查看文件夹的空间占用，我习惯先按大小排序，再往里面一层层找。哪个目录大，就点进去看看。\n开发 MangoDisk 的磁盘空间分析时，我第一次认真用上了旭日图（Sunburst）。把目录数据画出来以后，才发现有些信息，列表里虽然也有，却没那么容易看出来。\n大小之外，还有层级 # 拿截图里的缓存目录来说，总共占了 16.4 GB。列表很清楚：ms-playwright 占 4.41 GB，JetBrains 占 2.55 GB，Google 占 1.63 GB。\n如果只想找占用最大的目录，看到这里就够了。\n但我还想知道，这些空间主要集中在它们下面的哪里。用列表看，需要进入目录，看完再返回，然后进入另一个目录。几个目录来回比较，很容易忘记刚才看到的结构。\n旭日图把这些层级放在了同一张图上。中心是当前目录，往外一圈圈展开，每个扇区对应一条分支。\n比如 Google 下面的 Chrome → Default → Cache → Cache_Data，在图里可以直接顺着看出去。这条分支的空间集中在哪里，中间经过了哪些目录，不用反复点进去才能知道。\n我觉得它最有用的地方，就是能同时看见几层目录之间的关系。\n矩形树图也很顺手，但看的感觉不同 # 同一份数据换成矩形树图（Treemap），大目录变成大块，小目录变成小块。扫一眼，哪里占得多很醒目。\n只显示一层时，画面很清楚；展开多层后，又能看到大块里面是怎么分的。像 ms-playwright，总占用虽然最大，内部其实分散在多个浏览器目录里。\n两种图看起来都在展示大小，用起来却各有顺手的地方。\n想先找空间大户，我会看矩形树图。想顺着某个目录理解下面几层的结构，旭日图更容易让我跟上。\n旭日图有点像把原本需要逐层打开的目录，提前摊在了眼前。\n展示得多，不一定看得清 # 做的时候也发现，层级不能一味加深。\n旭日图越往外，小扇区越多，名称放不下；矩形树图也是，展开太深以后，画面被切得很碎。数据都在，却不一定读得明白。\n所以最后还是保留了深度选择和文件列表。图上看到一块值得关注的地方，再去列表里确认名称、大小和路径，比硬把所有文字塞进图里舒服。\n这次开发让我对旭日图有了一个很具体的认识。以前只是知道有这种图，现在遇到“一个大目录，下面还有很多层，想看看占用究竟集中在哪”的问题，会自然想到它。\n","date":"2026-10-12","externalUrl":null,"permalink":"/post/disk-space-sunburst/","section":"文章","summary":"以前查看文件夹占用，习惯按大小排序，再一层层点进去。开发 MangoDisk 时用上旭日图，才发现几层目录的关系可以一起看，不必反复进入和返回。","title":"做磁盘空间分析时，我才用明白了旭日图","type":"post"},{"content":"","date":"2026-10-03","externalUrl":null,"permalink":"/tags/ai/","section":"标签","summary":"","title":"AI","type":"tags"},{"content":"","date":"2026-10-03","externalUrl":null,"permalink":"/tags/ai-agent/","section":"标签","summary":"","title":"AI Agent","type":"tags"},{"content":" 做 MangoDisk 时，我最近有点犯嘀咕。\n这是一个开源免费的磁盘清理工具，可以分析空间占用、找大文件、清理缓存。但如果用户打开 AI Agent，说一句“帮我清一下硬盘”，这些事情就能完成，我还做它干什么？\n如果我是用户，能少装一个软件，当然更好。\n所以这个问题没法靠“专业工具不会被替代”来安慰自己。有些功能，确实可能很快就不值得单独做了。\n只把命令做成按钮，可能不够了 # 列出最大的文件，统计目录占用，找几个常见缓存，原本就有命令可以完成。过去用户不会用，现在 Agent 可以代劳。只把这些命令做成按钮，恐怕越来越难吸引人。\n不过，最近看到万兴科技的半年报，有个数字让我停了一下：2026 年上半年，视频创意类收入下降了 9.78%，实用工具类却增长了 10.45%。后者主要做数据恢复、文件修复、手机迁移这些事情。来源：万兴科技 2026 年半年报\n这当然证明不了“清理工具不怕 AI”。一家公司的半年收入，影响因素太多了。\n但它提醒了我一件事：照片误删了，手机数据搬不过去，文件打不开了，用户还是需要把问题解决。AI 可以帮忙找办法，也可以调用程序去处理，最后总得有人把文件恢复出来，把数据完整搬过去。\n找到了，敢不敢删？ # 磁盘清理也有类似的地方，只是没有数据恢复那么迫切。\n看到一个 30 GB 的目录，很容易想删。点下去之前，又会犹豫：这是缓存，还是应用的数据？删了能重新生成吗？要重新下载多久？\n重复文件也是。两份内容一样，一份在项目目录，一份在备份盘，用户可能就是想留两份。\n这些事情，AI 也能判断，也能检查。我并不觉得它永远做不好。只是要处理得稳妥，仍然需要了解应用、适配系统、检查文件状态，还要跟着版本变化继续维护。\n如果 MangoDisk 能把这些麻烦处理好，我觉得它还有用。\n用户不一定要打开 MangoDisk # 至于用户从哪里开始清理，我倒没那么执着。\n以后可能就是一句：\n帮我腾点空间，别动照片和工作项目。\nAgent 扫描完，给出候选项，用户看一眼再确认。这个过程中，它可以调用 MangoDisk，用户甚至不用打开主界面。\n这样也挺好。我自己做这个工具，最初就是想少查几个陌生目录，弄清楚空间去了哪里。能把这个问题解决，入口在哪里没那么重要。\n当然，接上 CLI 或 MCP，也不会突然多出一条护城河。Agent 能调用 MangoDisk，也能调用别人的工具，系统还可能直接提供这些功能。\n我还是得把扫描做快，把文件认准，把清理前后的情况交代清楚。一个不熟悉的目录，用户看完以后能知道它是什么、删了有什么影响，才有理由继续用。\n所以 MangoDisk 我还想继续做。\n只是以后加功能时，得多想一步：这个功能是让界面又多了一个按钮，还是确实替用户省掉了一件麻烦事？\n","date":"2026-10-03","externalUrl":null,"permalink":"/post/mangodisk-ai-agent/","section":"文章","summary":"如果一句话就能让 AI 清理硬盘，用户还需要安装 MangoDisk 吗？有些功能确实会被替代，但找到文件以后，敢不敢删，仍然是个问题。","title":"AI 都能清理电脑了，我还做 MangoDisk 干什么？","type":"post"},{"content":"","date":"2026-10-03","externalUrl":null,"permalink":"/categories/%E4%BA%A7%E5%93%81%E6%80%9D%E8%80%83/","section":"分类","summary":"","title":"产品思考","type":"categories"},{"content":"","date":"2026-10-03","externalUrl":null,"permalink":"/tags/%E7%A3%81%E7%9B%98%E6%B8%85%E7%90%86/","section":"标签","summary":"","title":"磁盘清理","type":"tags"},{"content":"","date":"2026-10-03","externalUrl":null,"permalink":"/tags/%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91/","section":"标签","summary":"","title":"独立开发","type":"tags"},{"content":" 这两年，最容易产生的错觉是：以前做不出来的东西，现在能做了，钱应该也就好赚了。\n真做起来才发现，产品上线了，没人用。有人用了，不愿付费。好不容易有人付费，还得算获客和维护成本。\n代码确实便宜了，客户一点没便宜。\n大家都会了，你靠什么收费？ # 以前你会写代码、做设计，客户不会，这个差距能养活一批人。\n现在客户会先问 AI，同行也能用 AI 做。你还在按原来的工作量报价，别人已经愿意用更低的价格接单。\n你觉得自己效率提高了，客户觉得这活不值那么多钱了。\n如果交付的东西看不出区别，省下来的时间很容易变成降价的空间。最后可能做得更多，赚得更少。\n最容易做的，往往最难卖 # 接个模型，做个界面，上线一个网站。这套流程越来越熟练，做什么却越来越犹豫。\n摘要、翻译、图片生成，每个方向都有需求，也都有免费工具。用户已经有办法解决问题，凭什么再来试你的？\n这个问题很难回答。于是继续加功能，改界面，换模型。忙了一个月，依然不知道第一个付费用户在哪里。\n写代码至少每天都能看到进展。找客户就没这么舒服了：消息可能没人回，演示做完可能没有下文，还可能发现自己忙了很久的功能，对方根本不在乎。\n用户不负责欣赏你的技术 # 做 AI 产品，演示时最让人兴奋的，未必是使用时最有价值的。\n一键生成视频很漂亮，但发出去有没有人看？会议纪要几秒钟就出来了，但关键数字还得逐条核对？\n用户试用时会说“厉害”，付费时会算“划不划算”。\n如果每次生成以后还要检查、返工，第一次的新鲜感过去，也就不想打开了。\n有客户的人，更容易接住这波机会 # 已经有客户的人，可以尝试用 AI 缩短交付时间。熟悉某个行业的人，知道哪些问题让客户头疼，也更容易判断 AI 能帮上什么忙。\n难的是原本没有客户，也不熟悉具体需求，只因为 AI 热，就想进来找个机会。\n逛了一圈，学会了很多工具，买了很多订阅。自己的收入还没着落，每个月的工具账单倒是先固定下来了。\n我不觉得现在不值得做产品。只是越来越觉得，动手之前，应该先找到几个真的被问题困住的人，问清楚他们现在怎么解决、付出了什么，再试着收一次钱。\n否则，AI 只是让我们更快地做出了一个没人需要的东西。\n","date":"2026-09-16","externalUrl":null,"permalink":"/post/ai-opportunities-and-customers/","section":"文章","summary":"代码确实便宜了，客户一点没便宜。AI 让更多人能做出产品，却没有解决谁会来用、为什么付费的问题。","title":"AI 到处都是机会，但未必有你的机会","type":"post"},{"content":"","date":"2026-09-16","externalUrl":null,"permalink":"/tags/%E4%BA%A7%E5%93%81/","section":"标签","summary":"","title":"产品","type":"tags"},{"content":"","date":"2026-09-16","externalUrl":null,"permalink":"/tags/%E5%88%9B%E4%B8%9A/","section":"标签","summary":"","title":"创业","type":"tags"},{"content":"","date":"2026-09-14","externalUrl":null,"permalink":"/tags/ssh/","section":"标签","summary":"","title":"SSH","type":"tags"},{"content":"","date":"2026-09-14","externalUrl":null,"permalink":"/tags/windows/","section":"标签","summary":"","title":"Windows","type":"tags"},{"content":" 以前提到 SSH，我首先想到的是 Linux 服务器。轮到 Windows，习惯上还是打开远程桌面。\n最近开发 MangoDisk 的 Windows 功能，给测试电脑开启 SSH 后，才发现早该这么做。\n我的主力电脑是 Mac。代码改完，需要到 Windows 上构建、测试。以前往往得先连远程桌面，找到项目目录，打开终端，粘贴命令。遇到错误，再把日志复制回 Mac，继续排查。\n偶尔做一次没什么，连续调试几轮，就会觉得自己一直在两边搬东西。\n在 Mac 的终端里，把 Windows 的事情办了 # Windows 本身就提供 OpenSSH Server。安装并配置好服务、网络和账号后，就可以像连接其他远程电脑一样登录：\n1 ssh your-user@192.168.1.100 把用户名和地址换成自己的 Windows 账号、电脑地址即可。经常使用的话，再配好密钥和连接别名，会更省事。\n连上以后，命令在 Windows 上执行，输出直接显示在 Mac 的终端里。构建进行到哪里、哪个测试失败，都不用再切过去找窗口。\n最舒服的是，调试的思路不用跟着桌面来回切换。 看到错误，就在当前电脑上查看代码；改完，再执行一次远程检查。\n同步、构建、取日志，可以连着做 # 我们把常用的 Windows 构建和测试步骤整理成了 PowerShell 脚本。SSH 连接成功后，明确调用 PowerShell 执行这些脚本，就不必每次重新输入工作目录和一长串命令。\n代码和测试文件可以通过 SSH 配套的文件传输工具送过去，构建完成后运行检查，结束后再取回日志。同步时排除依赖和构建产物，也省得每次传一堆无关文件。\n比如调试 MangoDisk 的资源监控时，我们需要反复部署版本、观察采样记录。以前要到 Windows 上操作，再找到结果文件；现在从 Mac 发起测试，结束后直接读取日志，就能接着分析。\n需要再跑一次时，重新执行同一个脚本就行。这种方便在第一次连接时还不明显，连续改了几轮之后，感受就很直接了。\n如果平时使用 AI Agent 辅助测试，也可以让它通过这个入口执行检查、收集日志，省去人手动转发命令和结果。\n需要看界面时，再打开远程桌面 # SSH 并没有让我们彻底不用远程桌面。检查窗口、任务栏和实际交互时，还是会打开它。但只是构建、运行测试、查看进程或读取日志，就没必要进入桌面了。\n还有一点要注意：从 SSH 启动 GUI 程序，不一定会出现在当前登录的桌面。我们需要测试界面时，会通过交互式计划任务启动应用，或直接在远程桌面里操作。\n这次用下来，SSH 给我们省掉的主要是那些零碎、重复的动作。Windows 还是那台 Windows，构建和测试也还是原来的命令，只是从 Mac 上执行它们顺手了很多。\n如果你也经常在 Mac 或 Linux 上开发、到 Windows 上验证，可以先把 SSH 开起来，试着远程跑一次平时最常用的构建命令。以后只是想看一眼构建结果，就不用再打开整个远程桌面了。\n","date":"2026-09-14","externalUrl":null,"permalink":"/post/windows-ssh-remote-testing/","section":"文章","summary":"以前测一次 Windows，要打开远程桌面、找终端、运行命令，再把日志复制回来。给测试电脑开启 SSH 后，这些事情在 Mac 的终端里就能完成。","title":"给 Windows 开启 SSH，开发和测试方便多了","type":"post"},{"content":"","date":"2026-09-14","externalUrl":null,"permalink":"/categories/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/","section":"分类","summary":"","title":"工程实践","type":"categories"},{"content":"","date":"2026-09-14","externalUrl":null,"permalink":"/tags/%E8%B7%A8%E5%B9%B3%E5%8F%B0%E5%BC%80%E5%8F%91/","section":"标签","summary":"","title":"跨平台开发","type":"tags"},{"content":"","date":"2026-09-14","externalUrl":null,"permalink":"/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/","section":"标签","summary":"","title":"自动化测试","type":"tags"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/categories/ai-%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/","section":"分类","summary":"","title":"AI 工程实践","type":"categories"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/tags/funasr/","section":"标签","summary":"","title":"FunASR","type":"tags"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/tags/mai-transcribe-2/","section":"标签","summary":"","title":"MAI-Transcribe-2","type":"tags"},{"content":"微软发布 MAI-Transcribe-2 后，我们最想知道的是：这个新语音识别模型，值不值得替换产品里已经在用的 ASR？\n团队拿了 127 条音频，约 14.4 小时，覆盖中、英、日、韩、西、葡六种语言，把 microsoft/mai-transcribe-2 与豆包，以及不同测试组中的 Whisper、FunASR 做了一轮对比。\n我们的判断是：英语、日语值得优先试，中文没有充分理由只凭平均分就换，做字幕更不能只看识别准确率。\nMAI-Transcribe-2 的吸引力在哪里 # 2026 年 9 月 3 日，微软发布了 MAI-Transcribe-2，提供词级时间戳、说话人区分等能力。官方发布优惠价为每小时音频 0.10 美元，持续到 2026 年底。\n图源：微软官方发布文章。上图为官方基准成绩，与下文团队测试的数据集和评分口径不同，数值不能直接比较。\n对做音视频产品的团队来说，价格值得关注，词级时间戳也可能减少后续字幕处理的工作。但这些能力有没有用，得把自己的音频送进去才知道。\n这次样本包括日常视频、演讲和中文短剧。中文组测试 MAI、豆包和 FunASR，另外两组测试 MAI、豆包和 Whisper，没有将四套系统放在所有样本上统一排名。\n统计说明：下文平均词错误率（WER，越低越好）采用剔除 WER 超过 80% 样本后的结果，只反映本次样本与配置下的表现，不包含完整的失败情况。\n对比 Whisper、豆包：先看你做哪种语言 # 英语、日语、韩语这组的平均 WER 如下：\n系统 平均 WER MAI-Transcribe-2 11.97% Whisper 14.53% 豆包 14.65% MAI 的平均值更低，但拆到各语言，优势并不一致。英语、日语是 MAI 领先；韩语则是 Whisper 略低，两者只差 0.11 个百分点。\n我们不会因为这 0.11 个百分点就换一个接口。这个差距是否有实际意义，得看具体错了什么，以及换一批音频后是否还能保持。\n在西班牙语、葡萄牙语这一组，Whisper 的平均错误率更低。如果主要处理这两种语言，本次测试没有给出放弃 Whisper 的理由。\n多语言产品的选型，应该先按语言拆开。一个三种语言的平均分，不能替另外三种语言做决定。\n中文短剧：平均分第一，不等于每段都更准 # 17 条中文短剧音频中，MAI 的平均 WER 是 22.43%，豆包是 23.54%，FunASR 是 32.74%。\nMAI 领先豆包 1.11 个百分点，但豆包的中位数更低。两个指标给出了不同的排序。\n这并不矛盾：某个系统在分布中间位置的误差更低，仍可能因为少数高误差样本而被拉高平均值。换到产品里，最需要关心的是这些差异落在哪些输入上。\n如果优势来自我们经常处理的复杂对白，那值得换；如果优势只出现在很少遇到的片段上，日常输入并没有改善，就未必值得付出迁移成本。\nFunASR 在这组测试中落后较多，但这只能评价本次使用的模型和配置。中文短剧也不能代表会议、口述或所有中文语音识别需求。\n我们更倾向于拿这组结果筛选方案，而不是据此宣布中文 ASR 的胜负。\n做字幕，识别准确率还不够 # Whisper 在西语、葡语这组的错误率最低，但输出的长句比例也更高。这对转写文稿未必是问题，对字幕却可能意味着额外的断句工作。\n文字都对，一整段挤在屏幕上，用户照样要改。句子切得短，时间戳对不上声音，也一样不能直接用。\nMAI 的词级时间戳因此很值得关注：它给字幕对齐和编辑提供了更细的输入。但接口能返回时间戳，和时间戳准确到足以交付，是两件需要分别验证的事。本次测试还没有完成这部分体验评估。\n我们认为，字幕产品更应该比较“拿到结果后还要改多久”。\n这个时间包含改错字、重新断句、调整时间轴。只优化词错误率，可能把识别阶段省下的工作，挪到了字幕编辑阶段。\n真正贵的，是整段重做 # 平均值还有一个容易掩盖的问题：严重失败。\n这次统计排除了 WER 超过 80% 的样本，因此不能用上面的均值判断哪套系统最稳定。如果只是模型识别得太差，这些样本就应该计入产品评估；只有确认数据或标注有问题，才有理由修正或统一排除。\n批量处理时，一处错字和整段漏识别的代价差很多。前者可能改几个字就结束，后者要重跑任务，再检查后续字幕。各系统如果剔除了不同样本，单看剔除后的平均分还会让比较失去共同基础。\n每小时 0.10 美元的接口价格很吸引人，但它不包含这些返工成本。我们尚未实测完整费用，不能把官方单价直接换算成产品能节省的成本。\nMAI-Transcribe-2 值得换吗？ # 对于英语、日语转写，我们会把它放进优先试用名单；对于已经用豆包处理中文的产品，1.11 个百分点的平均差距还不足以支持全面迁移；西语、葡语则仍有继续使用 Whisper 的依据。以上判断都限于这轮测试。\n至于自动字幕，谁能减少断句、对齐和重做的时间，谁才更值得接入。\n我们愿意为更少的人工修改换模型，不愿意只为一张更好看的成绩表换接口。 如果最终还是同一批字幕需要返工，用户不会关心后端的模型名字更新了没有。\n","date":"2026-09-11","externalUrl":null,"permalink":"/post/mai-transcribe-2-asr-review/","section":"文章","summary":"测了 127 条、约 14.4 小时音频，MAI-Transcribe-2 在本次英语、日语测试中更有吸引力，但中文和字幕场景的选择没那么简单。比平均错误率更值得关心的，是识别结果还要改多少。","title":"MAI-Transcribe-2 实测：能替代 Whisper 和豆包吗？","type":"post"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/tags/whisper/","section":"标签","summary":"","title":"Whisper","type":"tags"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/tags/%E8%B1%86%E5%8C%85/","section":"标签","summary":"","title":"豆包","type":"tags"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/tags/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/","section":"标签","summary":"","title":"语音识别","type":"tags"},{"content":"","date":"2026-09-07","externalUrl":null,"permalink":"/tags/codex/","section":"标签","summary":"","title":"Codex","type":"tags"},{"content":"","date":"2026-09-07","externalUrl":null,"permalink":"/categories/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/","section":"分类","summary":"","title":"开源项目","type":"categories"},{"content":"","date":"2026-09-07","externalUrl":null,"permalink":"/tags/%E6%95%88%E7%8E%87%E5%B7%A5%E5%85%B7/","section":"标签","summary":"","title":"效率工具","type":"tags"},{"content":"我知道开发工具吃硬盘。项目依赖、编译产物、本地模型，哪个都不小。\n但用自己做的 MangoDisk 扫了一遍电脑，还是被一个项目吓到了：\n较早的 Codex 崩溃报告：9.08 GB。\n每天用 Codex 写代码，没想到它留下的崩溃报告，也能攒出这个体量。\n代码还没写多大，崩溃报告先攒了 9 GB # 9 GB 的模型，我知道自己下载过；9 GB 的视频，我知道自己保存过。\n9 GB 的崩溃报告？看到扫描结果之前，我根本没想过要去找它。\n这才是“硬盘空间刺客”最烦的地方：你没主动存什么东西，可用空间却一直在减少。真要清理时，第一反应还是翻下载文件夹，删几个安装包。\n截图里，整个“应用缓存”分类是 10.1 GB，光这一项就占了大约九成。旁边 741 MB 的 Google 更新器缓存，突然显得很克制。\n这里说的是我这台电脑上扫描到的旧崩溃报告，不代表每个 Codex 用户都会遇到，也不能凭文件大小判断它到底崩溃了多少次。\n但这个占用，确实值得应用自己管一管。\n日志有用，也得有个限度 # 出了问题，开发者要日志，这很合理。\n可诊断文件保留多久、累计多大、什么时候轮转清理，也应该是软件需要处理的事情。不能功能交付了，留下来的文件全靠用户自己发现。\n用户愿意把空间留给项目，不等于愿意把空间长期留给过去的故障。\n尤其是开发工具。一个工具多留一点缓存，另一个多留一点构建产物，用到最后，电脑里装的仿佛不是软件，而是它们的历史遗迹。\n这也是我做 MangoDisk 的理由 # 这次扫描让我觉得，清理工具最有用的一刻，就是把这种意料之外的占用摆到眼前：哪个应用、什么文件、多大。\n截图里的 MangoDisk 已经把旧崩溃报告单独列了出来，旁边可以展开查看，AI 解读也给出了用途和清理前的提醒。至少不用先搜一圈“Codex 的缓存藏在哪”，再对着一个陌生目录犹豫。\n当然，扫描结果不等于已经释放的空间。截图顶部的 150 GB 是整次扫描的估算，也不是 Codex 一家的占用。这张图记录的是清理前的发现。\n真要处理，仍然应该先确认具体文件；如果还需要排查崩溃，就保留相关报告，并按提示退出应用后再操作。AI 解读可以辅助判断，不能当成随便删整个目录的依据。\nMangoDisk 是我开源的磁盘清理工具，源码在 GitHub。这张截图就是它在我自己电脑上扫出来的。\n下次空间告急，我会先看看这些应用留下了什么。下载文件夹已经替它们背了太多次锅。\n","date":"2026-09-07","externalUrl":null,"permalink":"/post/codex-crash-reports-disk-space/","section":"文章","summary":"不扫不知道，一扫吓一跳：较早的 Codex 崩溃报告，竟然占了 9.08 GB。硬盘里最让人意外的大户，往往不在下载文件夹里。","title":"硬盘空间刺客：Codex 的崩溃报告竟然占了 9 GB","type":"post"},{"content":"","date":"2026-09-04","externalUrl":null,"permalink":"/tags/ai-%E8%A7%86%E9%A2%91/","section":"标签","summary":"","title":"AI 视频","type":"tags"},{"content":"","date":"2026-09-04","externalUrl":null,"permalink":"/tags/moneyprinterturbo/","section":"标签","summary":"","title":"MoneyPrinterTurbo","type":"tags"},{"content":" 截至 2026 年 9 月，MoneyPrinterTurbo 在 GitHub 上获得了超过 12 万 Star 和 1.84 万 Fork。\n这两个数字只能说明项目被大量关注和复制，不能证明生成的视频足够好，更不能证明它已经解决了 AI 视频生产的问题。\n真正值得分析的是：为什么这么多人愿意点进来，并且认为这套代码值得保留和修改？\n项目地址：https://github.com/harry0703/MoneyPrinterTurbo\n它没有创造新模型，但跑通了一条工作流 # MoneyPrinterTurbo 没有训练视频模型，也没有提出新的生成算法。\n它做的事情并不神秘：生成文案、搜索素材、合成语音、制作字幕，最后把这些内容组合成视频。\n这些能力在项目出现之前就已经存在。问题在于，它们分散在不同的工具和服务中。用户要自己选择模型、转换数据、处理字幕时间，再调用视频工具完成合成。每一步都不算难，连起来却足以挡住大多数人。\nMoneyPrinterTurbo 把这堆零件收进了一条可以运行的流程：\n输入一个主题，得到一条视频。\n它降低的不是某项技术的计算成本，而是用户组织整套流程的成本。\n开发者很容易沉迷于模型、框架和参数，用户只关心最后有没有东西交付。技术是零件，跑通任务才是产品。\n1.84 万 Fork 比 12 万 Star 更值得看 # Star 很轻，看到感兴趣的项目，顺手就可以点一下。Fork 通常多了一层意图：准备部署、修改，或者把它接进自己的系统。\nMoneyPrinterTurbo 的用户会更换大模型和语音服务，接入自己的素材源，修改提示词、视频尺寸和合成规则。还有人把它改造成批量生产服务，放进自己的内容业务里。\n封闭产品只给用户一个输入框和最终结果。开源之后，文案、素材、配音、字幕和合成中的任何一环都可以替换。\n所以，1.84 万 Fork 所反映的需求，不只是“一键生成视频”，还有一套能够自己控制的内容生产流程。\n它解决了生产，没有解决内容 # MoneyPrinterTurbo 可以生成视频，却回答不了一个更难的问题：\n为什么有人愿意把这条视频看完？\n关键词搜索可以找到相关素材，却不理解叙事。语音模型可以读出文案，却未必懂得情绪。程序可以对齐画面、配音和字幕，却不会自然产生节奏、审美和观点。\n最后得到的视频可能结构完整，也可能毫无记忆点。\n说得直接一点，自动化可以更快地生产内容，也可以更快地制造平庸。如果选题没有价值，文案没有观点，生成速度越快，只会得到更多没人愿意看的视频。\nMoneyPrinterTurbo 把视频制作从“不会做”降低到了“能做”，但从“能做”到“做好”，仍然需要人的判断。\n素材拼接的上限很明确 # MoneyPrinterTurbo 本质上仍然是一套素材组织和视频合成流程。这一点没有必要回避。\n它适合快速验证选题、制作基础内容，也确实能省掉大量重复操作。但仅靠关键词搜索素材，很难解决人物一致性、镜头连续性和视觉表达。\n把它说成可以替代编导、剪辑和内容创作者，是夸大工具的能力；只把它看成简单的素材拼接，又忽略了完整工作流节省的时间。\n更准确的定位是：\n它处理视频生产中的重复劳动，但不替用户决定什么值得表达。\n下一步不该只是接入更多模型 # 如果后续只是不断增加模型供应商、语音服务和配置项，功能清单会越来越长，生成结果却未必更好。这类接入也很容易被其他项目复制。\n更难、也更值得继续做的部分，是内容生产过程本身：\n从理解文案到生成可编辑的分镜，而不只是提取几个关键词； 让人物、场景和视觉风格在多个镜头中保持一致； 保留中间结果，让人可以介入，而不是只能接受最终成片； 根据发布后的真实反馈，调整下一次选题和内容结构。 12 万 Star 说明这类需求足够大，但没有替 MoneyPrinterTurbo 回答这些问题。\n它现在是一套有效的视频自动化工具。能不能继续往前走，取决于它能否跨过素材拼接的边界，开始理解内容，而不只是组装内容。\n","date":"2026-09-04","externalUrl":null,"permalink":"/post/moneyprinterturbo-120k-stars/","section":"文章","summary":"12 万 Star 和 1.84 万 Fork 说明了什么？复盘 MoneyPrinterTurbo 被大量关注的原因，以及自动化视频生产仍未解决的问题。","title":"从 0 到 12 万 Star：MoneyPrinterTurbo 做对了什么，又没解决什么","type":"post"},{"content":"","date":"2026-09-04","externalUrl":null,"permalink":"/tags/%E5%BC%80%E6%BA%90/","section":"标签","summary":"","title":"开源","type":"tags"},{"content":"","date":"2026-09-04","externalUrl":null,"permalink":"/tags/%E5%86%85%E5%AE%B9%E8%87%AA%E5%8A%A8%E5%8C%96/","section":"标签","summary":"","title":"内容自动化","type":"tags"},{"content":" 最近几年，我经常遇到一个很熟悉的提醒：磁盘空间不足。\n刚换电脑时，总觉得几百 GB 已经足够。可随开发工具越来越多，项目越做越多，再加上本地运行的 AI 模型，剩余空间还是会一点点变少。\n真正开始清理时，却很难说清这些空间到底去了哪里。\n空间不是突然消失的 # 有时是一个很久没有打开的视频，有时是重复下载的安装包，有时是已经结束的项目留下了几 GB 构建文件。浏览器、开发工具和各种应用也在持续产生缓存，但它们分散在系统的不同位置，平时几乎感觉不到。\n这些东西单独看都不算大，积累起来却很可观。\n我试过手动查找，也写过一些清理脚本。它们偶尔很有效，但用久了就会遇到另一个问题：我不确定删掉的到底是什么。\n脚本中的路径可能已经过时，网上找到的命令也未必适合自己的电脑。面对一个几十 GB 的目录，最难做的不是按下删除键，而是判断里面有没有仍然重要的内容。\n我想要的工具并不复杂 # 我找过不少磁盘清理软件。有些功能很多，但每次打开都会推荐各种不需要的服务；有些直接告诉我可以释放几十 GB，却没有把这些文件解释清楚；还有一些需要登录账号，或者把简单的清理功能放进订阅中。\n我真正需要的其实很简单：\n告诉我空间主要用在了哪里； 把可能不再需要的内容整理出来； 在删除之前，让我能看清位置、大小和风险； 不上传文件，也不要求注册账号。 既然一直没有找到完全符合自己习惯的工具，我就开始做 MangoDisk。\n把杂乱的磁盘重新看清楚 # MangoDisk 最早只是用来处理我自己的开发缓存，后来逐渐加入了大文件查找、重复文件清理、应用卸载和磁盘空间分析。\n现在，我会先用空间分析看看哪些目录占用最多，再检查大文件和已经不用的项目。如果某个应用准备卸载，也可以顺便确认它留下了哪些缓存和数据，不需要再去网上查每一个目录的位置。\n对开发者来说，MangoDisk 也能找到常见的项目构建产物和工具缓存。node_modules、Rust 的 target、IDE 索引以及包管理器缓存，往往就是磁盘空间缓慢减少的原因。\n但 MangoDisk 不会扫描结束后直接替你删除。它会先把内容分类，显示大小、位置和风险，再由你决定哪些应该保留。智能推荐可以减少逐项判断的时间，但最终的选择仍然属于用户。\n有些大文件，本来就不应该被随便清理 # 做这个工具以后，我越来越觉得，磁盘清理并不是“删得越多越好”。\n比如本地 AI 模型经常占用几十 GB，但重新下载同样需要大量时间和流量。照片、代码、文档和云同步文件更不用说，它们不能仅仅因为体积大，就被当作垃圾。\n所以 MangoDisk 对这些内容会更保守。普通清理不会把个人文件或用户管理的模型当成缓存；遇到可能影响使用的数据，也会把风险和位置展示出来，而不是默认选中。\n我希望它给人的感觉不是“帮我做决定”，而是“帮我把决定需要的信息整理好”。这也是我自己愿意长期使用它的前提。\n为什么把它开源 # 清理工具需要读取很多文件信息，也拥有删除文件的能力。与其只告诉用户“可以放心使用”，我更希望大家能够直接看到它扫描了什么、如何判断，以及一次清理最终会做什么。\n因此，我决定将 MangoDisk 以 GPLv3 许可证开源。它支持 macOS 和 Windows，扫描与清理都在本地完成，不需要登录，也不会上传文件或扫描结果。\n开源也意味着，一个人不熟悉的软件和系统，可以由真正使用它的人补充。不同开发工具、不同版本的缓存位置，都可以通过社区一起完善。\n写在最后 # MangoDisk 不是一个追求“每次都清出几十 GB”的工具。有时候扫描以后，会发现真正适合清理的内容并没有想象中那么多，我觉得这反而是正常的。\n它更像是我为自己做的一次磁盘整理：先看清空间去了哪里，再决定什么可以离开。\n目前 MangoDisk 已经可以在 macOS 和 Windows 上使用。如果你也经常被磁盘空间不足困扰，可以前往 MangoDisk 官网 下载体验，也可以在 GitHub 查看源码和参与改进。\n","date":"2026-08-05","externalUrl":null,"permalink":"/post/mangodisk/","section":"文章","summary":"电脑空间总在不知不觉中变少。因为一直没有找到足够简单、透明的解决办法，我做了 MangoDisk，并决定把它开源。","title":"电脑空间去哪了？我开源了 MangoDisk","type":"post"},{"content":"","date":"2024-08-03","externalUrl":null,"permalink":"/tags/cosyvoice/","section":"标签","summary":"","title":"CosyVoice","type":"tags"},{"content":"","date":"2024-08-03","externalUrl":null,"permalink":"/tags/docker/","section":"标签","summary":"","title":"Docker","type":"tags"},{"content":"应该是 开源界 音色 最稳定 的语音合成和克隆模型了，支持预训练音色合成、自然语言控制、3秒极速复刻和跨语种复刻。\n官方部署方式比较复杂，错误较多，我这里进行了整理和优化，支持GPU和CPU，方便大家使用。\nCosyVoice 开源仓库: CosyVoice\n效果展示 # 自然语言控制 # 3秒极速复刻 # 使用方法 # 均支持 GPU 和 CPU\n第一次启动过程可能会有点长，需要从魔搭下载3个模型\nWindows 一键启动包 # 百度网盘: https://pan.baidu.com/s/1UTuRKPQ9nuQk69qxQzdL4A?pwd=j2ei 提取码: j2ei\n下载后使用 7z 解压。没有 7z 的话，可以在这里下载：https://7-zip.org/download.html 双击 双击启动.bat 启动服务 启动后，访问 http://127.0.0.1:50000/ 注意：文件夹中不能有 中文、特殊字符和空格，否则可能会启动失败\nDocker部署🐳 # 确保已经安装了Docker软件，没有的话，从官网下载安装 https://www.docker.com/products/docker-desktop/\n复制以下代码到终端运行即可\nCPU 版本 # 1 2 curl -fsSL https://harry0703.com/cosyvoice/docker-compose.yml -o docker-compose.yml docker-compose up GPU 版本 # 1 2 curl -fsSL https://harry0703.com/cosyvoice/docker-compose-gpu.yml -o docker-compose.yml docker-compose up docker 启动后，访问 http://127.0.0.1:50000/\n","date":"2024-08-03","externalUrl":null,"permalink":"/post/cosyvoice/","section":"文章","summary":"部署和使用 CosyVoice，体验自然语言控制、音色复刻，以及 CPU 和 GPU 两种运行方式。","title":"阿里开源 CosyVoice 语音克隆 部署和使用","type":"post"},{"content":"","date":"2024-08-03","externalUrl":null,"permalink":"/tags/%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2/","section":"标签","summary":"","title":"本地部署","type":"tags"},{"content":"","date":"2024-08-03","externalUrl":null,"permalink":"/tags/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90/","section":"标签","summary":"","title":"语音合成","type":"tags"},{"content":"FunASR 模型的整理和集成，Docker一键启动，能够实时识别语音输入，准确度非常高\n项目地址：https://github.com/harry0703/AudioNotes\nFunASR开源仓库: https://github.com/modelscope/FunASR\n效果展示 # 使用方法 # Docker部署🐳 # 确保已经安装了Docker软件，没有的话，从官网下载安装 https://www.docker.com/products/docker-desktop/\n复制以下代码到终端运行即可\n1 2 curl -fsSL https://harry0703.com/realtime-funasr/docker-compose.yml -o docker-compose.yml docker-compose up 注意：第一次启动过程可能会有点长，需要从魔搭下载4个模型\nFSMN-VAD模型, Paraformer-lagre实时模型, CT-Transformer标点预测模型, 基于FST的中文ITN docker 启动后，访问 http://localhost:10096/\n👉👉 如果你想了解更多，可以往下看 # 参数说明 # ① 模型模式 # 2pass: （默认）实时语音识别，并且句尾采用离线模型进行纠错（准确度更高） online: 实时语音识别 offline: 一句话识别 ② 逆文本标准化（ITN） # 是: （默认） 表示进行逆文本标准化 否: 表示不进行逆文本标准化 逆文本标准化（Inverse Text Normalization, ITN） 是语音识别和自然语言处理领域的一种技术，用于将自动语音识别（ASR）系统生成的文本转化为更自然和可读的格式。这是对文本标准化（Text Normalization, TN）的逆过程。\n逆文本标准化的目的\n当语音被转换为文本时，ASR 系统通常会输出一种更标准化的文本形式。例如：\n数字 \u0026ldquo;123\u0026rdquo; 可能会被识别为 \u0026ldquo;一二三\u0026rdquo; 或 \u0026ldquo;123\u0026rdquo;。 日期 \u0026ldquo;2024年7月25日\u0026rdquo; 可能会被识别为 \u0026ldquo;二零二四年七月二十五日\u0026rdquo; 或 \u0026ldquo;2024年7月25日\u0026rdquo;。 这些输出虽然标准化，但不一定是人们习惯书写或阅读的格式。 ITN 的作用是将这些标准化的文本转换回更自然、更符合书面习惯的形式。例如：\n\u0026ldquo;一二三\u0026rdquo; 转换为 \u0026ldquo;123\u0026rdquo; \u0026ldquo;二零二四年七月二十五日\u0026rdquo; 转换为 \u0026ldquo;2024年7月25日\u0026rdquo; \u0026ldquo;五千七百六十三\u0026rdquo; 转换为 \u0026ldquo;5763\u0026rdquo; 👉👉如果你想使用API，请参考以下文档 # 系统架构图 # 注意：\n10096端口为网页界面 10095端口为websocket通信端口 \u0026gt; 🅰️ 从客户端往服务端发送数据 # 消息格式 # 配置参数用json，音频数据采用bytes\n① 首次通信 # 客户端发送配置参数\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \u0026#34;chunk_size\u0026#34;: [ 5, 10, 5 ], \u0026#34;wav_name\u0026#34;: \u0026#34;h5\u0026#34;, \u0026#34;is_speaking\u0026#34;: true, \u0026#34;wav_format\u0026#34;: \u0026#34;pcm\u0026#34;, \u0026#34;chunk_interval\u0026#34;: 10, \u0026#34;itn\u0026#34;: true, \u0026#34;mode\u0026#34;: \u0026#34;2pass\u0026#34;, \u0026#34;hotwords\u0026#34;: \u0026#34;{\\\u0026#34;阿里巴巴\\\u0026#34;:20,\\\u0026#34;hello world\\\u0026#34;:40}\u0026#34; } 参数说明：\nwav_name：表示需要推理音频文件名 wav_format：表示音视频文件后缀名，只支持pcm音频流 is_speaking：表示断句尾点，例如，vad切割点，或者一条wav结束 chunk_size：表示流式模型latency配置，[5,10,5]，表示当前音频为600ms，并且回看300ms，又看300ms。 hotwords：如果使用热词，需要向服务端发送热词数据（字符串），格式为 \u0026ldquo;{\u0026ldquo;阿里巴巴\u0026rdquo;:20,\u0026ldquo;通义实验室\u0026rdquo;:30}\u0026rdquo; itn: 设置是否使用itn，默认 true ② 发送音频数据 # 直接将音频数据移除头部信息后，使用 bytes 数据发送，支持音频采样率为8000\n③ 发送结束标志 # 音频数据发送结束后，需要发送结束标志\n1 2 3 { \u0026#34;is_speaking\u0026#34;: false } 🅱️ 从服务端往客户端发数据 # 发送识别结果 # 识别中\n1 2 3 4 5 6 { \u0026#34;is_final\u0026#34;: false, \u0026#34;mode\u0026#34;: \u0026#34;2pass-online\u0026#34;, \u0026#34;text\u0026#34;: \u0026#34;阿里\u0026#34;, \u0026#34;wav_name\u0026#34;: \u0026#34;h5\u0026#34; } 识别结束\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 { \u0026#34;is_final\u0026#34;: false, \u0026#34;mode\u0026#34;: \u0026#34;2pass-offline\u0026#34;, \u0026#34;stamp_sents\u0026#34;: [ { \u0026#34;end\u0026#34;: 4385, \u0026#34;punc\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;start\u0026#34;: 820, \u0026#34;text_seg\u0026#34;: \u0026#34;阿 里 开 源 的 语 音 识 别 真 是 太 牛 了\u0026#34; } ], \u0026#34;text\u0026#34;: \u0026#34;阿里开源的语音识别真是太牛了\u0026#34;, \u0026#34;timestamp\u0026#34;: \u0026#34;[[820,1060],[1060,1319],[1319,1480],[1480,1760],[1760,2220],[2220,2420],[2420,2659],[2659,2820],[2820,3300],[3300,3480],[3480,3659],[3659,3820],[3820,4060],[4060,4385]]\u0026#34;, \u0026#34;wav_name\u0026#34;: \u0026#34;h5\u0026#34; } 参数说明：\nmode：推理模式 2pass-online：表示实时识别结果 2pass-offline：表示2遍修正识别结果 wav_name：需要推理音频文件名 text：语音识别输出文本 👉👉踩坑 # 报错：录音open失败：浏览器禁止不安全页面录音 # 如果你是在其他电脑或服务器上部署的服务，而不是在本地，当你打开页面后，可能会遇到这个问题。\n假设服务器IP是 192.168.1.170，打开的页面是 http://192.168.1.170:10096/\n解决方法： Chrome浏览器 # 在浏览器地址栏输入 chrome://flags/#unsafely-treat-insecure-origin-as-secure 把 http://192.168.1.170:10096/ 添加到输入框内 将 Insecure origins treated as secure 设置为 Enabled 重启浏览器 Edge浏览器 # 在浏览器地址栏输入 edge://flags/#unsafely-treat-insecure-origin-as-secure 把 http://192.168.1.170:10096/ 添加到输入框内 将 Insecure origins treated as secure 设置为 Enabled 重启浏览器 ","date":"2024-07-25","externalUrl":null,"permalink":"/post/realtime-funasr/","section":"文章","summary":"部署 FunASR 实时语音识别服务，了解模型模式、ITN 参数以及 WebSocket API 的使用方法。","title":"FunASR实时语音识别部署和使用","type":"post"},{"content":"","date":"2024-07-19","externalUrl":null,"permalink":"/tags/audionotes/","section":"标签","summary":"","title":"AudioNotes","type":"tags"},{"content":"项目地址：https://github.com/harry0703/AudioNotes\n基于 FunASR 和 Qwen2 构建的音视频转结构化笔记系统 # 能够快速提取音视频的内容，并且调用大模型进行整理，成为一份结构化的markdown笔记，方便快速阅读\nFunASR: https://github.com/modelscope/FunASR\nQwen2: https://ollama.com/library/qwen2\n效果展示 # 音视频识别和整理 # 与音视频内容对话 # 使用方法 # ① 安装 Ollama # 下载对应系统的 Ollama 安装包进行安装\nhttps://ollama.com/download\n② 拉取模型 # 我以 阿里的千问2 7b 为例 https://ollama.com/library/qwen2\n1 ollama pull qwen2:7b Docker部署（推荐）🐳 # 1 2 curl -fsSL https://harry0703.com/audio-notes/docker-compose.yml -o docker-compose.yml docker-compose up docker 启动后，访问 http://localhost:15433/\n登录账号为 admin，密码为 admin （可以在 docker-compose.yml 文件里面修改）\n本地部署 📦 # 需要有可访问的 postgresql 数据库\n1 2 3 4 5 conda create -n AudioNotes python=3.10 -y conda activate AudioNotes git clone https://github.com/harry0703/AudioNotes.git cd AudioNotes pip install -r requirements.txt 将 .env.example 重命名为 .env，修改相关配置信息\n1 chainlit run main.py 服务启动后，访问 http://localhost:8000/\n登录账号为 admin，密码为 admin （可以在 docker-compose.yml 文件里面修改）\n","date":"2024-07-19","externalUrl":null,"permalink":"/post/audio-notes/","section":"文章","summary":"结合 FunASR、Ollama 和 Qwen2，在本地完成音视频转写、内容整理和结构化 Markdown 笔记生成。","title":"如何利用本地模型，将音视频整理成一份结构化的Markdown笔记","type":"post"},{"content":"","date":"2024-07-19","externalUrl":null,"permalink":"/tags/%E7%9F%A5%E8%AF%86%E8%87%AA%E5%8A%A8%E5%8C%96/","section":"标签","summary":"","title":"知识自动化","type":"tags"},{"content":"","date":"2024-05-29","externalUrl":null,"permalink":"/tags/chattts/","section":"标签","summary":"","title":"ChatTTS","type":"tags"},{"content":"项目地址：https://github.com/2noise/ChatTTS\nWindows 用户建议直接下载一键启动包，运行环境和模型都已经配置好，使用更简单。\nWindows 一键启动包 # 百度网盘下载：https://pan.baidu.com/s/1wfdqQDTzDnMf01bV1wzKgQ?pwd=v2kb 提取码：v2kb\n解压密码：harryai\n下载后解压，然后双击 启动服务.bat 即可。\n启动成功后，会自动打开 http://localhost:8845/ 页面。\n输入文本内容，即可合成语音。\n手动部署 # 1. 下载代码 # 点击下载代码压缩包，然后解压到本地。\n2. 下载模型 # 从魔搭下载 https://www.modelscope.cn/models/pzc163/chatTTS/summary 建议使用 git 克隆\n1 git clone https://www.modelscope.cn/pzc163/chatTTS.git 注意：魔搭里面缺少文件 spk_stat.pt，点击这里 下载，然后放到 chatTTS/asset 目录下。\n再将下载的整个文件夹，放到 models 文件夹下，结构如下：\n3. 安装依赖 # 1 pip install -r requirements.txt 4. 启动服务 # 1 python webui.py 启动成功后，会自动打开 http://localhost:8845/ 页面，输入文本内容，即可合成语音。\n","date":"2024-05-29","externalUrl":null,"permalink":"/post/chat-tts/","section":"文章","summary":"整理 ChatTTS 在 Windows 和 Docker 环境中的部署方法，包括模型准备、一键启动包和 WebUI 使用流程。","title":"ChatTTS 开源语音合成服务的部署和使用","type":"post"},{"content":"","date":"2024-05-03","externalUrl":null,"permalink":"/tags/llama-3/","section":"标签","summary":"","title":"LLaMA 3","type":"tags"},{"content":"","date":"2024-05-03","externalUrl":null,"permalink":"/tags/lora/","section":"标签","summary":"","title":"LoRA","type":"tags"},{"content":"","date":"2024-05-03","externalUrl":null,"permalink":"/tags/%E6%A8%A1%E5%9E%8B%E5%BE%AE%E8%B0%83/","section":"标签","summary":"","title":"模型微调","type":"tags"},{"content":"注意：没有GPU，也可以微调一个属于你自己的大模型，只是微调的时间长一点而已，建议晚上睡觉前运行，第二天早上就可以使用了 😄\n效果演示 # 部署环境 # 点击下载 LLaMA3-8B 微调代码压缩包 将下载的压缩包解压 在 终端 (macOS) 或 cmd命令提示符 (Windows) 里面，进入解压后的文件夹，创建一个新的 Conda 虚拟环境 未安装 Conda 的用户，可以到 Conda官网下载安装。\n1 2 3 cd llama3-ft conda create -n llama3-ft python=3.10 conda activate llama3-ft 安装依赖包 1 pip install -r requirements.txt 数据准备 # 你可以直接使用 dataset/huanhuan.json 数据集（该数据集来源于 https://github.com/KMnO4-zx ），也可以自己准备数据集 ，比如你的客服对话（FAQ）数据集，这样就可以微调一个更适合你的智能客服的模型，客服回答更准确。\n数据集的格式也比较简单，示例如下：\ninstruction 是问题 output 是回答 1 2 3 4 5 6 7 8 9 10 11 12 [ { \u0026#34;instruction\u0026#34;: \u0026#34;你好\u0026#34;, \u0026#34;input\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;output\u0026#34;: \u0026#34;皇上好，我是甄嬛，家父是大理寺少卿甄远道。\u0026#34; }, { \u0026#34;instruction\u0026#34;: \u0026#34;你不愿意见我？\u0026#34;, \u0026#34;input\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;output\u0026#34;: \u0026#34;不该相见自然不愿见，还望王爷尊重我的意愿。\u0026#34; } ] 模型微调 # 模型选择 # 我使用的是 LLM-Research/Meta-Llama-3-8B-Instruct ，你也可以选择一个其他模型，只需要修改 train.py 文件里面的 model_id 变量即可。\n由于国内访问 HuggingFace 比较困难，因此使用 ModelScope 提供的模型。\n1 2 3 4 5 6 7 8 # 需要微调的基座模型 # https://www.modelscope.cn/studios/LLM-Research/Chat_Llama-3-8B/summary model_id = \u0026#39;LLM-Research/Meta-Llama-3-8B-Instruct\u0026#39; # 比如你也可以使用 Qwen1.5-4B-Chat 模型 # https://www.modelscope.cn/models/qwen/Qwen1.5-4B-Chat/summary # model_id = \u0026#39;qwen/Qwen1.5-4B-Chat\u0026#39; 开始微调 # 只需要在项目根目录下执行以下命令即可。\n1 python train.py 或者可以打开 LLaMA3-8B-Instruct Lora.ipynb 文件，使用 Jupyter Notebook 进行微调。\n注意：\n微调的时间会根据你的数据集大小和模型大小而定。我由于没有 GPU，因此耗时2个小时，如果你有 GPU，大概需要 30 分钟。 代码会自动下载模型，然后开始微调 微调完成后，所有的文件会保存在 models 文件夹下面，结构如下： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ├── models ├── checkpoint #【模型微调的 checkpoint】 │ ├── LLM-Research │ │ └── Meta-Llama-3-8B-Instruct │ │ ├── checkpoint-100 │ │ ├── checkpoint-200 │ │ ├── checkpoint-xxx │ └── qwen │ └── Qwen1.5-4B-Chat │ ├── checkpoint-100 │ ├── checkpoint-200 │ ├── checkpoint-xxx ├── lora #【模型微调的 lora 文件】 │ ├── LLM-Research │ │ └── Meta-Llama-3-8B-Instruct │ └── qwen │ └── Qwen1.5-4B-Chat └── model #【自动下载的基座模型】 ├── LLM-Research │ └── Meta-Llama-3-8B-Instruct └── qwen └── Qwen1___5-4B-Chat 模型测试 # 微调完成后，你可以执行以下命令启动一个 ChatBot 进行对话测试。\n1 streamlit run chat.py 该命令执行后，会自动打开浏览器对话页面\n","date":"2024-05-03","externalUrl":null,"permalink":"/post/llama3-fine-tuning/","section":"文章","summary":"用 LLaMA 3、LoRA 和自定义对话数据完成一次本地模型微调，并将结果接入聊天界面。","title":"只需3分钟，基于 LLaMA3-8B 微调一个属于你自己的嬛嬛","type":"post"},{"content":"","date":"2024-04-29","externalUrl":null,"permalink":"/tags/chatgpt-on-wechat/","section":"标签","summary":"","title":"ChatGPT-on-WeChat","type":"tags"},{"content":"","date":"2024-04-29","externalUrl":null,"permalink":"/tags/%E4%BC%81%E4%B8%9A%E7%9F%A5%E8%AF%86%E5%BA%93/","section":"标签","summary":"","title":"企业知识库","type":"tags"},{"content":"前提\n先搭建好 本地化的企业级知识库问答系统 ，参考 《手把手教你构建一个 本地化的，免费的，企业级的，AI大模型知识库问答系统》\n下载Docker启动文件 # 因为 ChatGPT-On-WeChat 代码有 Bug，作者一直未修复，因此我修改后，重新打了一个Docker镜像，避免大家踩坑。\n1 2 3 mkdir chatgpt-on-wechat cd chatgpt-on-wechat curl -O https://harry0703.com/chatgpt-on-wechat/docker-compose.yml 修改配置文件 # 打开 docker-compose.yml 文件，修改 OPEN_AI_API_KEY 和 OPEN_AI_API_BASE 为你的 FastGPT 的 API Key 和 API 地址。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 version: \u0026#39;2.0\u0026#39; services: chatgpt-on-wechat: image: harryliu888/chatgpt-on-wechat:latest container_name: chatgpt-on-wechat security_opt: - seccomp:unconfined environment: # OPEN_AI_API_KEY 在 FastGPT 的 应用发布页面生成（API访问） OPEN_AI_API_KEY: \u0026#39;fastgpt-iAt0KIDwpZqFvxfpmWstAkars36s0ASBENYKYLGSwJcf7NuCn2NzT\u0026#39; # OPEN_AI_API_BASE 填写 FastGPT 的 API 地址 # 特别注意，如果 chatgpt-on-wechat 是docker部署的，因此要访问外部的 FastGPT，这里需要使用 host.docker.internal OPEN_AI_API_BASE: \u0026#39;http://host.docker.internal:3000/api/v1\u0026#39; MODEL: \u0026#39;gpt-3.5-turbo\u0026#39; PROXY: \u0026#39;\u0026#39; SINGLE_CHAT_PREFIX: \u0026#39;[\u0026#34;bot\u0026#34;, \u0026#34;@bot\u0026#34;]\u0026#39; SINGLE_CHAT_REPLY_PREFIX: \u0026#39;\u0026#34;[bot] \u0026#34;\u0026#39; GROUP_CHAT_PREFIX: \u0026#39;[\u0026#34;@bot\u0026#34;]\u0026#39; GROUP_NAME_WHITE_LIST: \u0026#39;[\u0026#34;ChatGPT测试群\u0026#34;, \u0026#34;ChatGPT测试群2\u0026#34;]\u0026#39; IMAGE_CREATE_PREFIX: \u0026#39;[\u0026#34;画\u0026#34;, \u0026#34;看\u0026#34;, \u0026#34;找\u0026#34;]\u0026#39; CONVERSATION_MAX_TOKENS: 1000 SPEECH_RECOGNITION: \u0026#39;False\u0026#39; CHARACTER_DESC: \u0026#39;你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题，并且可以使用多种语言与人交流。\u0026#39; EXPIRES_IN_SECONDS: 3600 USE_GLOBAL_PLUGIN_CONFIG: \u0026#39;True\u0026#39; USE_LINKAI: \u0026#39;False\u0026#39; LINKAI_API_KEY: \u0026#39;\u0026#39; LINKAI_APP_CODE: \u0026#39;\u0026#39; extra_hosts: - \u0026#39;host.docker.internal:host-gateway\u0026#39; 启动Docker # 1 2 cd chatgpt-on-wechat docker-compose up ","date":"2024-04-29","externalUrl":null,"permalink":"/post/chatgpt-on-wechat/","section":"文章","summary":"将本地企业知识库问答系统接入个人微信，搭建可在微信内使用的 AI 智能客服。","title":"手把手教你把AI大模型本地知识库问答接入个人微信，实现微信内的AI智能客服","type":"post"},{"content":"","date":"2024-04-29","externalUrl":null,"permalink":"/tags/%E5%BE%AE%E4%BF%A1%E6%9C%BA%E5%99%A8%E4%BA%BA/","section":"标签","summary":"","title":"微信机器人","type":"tags"},{"content":"","date":"2024-04-29","externalUrl":null,"permalink":"/tags/%E6%99%BA%E8%83%BD%E5%AE%A2%E6%9C%8D/","section":"标签","summary":"","title":"智能客服","type":"tags"},{"content":"","date":"2024-04-20","externalUrl":null,"permalink":"/tags/rag/","section":"标签","summary":"","title":"RAG","type":"tags"},{"content":"","date":"2024-04-20","externalUrl":null,"permalink":"/tags/%E6%9C%AC%E5%9C%B0%E5%A4%A7%E6%A8%A1%E5%9E%8B/","section":"标签","summary":"","title":"本地大模型","type":"tags"},{"content":"我将通过一个系列分享，手把手的教大家打造一个完全本地化的，免费的，企业级知识库问答系统\n本地大模型回答演示图 # 知识库导入演示图 # 我认为本地化主要有2方面的意义： # 1. 安全性 # 当使用外部模型或服务时，我们的私有数据，用户问题，都会被发送给第三方 那我们就要面临私有数据暴露给别人的风险，甚至会导致数据泄露 本地化会让我们的数据就更安全\n2. 灵活性 # 另外随着我们的业务发展，如果模型不能很好的满足我们需求的时候 我们可以很方便的对本地模型其进行微调 以达到更好的适配\n这样就既兼顾了安全，又兼顾了灵活性\n应用场景 # 知识库问答的使用场景其实非常多，我随便举2个商业系统的例子\n比如对个人，可以用来整理笔记、论文解读、文献检索、文档问答等等。 这里我用 轻闪PDF的文档对话 https://lightpdf.cn/chatdoc 来演示一下效果。\n我们随便上传一个PDF文档，等文档解析完成后，我们就可以通过提问的方式，对文档里面的内容进行解读，可以很快的从文档中找到我们想要的内容， 大大提高我们查看文档的效率。\n对企业，可以用来做智能客服，数据沉淀或者数字员工等等，同样我用思乎的在线客服 https://gitmind.cn 来演示一下。\n我们可以向客服提问，AI就会准确的回复我们的问题，而这些问题的答案，大模型本身是没有的。 因为大模型既不了解我们的业务，也不知道我们的数据，这些AI回复的答案，都是从企业的知识库里面获取的。这样我们就实现了一个7x24小时的智能客服， 不仅为企业降本增效，还提高了客户的满意度。\n服务器配置要求 # 环境 最低配置 推荐配置 测试 2核 2GB 2核 4GB 100w 组向量 4核 8GB 50GB 4核 16GB 50GB 500w 组向量 8核 32GB\t200GB 16核 48GB 200GB 1000w 组向量 16核 48GB\t200GB 32核 64GB 500GB 架构图 # 整个的系统搭建，都是基于这个架构图来进行的\nRAG原理 # 是什么 # 检索：Retrieval，通过向量模型，或者多种混合检索方式，从知识库中检索出相关的文档 增强：Augmentation，通过将检索到的文档，附加到提示词中，进行增强。也即 ICL（In Context Learning） 生成：Generation，通过大语言模型，生成答案 有什么优势 # 有助于减轻大模型的幻觉，提高大模型回复的准确性 与微调不同，RAG提供了一定的可观察性和可检查性 成本低，好实施 安装 Docker # 下载 Docker 并安装 https://www.docker.com/products/docker-desktop/\n安装 Ollama # 下载 Ollama 并安装 https://ollama.com/\n下载 Chat 模型 # 我使用阿里的通义千问作为演示，根据自己的电脑配置情况，选择合适的模型。\n总体来说，模型是越大，效果越好，但是对电脑的配置要求也越高\n4b 模型要 3GB内存 7b 模型要 8GB 内存 13b 模型要 16GB 内存 70b 模型要 64GB 内存 特别注意：你如果要用于商业用途，需要申请授权，否则只能用于个人学习\n千问许可说明: https://ollama.com/library/qwen:latest/blobs/41c2cf8c272f 申请商用授权: https://dashscope.console.aliyun.com/openModelApply/qianwen\n下载模型 # 1 ollama pull qwen:7b 测试API请求 # 等模型下载和安装好后，执行下面的命令，测试API请求是否成功\nMac/Linux下执行： # 1 2 3 4 5 6 7 8 9 10 11 12 curl \u0026#39;http://localhost:11434/api/chat\u0026#39; \\ --data \u0026#39;{ \u0026#34;model\u0026#34;: \u0026#34;qwen:7b\u0026#34;, \u0026#34;messages\u0026#34;: [ { \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;你是谁\u0026#34; } ], \u0026#34;temperature\u0026#34;: 0.1, \u0026#34;stream\u0026#34;: false }\u0026#39; Windows下执行： # 1 2 curl \u0026#34;http://localhost:11434/api/chat\u0026#34; ^ --data \u0026#34;{\u0026#34;\u0026#34;model\u0026#34;\u0026#34;: \u0026#34;\u0026#34;qwen:7b\u0026#34;\u0026#34;, \u0026#34;\u0026#34;messages\u0026#34;\u0026#34;: [{\u0026#34;\u0026#34;role\u0026#34;\u0026#34;: \u0026#34;\u0026#34;user\u0026#34;\u0026#34;, \u0026#34;\u0026#34;content\u0026#34;\u0026#34;: \u0026#34;\u0026#34;你是谁\u0026#34;\u0026#34;}], \u0026#34;\u0026#34;temperature\u0026#34;\u0026#34;: 0.1, \u0026#34;\u0026#34;stream\u0026#34;\u0026#34;: false}\u0026#34; 下载 Embedding 模型 # 我使用了 DmetaSoul 的中文Embedding模型，该模型号称在 MTEB 中文榜单取得开源第一的成绩: https://huggingface.co/DMetaSoul/Dmeta-embedding-zh/blob/main/README_zh.md\n下载模型 # 1 ollama pull shaw/dmeta-embedding-zh 测试API请求 # 等模型下载和安装好后，执行下面的命令，测试API请求是否成功\nMac/Linux下执行： # 1 2 3 4 5 curl \u0026#39;http://localhost:11434/api/embeddings\u0026#39; \\ --data \u0026#39;{ \u0026#34;model\u0026#34;: \u0026#34;shaw/dmeta-embedding-zh\u0026#34;, \u0026#34;prompt\u0026#34;: \u0026#34;天空是灰色的\u0026#34; }\u0026#39; Windows下执行： # 1 2 curl \u0026#34;http://localhost:11434/api/embeddings\u0026#34; ^ --data \u0026#34;{\u0026#34;\u0026#34;model\u0026#34;\u0026#34;: \u0026#34;\u0026#34;shaw/dmeta-embedding-zh\u0026#34;\u0026#34;, \u0026#34;\u0026#34;prompt\u0026#34;\u0026#34;: \u0026#34;\u0026#34;天空是灰色的\u0026#34;\u0026#34;}\u0026#34; 安装FastGPT及其依赖 # 1. 下载 docker 文件 和 config 文件 # 你可以手动下载，放到一个文件夹里面\ndocker-compose.yml: https://harry0703.com/kbqa/docker-compose.yml config.json: https://harry0703.com/kbqa/config.json 也可以直接执行下面的命令，自动下载\n1 2 3 4 mkdir kbqa cd kbqa curl -O https://harry0703.com/kbqa/docker-compose.yml curl -O https://harry0703.com/kbqa/config.json 2. 启动 docker # 1 docker-compose up 注意\n第一次启动会有点慢，因为要拉取镜像，后面启动就会很快了 如果第一次启动失败，可以多次执行 docker-compose up 3. 访问 FastGPT 和 OneAPI # 你第一次访问，系统里面是没有数据的，截图里面的数据，是我测试的时候已经创建好了的。\nFastGPT # 点击访问：http://localhost:3000\n用户名 root，密码 1234（密码可以在 docker-compose.yml 环境变量里设置 DEFAULT_ROOT_PSW 进行修改） OneAPI # 点击访问：http://localhost:3001\n用户名 root，密码 123456 配置OneAPI # 添加模型：http://localhost:3001/channel\n1. 配置大语言模型 # 类型：Ollama 名称：ollama-qwen:7b 模型：输入自定义模型名称，qwen:7b 密钥：随便填，比如 123 代理：http://host.docker.internal:11434 2. 配置Embedding向量模型 # 类型：Ollama 名称：ollama-dmeta-embedding-zh 模型：输入自定义模型名称，shaw/dmeta-embedding-zh**，比如 密钥：随便填，比如 123 代理：http://host.docker.internal:11434 特别注意：\n模型 必须和 ollama 安装的模型名称保持一致，可以使用 ollama list 命令查看 代理地址 必须是 http://host.docker.internal:11434，这样 OneAPI 才能访问到 ollama 默认情况下，Docker 使用的是 桥接模式 启动服务，即容器使用 Docker 自己创建的虚拟网络，容器之间可以相互通信，但是它们无法直接访问宿主机（即你的电脑）上的网络服务。\n但是 Ollama 是运行在你的电脑上的， 而 OneAPI 是运行在 Docker 容器里面的，所以 OneAPI 无法直接访问 Ollama。\ndocker 官方提供了一种支持方案，可通过指向 host.docker.internal 来指向宿主机的 IP。\n参见官方文档：从容器连接到主机上的服务\n配置FastGPT # 我们先创建一个简单的应用，实现一个基本的AI对话，目的是测试OneAPI的接口以及Ollama的接口是否正常。\n未完待续\n","date":"2024-04-20","externalUrl":null,"permalink":"/post/enterprise-knowledge-llm-qa/","section":"文章","summary":"从架构、数据安全和部署流程出发，搭建本地化的企业级大模型知识库问答系统。","title":"手把手教你构建一个 本地化的，免费的，企业级的，AI大模型知识库问答系统","type":"post"}]