HTML压缩:前端性能优化中最不起眼却最实在的一环

做前端性能优化这些年,我跟CSS和JS的“较劲”没少干过,压缩、拆包、按需加载、缓存策略,一套组合拳打下来,总觉得自己已经做得挺到位了。直到有一次我做页面体检,盯着网络面板里那份HTML文件发呆——它居然有将近200KB。是的,HTML,那个被很多人默认“反正就一个文档”、“压不压都行”的入口文件,成了我当时整个站点性能账单里最大的一笔糊涂账。

那次之后我才认真把“疯狂压缩HTML”这件事当成专项来做。WEB高性能开发里,静态资源优化是显学,但真正决定首包速度、决定浏览器多早能开始解析和请求子资源的,恰恰是这份HTML。这篇文章我就把这套压缩玩法从头到尾拆开讲清楚,包括它为什么值得做、到底在压些什么、怎么在构建期或运行期安全落地,以及我踩过的那些坑。不管你是刚接触性能优化,还是已经在做工程化改造,这份实操记录应该都能给你点参考。

1. HTML压缩:最不起眼却最实在的一块优化

1.1 HTML才是首屏路径上的“第一块砖”

很多人聊性能优化时,注意力都在JS和CSS上,这没错,但有个前提:浏览器得先拿到HTML,才知道要去加载哪些JS和CSS。也就是说,HTML是所有静态资源请求的“源头地图”,它越小、越早到达,后续的CSS、JS、图片请求才能越早发出去,首屏时间才会真的降下来。

我拿一个真实的优化案例来说。当时有个活动页,模板里塞了大量的注释、调式代码和格式化的空白缩进,HTML原始体积到了180多KB。我用压缩工具处理之后,直接掉到70KB左右,再用上Brotli做传输层压缩,最后线上实际传输只有20多KB。首字节时间(TTFB)受后端影响变化不算大,但页面从开始下载HTML到触发首个资源请求的时间,肉眼可见地缩短了。在弱网环境下,这个“地图”早到一秒钟,后面的所有资源都能早一秒开始,整体体验完全是两个档次。

这里有一个容易忽略的逻辑:数据量小,不等于是压缩算法的功劳。Brotli/Gzip是传输层的压缩,但HTML本身的冗余越大,传输层压缩的后处理就越吃力,而且有些冗余(比如大量内联空白)即使经过Gzip也不能完全消除。所以先做静态压缩,再做传输压缩,两者是叠加关系而不是替代关系。我见过很多项目只在服务器开个Gzip就以为万事大吉了,其实HTML源文件里那些冗余字符根本没被真正解决。

1.2 极限压缩能省多少:一组直观数据

说到压缩率,我实测的几个项目里,典型的HTML优化空间是这样的:

  • 未做任何处理的模板输出,通常带大量换行和缩进,体积约40KB到200KB不等;
  • 做完空白折叠、注释清除、属性精简后,普遍能减少50%到70%的源文件大小;
  • 如果模板里还带很多内联的CSS、JS或结构化数据,压缩空间会更大,有些极端场景能压到原体积的三分之一。

当然,具体数字跟项目写法关系很大。如果你用模板引擎开发,每个if/for分支前后都留两行缩进,那换行和空格的数量会非常可观。相反,如果你本来写HTML就习惯“不换行手写到底”,那压缩收益就没那么大。

但这里我要说一句真心话:追求极致数字本身没那么重要,重要的是产业链上的每个环节都变得更快。HTML体积下来之后,不只是下载更快,服务器带宽占用更小,甚至日志采集和前端监控上报的payload都会小一点。这种全链路收益,才是我们优化时真正想要的。

1.3 压缩的边界:改不得的“语义空白”

既然要“疯狂”,是不是把HTML压成一行、所有空格都不要就完事?不是的。HTML里有一类特殊的空白叫“语义空白”,动了它是会改变渲染结果的。

典型的例子是<pre>和<textarea>,这两个元素内部的多余空白和换行是会被浏览器保留下来的。还有一个很容易踩的坑是普通文本节点里连续多个空格——浏览器默认会把连续空白折叠成一个,但如果压缩工具把两个词之间的一个空格都删了,句子就会变成一个词。还有<style>和<script>标签内部的内容,模板字符串、正则表达式、注释里的特殊格式,更不能随便动。

所以真正专业的HTML压缩,不是机械地“去掉所有没用的字符”,而是在理解HTML解析规则的基础上,把确定安全的部分优化掉。这也是为什么我不建议用简单的字符串替换或正则去压HTML——那必然出事故。后面我会专门讲安全的压缩器是怎么处理这些边界的。

2. 疯狂的细节:HTML压缩到底在压什么

2.1 空白字符:容易误伤的最大头

空白字符是HTML压缩里占比最大、也最容易出问题的部分。一个典型的模板文件,如果按开发习惯做两格缩进,那每一行开头的空格都是冗余的。压缩器把所有标签之间的空白折叠成一个或归零,能把体积立刻砍掉一大截。

但这里有两个机制必须搞清楚:

一是“标签之间的空白”和“文本节点里的空白”不一样。比如<div><span>a</span> <span>b</span></div>,两个span之间的那个空格属于文本节点,直接删掉会让文字从“a b”变成“ab”。安全的压缩器会判断这里是否值得保留,而不是一刀切。

二是“默认inline元素之间的空白”在渲染时确实会产生空格,但如果我们相信设计师不需要那个空格,有些压缩器也允许开“保守模式”去合并它们。这里面没有绝对的对错,只看你对页面像素级还原的要求有多高。我的习惯是:如果是面向内容型的博客、文档站点,我就开启保守的空白折叠;如果是活动页、像素级设计稿页面,我会把文本节点空白保留多一些,宁可不极致,也别让UI崩掉。

实操心得:压缩前最好对页面做一次截图留档,压缩后再做一次像素级对比。尤其是中英文混排的页面,词间空格有没有被吃、行内元素间距有没有变化,截图一比就出来了。

2.2 注释:该删的删,该留的留

注释是HTML里最“肥”的冗余之一。很多后端渲染的页面会保留大量开发注释,比如模块开始注释、改版记录注释、甚至还有整段被注释掉的调试代码。这部分内容用户完全看不到,但每个字节都要下载,太冤了。

但注释也不是一股脑全删。有两类注释必须小心:

  1. 条件注释(形如<!--[if IE]>...<![endif]-->)。老版本浏览器的兼容逻辑就靠它实现。激进压缩器如果直接删掉,老浏览器上的布局就会乱套。好在主流压缩库处理这个场景时通常会给一个配置项,让你选择“保留并压缩条件注释”而不是删除。

  2. 结构化页头注释。比如有些团队规范要求HTML里必须带版权声明、版本号,或者给爬虫看的格式说明,这类不能删,但要手动把它们加入白名单。

我在实际操作中,会把压缩规则里的“删除注释”打开,但“保留条件注释”也打开,然后观察一下有没有被特殊处理过的注释需要加白名单。几行配置的事情,但能避免上线后突然冒出一堆兼容性问题。

2.3 标签和属性的“瘦身”

除了空白和注释,HTML压缩还能从标签和属性层面再榨出一些空间。

属性领域有几个典型操作。比如class="class1"这种冗余属性,如果模板里输出的是class="if(true)"导致空属性值,可以删除;再比如checked="checked"、selected="selected"这类布尔属性,可以压成只保留checked、selected;还有type="text"这种在input上的默认属性,某些场景下可以去掉。属性引号也能省:只要属性值不包含空格、引号、等号等特殊字符,HTML规范允许不带引号,把class="box"写成class=box能省两个字符。

但请注意,这类“节省”是很有风险的。属性引号一旦省略,后续如果内容动态变化、往里拼了个空格,整个属性就会出问题。所以很多压缩工具默认都不开“去除属性引号”,或者只在构建产物、内容高度可控时开启。我的原则是:先把空白和注释这类大头解决掉,属性引号这种“克扣细节”的收益很小,除非你已经做了充分的自动化测试,否则没必要冒险。

再往下还有标签层面的省略。HTML5规范里,li、td、tr、option这些标签的闭合端在某些情况下可以省略,html、head、body这类结构标签也有省略空间。部分压缩器提供removeOptionalTags选项,看起来还能再省几十字节,但隐患也很明确:是老浏览器兼容性问题,以及文档结构在某些解析器下表现不一致。我实测过,这个选项通常只能省下不到5%的体积,但引入的兼容性风险是全局的,完全不划算。这就是为什么我标题里说“疯狂”要打引号——疯狂不是不计后果,而是明知道边界还在那里,却依然能找到值得压的空间。

2.4 内联内容:CSS、JS、JSON、SVG与data URI

这是最容易被业余压缩器搞坏的重灾区。

页面里如果有内联的<style>和<script>标签,压缩HTML的同时应该对它们也做一次压缩。靠谱的压缩库会把这些标签里的内容单独当CSS或JS压缩一遍,并且处理掉源代码里的注释和多余空白。但要警惕一种情况:有些工具会把script标签里的内容当成普通JS去处理,遇到type="application/ld+json"这类数据块时也照压不误。

JSON-LD结构化数据里通常没有多余的空白语义,理论上可以压小,但JSON字符串里的转义字符、Unicode字符不能乱动。更麻烦的是,JSON的个别内容里包含HTML特殊字符(比如<、>、&),如果压缩器自作主张做了HTML实体转换,就会把结构化数据的内容给改掉,导致爬虫解析失败。

SVG同样如此。内联SVG为了减小体积,可以把fill="#ffffff"改成fill="#fff",把路径数据里的多余空白去掉,但前提是你不改变图形渲染结果。data URI(比如图片转base64)也有类似情况,压缩器需要知道哪些内容必须保持原样。

注意:凡是涉及内联的脚本、样式和结构化数据,压缩器最好按“保留内部原样”或“分别走对应语言的压缩器”来处理,绝不能一刀切地用HTML字符串替换去压。

3. 实操落地:三种可行的实施路径

3.1 构建期压缩:静态站点与打包产物的标配

如果你的项目是静态站点或部署前要做构建,那构建期压缩HTML是最简单、最稳妥的做法。这一步发生在代码打包阶段,压缩后的文件被直接写到产物目录里,线上服务器只负责转发,不承担额外的计算开销。

不同构建链路的操作思路不太一样,但逻辑上都是“在HTML文件生成后,调用一个HTML压缩库做处理”。以Node生态为例,我常驻内联配置的效果大概是:

const { minify } = require('html-minifier-terser'); const result = await minify(htmlSource, { collapseWhitespace: true, // 折叠空白,H5语义边界自动处理 removeComments: true, // 去掉注释 removeRedundantAttributes: true, // 删除冗余属性 removeEmptyAttributes: true, // 删除空属性 processConditionalComments: true, // 处理条件注释时保留IE注释 minifyCSS: true, // 压缩内联CSS minifyJS: true, // 压缩内联JS });

这段配置的意思很清楚:核心优化项在文档层,内联样式和脚本走各自语言的压缩器,条件注释保留。如果你也在用类似库里提供的选项,请重点关注collapseWhitespace和minifyJS这两个选项,它们最容易改变页面表现。

如果是Webpack/Vite这类打包器,你也需要把压缩器接进HTML插件里,或者在构建脚本里,对打包后的index.html再做一次同样的处理。要注意顺序:等HTML模板编译完成、所有静态资源引用都注入完毕后再压,这时候文件才是最终形态,压出来的效果最准确。

3.2 运行期压缩:动态输出的服务端过滤

动态站点就没这么幸运了。页面是请求进来时实时渲染出来的,不能提前把HTML文件准备好。这种情况下,常用的做法是在服务端渲染完成后、响应发送给浏览器之前,把HTML字符串“过滤”一遍。

这个思路说简单也简单,就是渲染函数外面套一层压缩处理。但一定要问清楚自己一个问题:你的服务真的能扛住“每个请求都做一次完整HTML压缩”的CPU开销吗?

压缩HTML是一个非常吃CPU的操作,尤其里面还带着内联CSS/JS的压缩。如果页面每秒有上千次请求,每次都跑一遍完整压缩,服务器性能一定吃紧。所以更合理的做法是给压缩结果做缓存,比如把同一个URL的渲染结果+压缩后版本缓存到内存或分布式缓存里,等模板或数据变化了再刷新。实际操作里,我更多是把“动态渲染”和“静态化”结合:对不常变的数据页面直接生成静态HTML并压缩,对真正需要个性化内容的页面再做运行期压缩,配合CDN缓存把压缩成本均摊掉。

这里还要提一个“响应缓冲”的问题。有些服务端框架是流式输出HTML的,页面一边生成一边往网络连接里写,如果想在发送之前做整体压缩,就必须先把整个渲染结果缓冲起来,这会造成一点内存开销。要做运行期压缩,就得接受这种缓冲带来的代价,或者将就一下只压缩头部内容(收益会小很多)。

3.3 传输层的二次压缩:与Brotli/Gzip配合

HTML压缩只做一半是不够的。源文件层面压缩完,还得考虑传输层压缩。这两者不是同一层级的事,而是叠加的:源文件压缩处理掉的是HTML语法层面的冗余;Gzip或Brotli处理的是字节流层面的重复模式。

这就带来一个很有意思的影响:压缩器如果把属性引号去掉、把空白折叠,源文件里的重复模式减少,Brotli的压缩字典效果会被削弱一点点。我见过有团队对比过“先压HTML再上Gzip”和“不压HTML直接上Gzip”的最终传输体积,结果有些场景下两者差距没那么大。但别被这个迷惑——源文件小,意味着缓存占用的空间小,传输第一个字节前的处理开销也小,而且对不支持传输压缩的极端环境(比如某些调试代理、老旧网关)也是一种兜底。

如果你要全面启用Brotli,记得在服务端或CDN设置内容协商。它的压缩率通常比Gzip高10%到20%,但压缩速度更慢。静态CDN上还好,源站动态请求就别把压缩级别开到最高,会拖慢TTFB。实操中我一般开放优先级较高的Brotli级别给静态资源,动态HTML则用适当的Gzip级别或者把动态页面做成短缓存再交给边缘节点。

4. 常见问题与避坑实录

4.1 pre、textarea和多空格被误删

这是我踩过最典型的一个坑。有一次我对一个文档站做HTML压缩,压完之后发现所有代码块里的缩进全没了。原因就是压缩器把<pre>标签里的内容当成了普通HTML空白给折叠了。

排查了很久才确认,是配置里我自定义了空白折叠规则,结果覆盖了库的默认边界识别。后来调整成按元素类型区分处理,pre、textarea、code这些内部的空白一律跳过,问题才消失。如果你的页面里嵌了大量代码示例、聊天记录、表格数据,务必在压缩后做一个“内容对比”检查,而不是只盯样式。

4.2 内联JSON-LD与script内容被改写

还有一次是线上做SEO校验,提示结构化数据解析失败。查来查去,发现是压缩器把首页里JSON-LD脚本中的字符串引号做了处理,还顺手把URL里的双引号给去掉了,结果JSON直接非法。

后来我再处理这类页面时,会把script[type="application/ld+json"]单独摘出来,先不参与HTML压缩,等HTML压完,再决定要不要用JSON专用方式做安全压缩。这种“分批处理”的思路,比指望一个全局压缩器什么都能处理要靠谱得多。

4.3 条件注释与特殊字符:老项目的痛

很难想象现在还会有人碰到IE条件注释,可只要项目够老,这种代码就可能存在。一开始我不知道压缩工具还有保留条件注释的选项,结果压下去的页面在旧内核浏览器里就直接暴露了布局问题。解决方式就是打开前面提过的processConditionalComments,这样注释会在“保留”和“压缩”之间取个平衡。

特殊字符这块还有一个坑:页面中如果大量使用&nbsp;这种HTML实体来控制排版,压缩时若开了decodeEntities(把实体转成字符),你会发现多空格可能被折叠掉或与周围的普通空格合并,最终排版错乱。&nbsp;在HTML语义里是非断行空格,常用在中文缩进和英文排版中,压成真实字符后就不是那么好掌控了。遇到这种页面,我会把“实体解码”选项关掉,让它保持原样。

4.4 问题速查表

症状可能原因处理建议
页面文字粘连、单词中间空格丢失空白折叠误伤文本节点开启“保守空白折叠”,区分文本节点
代码块/文本框内容缩进没了pre/textarea边界未识别检查压缩器的元素排除规则
结构化数据解析失败JSON-LD/script内容被改写对内联JSON单独处理,不参与全局压缩
老浏览器样式错乱条件注释被删除开启processConditionalComments
多空格排版失效实体解码后空格被合并关闭decodeEntities或只用安全模式
TTFB明显上升运行期压缩压垮CPU改为构建期压缩,或加缓存/控制压缩级别

5. 我自己琢磨出来的几句体会

把HTML压缩这件事整套跑下来,我最大的感触是:性能优化这个领域的“边界感”太重要了。JS和CSS压缩,规则是建立在语言规范上的,边界相对清晰;HTML压缩的麻烦之处在于,HTML的容错性极强,很多写法在不同浏览器里都有不同表现,你没办法只靠一个工具、一套配置打天下。

所以我现在做这类优化,基本会遵循三个习惯。第一,永远先出截图对比,再上自动测试,颜值崩了要比体积涨了严重得多。第二,给压缩器配置一个“白名单”思维,哪些区域必须跳过、哪些注释必须保留,提前列清楚,别指望默认规则覆盖所有场景。第三,把HTML压缩放进发布流程里,而不是当成一次性动作,否则线下压得好好的,线上因为模板更新、数据注入又冒出来新问题。

另外我还会顺带做一件事:把HTML压缩生成的体积报告记录成趋势图。每次上线后瞄一眼,如果发现某个版本的HTML体积突然涨了,大概率是模板里多了大段注释或重复结构,能倒逼团队养成清爽的模板编写习惯。这比事后追责有意思多了。

如果你正在做WEB高性能开发,HTML压缩一定要纳入checklist,但也不用一上来就追求“疯狂”的终极模式。先把空白、注释、内联资源压缩这三板斧打好,跑一轮灰度对比,再决定要不要碰属性引号、标签省略、实体解码这些进阶项。稳扎稳打,收益反而最扎实。

相关新闻

PaddleDetection环境搭建全流程:版本选型、安装步骤与常见报错排查

PaddleDetection环境搭建全流程:版本选型、安装步骤与常见报错排查

1. 为什么选择PaddleDetection作为目标检测入门框架目标检测这个方向&#xff0c;很多人第一次接触时都会卡在环境搭建上。不是缺这个库&#xff0c;就是版本对不上&#xff0c;再不然就是CUDA和显卡驱动打架。我自己在带新人和做项目交付的过程中&#xff0c;见过太多人还没开…

2026/10/21 4:36:50 阅读更多 →
电池PACK自动化产线构建与运行逻辑:从节拍计算到智能追溯

电池PACK自动化产线构建与运行逻辑:从节拍计算到智能追溯

电池组PACK自动化产线这两年几乎成了新能源工厂的标配&#xff0c;但真正跑得顺、跑出效益的线并不多。我参与过某新能源制造基地从规划、调试到量产爬坡的全过程&#xff0c;在PACK自动化生产线的构建与运行逻辑上踩了不少坑&#xff0c;也攒下一些一手经验。这篇文章不罗列设…

2026/10/21 4:36:50 阅读更多 →
lingbot-map:机器人空间数据到地图可视化的轻量级实践

lingbot-map:机器人空间数据到地图可视化的轻量级实践

1. 从“lingbot-map”这个名字说起&#xff1a;它到底想解决什么问题第一次看到“lingbot-map”这个项目名&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个把“机器人&#xff08;bot&#xff09;”和“地图&#xff08;map&#xff09;”绑在一起的东西。…

2026/10/21 4:36:50 阅读更多 →

最新新闻

litellm 统一大模型调用中间层:从 SDK 到生产级代理的完整实践

litellm 统一大模型调用中间层:从 SDK 到生产级代理的完整实践

1. 项目概述与核心定位1.1 这个项目到底解决什么问题第一次接触 litellm 是在一个多模型混用的项目里。当时团队同时接入了好几家不同厂商的大模型服务&#xff0c;每家的接口协议、鉴权方式、返回结构都不一样&#xff0c;代码里到处是 if-else 分支&#xff0c;维护起来非常痛…

2026/10/21 5:13:05 阅读更多 →
SSM+Vue构建二手母婴交易系统:从需求到部署全攻略

SSM+Vue构建二手母婴交易系统:从需求到部署全攻略

前阵子帮A同学做毕设调研&#xff0c;他拿到的题目编号就是SSM239&#xff0c;要求做一个二手母婴商品交易系统&#xff0c;技术栈限定在SSM和Vue。当时第一反应是“这又是一个典型的课设级全栈项目”&#xff0c;但真正动手梳理业务之后&#xff0c;我发现这个题目其实比想象中…

2026/10/21 5:13:05 阅读更多 →
技能地图:从零散技能到可迁移专长的系统学习法

技能地图:从零散技能到可迁移专长的系统学习法

这两年我见过太多人打开收藏夹&#xff0c;里面躺着几十个教程链接、上百个"三天学会XX"的视频&#xff0c;但真正能把一项技能练到能用、能赚钱、能解决问题的&#xff0c;少之又少。问题从来不是不努力&#xff0c;而是大多数人把"技能"当成一个孤立的动…

2026/10/21 5:13:05 阅读更多 →
从机械硬盘到NVMe:驱动器十年演进与技术选型

从机械硬盘到NVMe:驱动器十年演进与技术选型

十年前我帮朋友装机&#xff0c;标配是“一块128G固态装系统&#xff0c;一块1T机械盘存数据”。那时候买个固态盘还要犹豫半天&#xff0c;因为它的价格足够买两块大容量机械盘。十年过去&#xff0c;同样的预算能拿到的驱动器&#xff0c;无论是容量、速度还是形态&#xff0…

2026/10/21 5:13:05 阅读更多 →
Kubernetes核心组件原理与生产级运维指南

Kubernetes核心组件原理与生产级运维指南

1. 这不是教科书&#xff0c;是我在三个生产集群里踩出来的Kubernetes组件地图“Kubernetes 核心组件原理梳理&#xff0c;运维必备~”——看到这个标题&#xff0c;你大概率正被某个Pod卡在Pending状态折磨得睡不着&#xff0c;或者刚被值班电话叫醒&#xff0c;被告知Ingress…

2026/10/21 5:13:05 阅读更多 →
Wireshark保存RTP包后变UDP?根因与修复方法详解

Wireshark保存RTP包后变UDP?根因与修复方法详解

你是不是也遇到过这种怪事&#xff1a;用Wireshark抓RTP包&#xff0c;明明实时预览的时候一切正常&#xff0c;顶部协议栏也明明白白写着“RTP”&#xff0c;但只要一保存文件再打开&#xff0c;RTP就变成了光秃秃的UDP。我之前排查一个语音网关的问题时&#xff0c;抓了一百多…

2026/10/21 5:12:04 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →