用Python打造PPT生成工具:Markdown转pptx的架构设计与实现

1. 为什么我要自己动手做一个PPT生成工具

先说说我做这个项目的起因。我在一家中型公司做技术方案相关的工作,平均每周要出三到五份PPT,有的是给客户讲架构,有的是给内部做技术评审,还有的是给管理层做汇报。时间长了就发现一个很尴尬的事实:我花在调格式、对齐文本框、统一字体上的时间,比花在思考内容上的时间还多。一份二十页的方案,内容可能两小时就写完了,但排版能磨掉我一下午。

市面上不是没有工具。在线模板站、AI生成PPT的服务、各种插件我都试过。模板站的问题是模板好看但不好用,改一个地方整个版式就崩;AI生成的服务呢,生成出来的东西乍一看挺唬人,仔细一看全是正确的废话,图表数据对不上,逻辑线也是断的。最关键的是,这些东西都没法跟我已有的工作流打通——我的内容来源是Markdown笔记、代码仓库里的架构图、数据库里导出的表格,每次都要手动搬运,搬完还要重新排版。

所以我就想,能不能做一个工具,让我用写代码的方式写PPT。内容用Markdown写,图表用代码生成,版式用配置文件定义,最后一键编译成pptx文件。这个想法就是ppt-master的雏形。它不是一个面向所有人的通用产品,而是一个面向"内容生产者"的效率工具——你负责把逻辑和内容想清楚,剩下的排版、配色、对齐、页码这些机械劳动,交给程序去做。

这篇文章我会把这个项目的完整思路拆开讲。从为什么选python-pptx而不是别的方案,到怎么设计一套"内容与样式分离"的架构,再到实际写代码时踩过的那些坑。如果你也受够了手动调PPT格式,或者你本身就有编程基础想找个练手项目,这篇内容应该能给你不少参考。

2. 整体设计思路与方案选型

2.1 核心需求拆解:到底要解决什么问题

在动手写第一行代码之前,我花了大概一周时间梳理需求。这个过程很关键,因为如果需求没想清楚,后面写出来的东西大概率是个四不像。我把需求分成了三类:刚性需求、弹性需求和明确不做的需求。

刚性需求是必须满足的,否则这个工具就没有存在意义。第一,输入必须是纯文本格式,我选的是Markdown,因为我的笔记、文档、代码注释全是Markdown,迁移成本最低。第二,输出必须是标准的pptx文件,不能是图片或者PDF,因为客户和同事需要能打开、能编辑。第三,必须支持代码生成图表,因为我大量的数据可视化是用matplotlib和plotly做的,不可能手动截图再贴进去。第四,版式必须可配置,不同场景用不同的模板,但内容文件不用改。

弹性需求是锦上添花的,有更好,没有也能接受。比如自动生成目录页、自动编页码、支持演讲者备注、支持多种配色方案切换。这些功能我会做,但不会为了它们牺牲核心流程的稳定性。

明确不做的需求也很重要。我不做在线编辑器,不做协同功能,不做模板市场。这个工具的定位就是"本地命令行工具",输入Markdown,输出pptx,完事。想在线编辑的用别的工具去,我不跟它们竞争。

这里有个经验:做个人工具最忌讳贪大求全。我见过太多人一开始想做一个"全能平台",结果做了三个月连第一个可用版本都没出来。先把核心链路跑通,哪怕丑一点、功能少一点,只要能解决你最痛的那个点,这个工具就值得做下去。

2.2 技术选型:为什么是python-pptx

技术选型这块我对比了三个方案,最后选了python-pptx。下面这张表是我当时的对比记录,你可以参考。

方案优势劣势适用场景
python-pptx直接操作pptx底层XML,控制粒度细,纯Python生态文档一般,复杂版式需要手写XML需要精细控制、批量生成
调用Office COM接口功能最全,能调用PowerPoint所有能力依赖Windows和Office安装,速度慢,不稳定Windows环境下的自动化
生成HTML再转PPT前端生态丰富,样式好写转换过程失真严重,pptx可编辑性差对可编辑性要求不高的场景

选python-pptx的核心理由是"可控"。它本质上是在操作pptx文件的XML结构,虽然写起来啰嗦一点,但每一个元素的位置、大小、样式你都能精确控制。而且它是纯Python库,不依赖任何外部软件,在Linux服务器上也能跑,这对后续做自动化流水线很重要。

COM接口方案我试过,在Windows上确实能调用PowerPoint的全部功能,但问题是它太慢了。生成一份二十页的PPT要十几秒,而且偶尔会卡死。更麻烦的是它没法在CI/CD环境里跑,因为服务器上不会装Office。HTML转换方案我也试过,用了一些开源库,但转换出来的pptx在PowerPoint里打开经常错位,客户看到这种文件会直接质疑你的专业度。

2.3 架构设计:内容、样式、渲染三层分离

架构上我采用了经典的三层分离:内容层、样式层、渲染层。这个设计不是拍脑袋想的,而是被实际需求逼出来的。

内容层就是Markdown文件。我用自定义的Markdown扩展语法来标记PPT的结构,比如用---分隔每一页,用#标记页面标题,用##标记小节标题,用特殊的代码块标记图表。这样写出来的内容文件非常干净,就是纯文本,用任何编辑器都能改。

样式层是YAML配置文件。里面定义了配色方案、字体、字号、页边距、标题位置、页码格式等等。一份内容文件可以配多份样式文件,比如"客户版"用蓝色系、"内部版"用灰色系,切换样式只需要改一个命令行参数。

渲染层就是Python代码,负责解析Markdown、读取样式配置、调用python-pptx生成最终的pptx文件。这一层是纯逻辑,不包含任何硬编码的样式信息。

这么分的好处是,改样式不用动内容,改内容不用动代码。我后来给不同客户做方案,内容文件复用率能达到百分之七八十,只需要换样式配置和替换部分数据就行。如果当初把样式写死在代码里,每次都要改代码,那这个工具就白做了。

3. 核心细节解析与实操要点

3.1 Markdown扩展语法设计:怎么让纯文本表达PPT结构

标准Markdown没有"分页"的概念,所以第一件事就是设计一套扩展语法。我的设计原则是:能用标准语法的就用标准语法,实在表达不了的才加新标记。

分页用---,这个在Markdown里本来就是分隔线,语义上也算契合。页面标题用一级标题#,小节标题用二级标题##,正文就是普通段落。图表用代码块,在代码块的语言标记里指定图表类型,比如chart-bar、chart-line、chart-pie。

# 系统架构总览 这是本页的正文内容,支持**加粗**和*斜体*。 ## 核心模块 - 接入层:负责协议解析和流量分发 - 逻辑层:处理业务规则和状态管理 - 存储层:负责数据持久化和缓存 ```chart-bar title: 各模块响应时间对比 data: 接入层:120, 逻辑层:340, 存储层:85 unit: ms
上面这段Markdown会被解析成:一个标题为"系统架构总览"的页面,包含一段正文、一个二级标题、一个无序列表、一个柱状图。整个文件读起来就是一份结构清晰的文档,即使不用工具渲染,直接看Markdown也能看懂内容。 > 设计扩展语法的时候有个坑要注意:不要发明太多新标记。我一开始设计了十几种标记,结果自己都记不住,写内容的时候还要翻文档。后来砍到只剩三种:分页符、图表代码块、备注标记。其他的全部用标准Markdown表达。工具是给人用的,语法越简单越好。 ### 3.2 样式配置系统:一份YAML管所有视觉 样式配置我用YAML写,因为YAML比JSON好读,支持注释,手写不容易出错。配置结构分成全局配置和元素配置两块。 全局配置管的是整份PPT的基调,包括画布尺寸、主色调、辅助色、字体族、默认字号。元素配置管的是具体元素,比如标题、正文、列表、图表、页码各自的位置和样式。 ```yaml global: slide_width: 13.333 # 16:9 英寸 slide_height: 7.5 primary_color: "#1F4E79" secondary_color: "#2E75B6" accent_color: "#ED7D31" font_family: "微软雅黑" base_font_size: 18 title: top: 0.5 left: 0.8 width: 11.7 height: 1.0 font_size: 32 bold: true color: primary body: top: 1.8 left: 0.8 width: 11.7 height: 4.5 font_size: 18 line_spacing: 1.5 page_number: bottom: 0.3 right: 0.5 font_size: 12 color: secondary

这里有个细节值得说:尺寸单位我统一用英寸,因为python-pptx内部就是用英制单位的。虽然国内做PPT习惯用厘米,但转换来转换去容易出错,不如一开始就用英寸。16:9的宽屏尺寸是13.333乘7.5英寸,这个数字要记牢,很多版式计算都基于它。

颜色我用十六进制字符串,解析的时候转成RGBColor对象。字体族我默认用"微软雅黑",因为它在Windows上兼容性最好。如果要在Mac上跑,可以改成"苹方",但要注意字体缺失的问题——如果目标机器上没有配置的字体,PowerPoint会回退到默认字体,版式可能会乱。

3.3 图表生成管线:从数据到图片再到幻灯片

图表这块是整个项目里技术含量最高的部分。我的方案是:用matplotlib生成图片,保存到临时目录,然后作为图片插入到幻灯片里。为什么不直接用python-pptx的原生图表功能?因为原生图表样式太丑,而且定制起来非常麻烦,不如用matplotlib画好了再贴进去。

流程是这样的:解析代码块里的数据,根据图表类型调用对应的绘图函数,设置好样式(配色、字体、尺寸),保存成PNG,然后计算图片在幻灯片上的位置和大小,插入进去。

import matplotlib.pyplot as plt import matplotlib matplotlib.use('Agg') # 无界面后端,服务器环境必须 def render_bar_chart(data, config, output_path): fig, ax = plt.subplots(figsize=(8, 4.5), dpi=150) labels = list(data.keys()) values = list(data.values()) bars = ax.bar(labels, values, color=config['primary_color']) ax.set_ylabel(config.get('unit', '')) ax.set_title(config.get('title', '')) # 去掉顶部和右侧边框,视觉上更干净 ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) # 在柱子上标注数值 for bar, value in zip(bars, values): ax.text(bar.get_x() + bar.get_width()/2, bar.get_height(), str(value), ha='center', va='bottom') plt.tight_layout() fig.savefig(output_path, transparent=True) plt.close(fig)

这里有几个实操要点。第一,matplotlib.use('Agg')必须加,否则在没有显示器的服务器上会报错。第二,transparent=True让图片背景透明,这样能跟幻灯片的背景色融合,不会出现一个白色方块。第三,dpi设成150就够了,太高会让文件变大,太低会模糊。第四,plt.close(fig)一定要调用,否则内存会泄漏,生成几十页PPT之后可能就崩了。

图片插入幻灯片的时候,位置和大小要按比例计算。假设幻灯片宽13.333英寸,左右边距各0.8英寸,那么可用宽度是11.733英寸。图片原始宽高比是8比4.5,那么插入宽度就是11.733,高度是11.733乘以4.5除以8,约等于6.6英寸。如果这个高度超过了可用高度,就要反过来按高度算宽度。这个计算逻辑我封装成了一个函数,所有图表都走这个函数,保证版式统一。

4. 实操过程与核心环节实现

4.1 环境搭建与依赖安装

环境搭建这块没什么特别的,Python 3.8以上就行。我建议用虚拟环境,避免跟系统里的其他包冲突。

python -m venv venv source venv/bin/activate # Windows下是 venv\Scripts\activate pip install python-pptx matplotlib pyyaml markdown

四个核心依赖:python-pptx负责生成PPT,matplotlib负责画图,pyyaml负责读配置,markdown负责把Markdown文本转成HTML片段(方便处理加粗、斜体这些行内格式)。

版本上有个坑:python-pptx在0.6.18之前的版本对图片插入的支持有bug,插入的图片位置会偏移。建议直接装最新版,我写这篇文章时用的是0.6.21,实测稳定。matplotlib建议用3.5以上,低版本在透明背景处理上有些问题。

4.2 解析器实现:把Markdown拆成页面对象

解析器的任务是把一个Markdown文件拆成一个页面列表,每个页面包含标题、内容块列表、图表列表、备注。我定义了一个简单的数据结构来表示。

class Slide: def __init__(self): self.title = "" self.blocks = [] # 正文块,每个块有类型和内容 self.charts = [] # 图表列表 self.notes = "" # 演讲者备注 class Block: def __init__(self, block_type, content): self.type = block_type # paragraph, list, heading self.content = content

解析流程分三步。第一步按---切分,得到每一页的原始文本。第二步对每一页,提取一级标题作为页面标题,提取代码块作为图表,剩下的按行解析成正文块。第三步处理行内格式,把**加粗**和*斜体*转成对应的格式标记。

这里有个细节:列表的解析要小心。Markdown的列表可以嵌套,可以有多级。我一开始用简单的行匹配,结果遇到嵌套列表就乱了。后来改成用状态机,记录当前的缩进层级,遇到缩进增加就开一个新的子列表。虽然代码复杂了一点,但稳定性好了很多。

4.3 渲染器实现:从页面对象到pptx

渲染器是核心中的核心,我把它拆成了几个独立的函数,每个函数负责一类元素的渲染。

from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN def create_presentation(config): prs = Presentation() prs.slide_width = Inches(config['global']['slide_width']) prs.slide_height = Inches(config['global']['slide_height']) return prs def add_slide(prs, layout_index=6): # layout_index 6 是空白版式,不带任何占位符 return prs.slides.add_slide(prs.slide_layouts[layout_index]) def add_title(slide, text, config): left = Inches(config['title']['left']) top = Inches(config['title']['top']) width = Inches(config['title']['width']) height = Inches(config['title']['height']) txBox = slide.shapes.add_textbox(left, top, width, height) tf = txBox.text_frame tf.word_wrap = True p = tf.paragraphs[0] p.text = text p.font.size = Pt(config['title']['font_size']) p.font.bold = config['title']['bold'] p.font.color.rgb = RGBColor.from_string(config['title']['color'].lstrip('#')) p.font.name = config['global']['font_family']

版式索引这里要说明一下。python-pptx默认的模板有11种版式,索引6是"空白",不带任何占位符。我强烈建议用空白版式,然后所有元素都用add_textbox手动添加。为什么?因为占位符的位置和样式受母版控制,改起来很麻烦,而且不同版本的PowerPoint对占位符的处理有差异。手动添加虽然代码多一点,但完全可控,不会出现"在我电脑上好好的,到客户电脑上就错位"的情况。

正文渲染要处理多种块类型。段落直接加文本框,列表要逐项添加并设置项目符号,加粗和斜体要拆成多个run来设置格式。这里有个性能上的注意点:每添加一个文本框都会增加文件大小和渲染时间,所以能合并的尽量合并。比如一个列表的所有项,我放在同一个文本框里,用不同的段落来表示,而不是每项一个文本框。

4.4 完整生成流程与命令行接口

把上面这些串起来,就是一个完整的生成流程。我给它加了一个简单的命令行接口,用argparse实现。

import argparse def main(): parser = argparse.ArgumentParser(description='ppt-master: Markdown转PPT工具') parser.add_argument('input', help='输入的Markdown文件路径') parser.add_argument('-s', '--style', default='default.yaml', help='样式配置文件') parser.add_argument('-o', '--output', default='output.pptx', help='输出的pptx文件路径') args = parser.parse_args() config = load_config(args.style) slides = parse_markdown(args.input) prs = create_presentation(config) for slide_data in slides: slide = add_slide(prs) add_title(slide, slide_data.title, config) render_blocks(slide, slide_data.blocks, config) render_charts(slide, slide_data.charts, config) add_page_number(slide, config) prs.save(args.output) print(f'生成完成: {args.output}')

用起来就是一行命令:python ppt_master.py 方案.md -s 客户版.yaml -o 方案.pptx。从Markdown到pptx,全程不需要打开PowerPoint。

实测下来,一份三十页、带八个图表的PPT,生成时间在四秒左右。其中图表渲染占了三秒,pptx组装占了一秒。这个速度完全可以接受,比手动排版快了几十倍。

5. 常见问题与排查技巧实录

5.1 字体与中文显示问题

中文显示是这类工具最容易翻车的地方。我踩过的坑包括:生成的PPT在别人电脑上字体变了、中文变成方框、加粗失效。

根本原因是字体嵌入问题。python-pptx不支持嵌入字体,它只是在XML里指定字体名称。如果目标机器上没有这个字体,PowerPoint会回退到默认字体。解决方案有两个:一是用系统自带字体,比如"微软雅黑"在Windows上基本都有;二是如果必须用特殊字体,在交付的时候把字体文件一起给客户,让他们先安装。

中文变方框通常是matplotlib的问题。matplotlib默认字体不支持中文,画出来的图表里中文全是方框。解决办法是在绘图前设置中文字体。

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei'] plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题

axes.unicode_minus这行一定要加,否则负号会显示成方框。这个坑我找了半天才找到原因。

5.2 图片位置偏移与尺寸失真

图片插入位置偏移是python-pptx的一个经典问题。表现是:你明明设置了left和top,但图片就是偏了一点。原因通常是图片的DPI信息跟python-pptx的计算方式不一致。

解决方案是插入图片时显式指定width和height,不要让python-pptx自动计算。我封装了一个函数,根据可用区域和图片宽高比计算最终的插入尺寸。

def calculate_image_size(img_path, max_width, max_height): from PIL import Image with Image.open(img_path) as img: img_ratio = img.width / img.height if max_width / max_height > img_ratio: # 高度受限 height = max_height width = height * img_ratio else: # 宽度受限 width = max_width height = width / img_ratio return width, height

这样算出来的尺寸保证图片完整显示在可用区域内,不会溢出也不会留太多空白。

5.3 生成速度优化与内存管理

生成大量页面时,速度和内存是两个要关注的点。我做过一次压力测试,生成一百页带图表的PPT,初始版本用了将近一分钟,内存峰值到了800MB。

优化手段有三个。第一,图表图片用完后立即删除,不要留在临时目录里。第二,matplotlib的figure对象用完必须close,否则会累积在内存里。第三,如果图表很多,可以考虑用多进程并行渲染,但要注意matplotlib在多进程下的线程安全问题。

优化之后,一百页的生成时间降到了十五秒左右,内存峰值控制在200MB以内。对于日常使用来说完全够用了。

下面这张表是我整理的问题速查表,遇到问题可以先在这里找找。

问题现象可能原因解决方案
中文显示为方框matplotlib字体未设置设置font.sans-serif为中文字体
图片位置偏移DPI信息不一致显式指定width和height
生成速度慢图表重复渲染缓存已渲染的图表图片
内存占用高figure未关闭每次绘图后调用plt.close()
字体在别人电脑上变了字体未安装使用系统通用字体或随文件分发字体
列表层级错乱解析器不支持嵌套用状态机处理缩进层级

最后分享一个排查技巧:如果生成的PPT有问题,先把中间产物保留下来。我通常会在临时目录里保留生成的图表图片和解析后的页面对象JSON,出问题的时候直接看这些中间产物,比在代码里打断点快得多。

这个工具我用了大半年,迭代了十几个版本,现在基本能覆盖我百分之九十的PPT需求。它不完美,比如还不支持表格和SmartArt,动画效果也做不了。但对我来说,它把最耗时的排版工作自动化了,让我能把精力集中在内容本身。如果你也有类似的需求,建议从最简单的版本开始,先跑通"Markdown到pptx"这条链路,然后再慢慢加功能。工具是长出来的,不是设计出来的。

相关新闻

AI生产力全链路:数据、模型与工程三位一体落地方案

AI生产力全链路:数据、模型与工程三位一体落地方案

“三位一体”这个词在AI圈被说得有点烂了,但真正能讲清楚、能落地的方案并不多。我最近在梳理一个叫 Joker AIx 的全链路方案,越做越觉得它其实代表了一种趋势,核心就是围绕数据、模型、工程这三根支柱,把AI生产力这件事从头到尾串…

2026/10/20 5:43:15 阅读更多 →
OpenSSL证书实战:从自签名到私有CA搭建与信任配置

OpenSSL证书实战:从自签名到私有CA搭建与信任配置

先看浏览器地址栏里的小锁图标,再看那些打着“不受信任”警告的自签名证书页面。很多人在内网部署系统、做联调、跑测试环境时,就是用OpenSSL随手生成一个证书顶着用,结果要么被浏览器拦得死死的,要么被同事吐槽“就这&#xff1f…

2026/10/20 5:43:15 阅读更多 →
主动式AI驱动服务器支持:从故障响应到预测性维护的服务升级

主动式AI驱动服务器支持:从故障响应到预测性维护的服务升级

“永不停机”这四个字放在过去,基本属于销售话术。但这次认真看了联想这套 Premier Support Plus 服务之后,我得承认,底层的逻辑确实变了:服务器支持从“等用户打电话说坏了再响应”,变成了“用主动式 AI 提前发现问题…

2026/10/20 5:43:15 阅读更多 →

最新新闻

artcraft类创作工具技术架构与交互设计实战指南

artcraft类创作工具技术架构与交互设计实战指南

1. 从"artcraft"这个名字说起:一个被低估的创作工具定位问题第一次看到"artcraft"这个词,我脑子里蹦出来的第一反应是"艺术"加"手艺"的组合。这不是一个随便拼出来的名字,它暗示了一种很具体的产品气…

2026/10/20 6:27:33 阅读更多 →
从自由发挥到受控执行:大模型Skill机制实战

从自由发挥到受控执行:大模型Skill机制实战

1. 先弄明白:Skill到底解决的是什么问题1.1 大模型能力的边界在哪里如果你用过几款主流的大模型对话工具,就会发现一个奇怪的现象:让模型帮你"解释一段代码""写个正则表达式"很容易,但让它"按团队规范自…

2026/10/20 6:27:33 阅读更多 →
JavaFX+SSM架构实战:桌面客户端与数据服务端的高效整合

JavaFX+SSM架构实战:桌面客户端与数据服务端的高效整合

简介:这是一份融合 JavaFX 与 SSM 框架的 ERP 系统完整项目,面向需要将桌面 GUI 与企业级后端整合开发的 Java 学习者、毕业设计或项目实战人群,既能学习界面设计,也能掌握经典后端框架的落地方式。资源共包含 2 个文件&#xff1…

2026/10/20 6:27:33 阅读更多 →
Python与API文本分析实战:从文本清洗到工程化部署

Python与API文本分析实战:从文本清洗到工程化部署

AI应用的潜力,有一大半藏在文本里。文本分析这个方向,我自己前前后后折腾过不少方案,从早期的正则规则、词频统计,到开源模型微调,再到现在用 Python 接各类大模型 API 做文本分析,最大的感受是&#xff1a…

2026/10/20 6:27:33 阅读更多 →
IPv4报文头部详解:字段、分片与网络排查核心知识

IPv4报文头部详解:字段、分片与网络排查核心知识

做网络排查做得久了,你会发现一个特别有意思的现象:很多人能把TCP的三次握手、四次挥手讲得天花乱坠,可一旦你把抓包工具里的一帧数据展开,让他逐字节解释一下IPv4头部,他反而会卡壳。TCP、UDP这些传输层协议太出名&am…

2026/10/20 6:27:33 阅读更多 →
STM32 bxCAN实战:从物理层到过滤器配置与调试排障

STM32 bxCAN实战:从物理层到过滤器配置与调试排障

做嵌入式这几年,UART、I2C、SPI都是老朋友,但真正让我觉得“像个通信工程师”的,是开始啃STM32的CAN外设之后。原因很简单:在汽车、机器人和工业现场,CAN总线是默认的“老大哥”,而它在微控制器上的硬件实现…

2026/10/20 6:26:33 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* 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 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* 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 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* 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 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →