Hexo 本地源码丢了以后,我是怎么把博客救回来的
这次整理博客的起点有点狼狈:网站还能打开,GitHub 仓库也在,但原来的 Hexo 本地工程找不到了。 仓库里留下的不是 Markdown,而是一堆已经生成好的 HTML、CSS 和 JavaScript。换句话说,房子还在,图纸没了。文章在网页上都能看,可我没法正常修改,也没法继续用 Hexo 写新文章。 好在静态网页并不是完全没用。只要文章发布过,正文、标题、日期、标签、分类这些信息大多还藏在 HTML 里。这次折腾下来,我把原来的文章重新整理成了一个能安装、能生成、能本地预览,也能继续发布的 Hexo 工程。 先别动远端刚开始最应该做的事不是重装 Hexo,而是把还活着的静态站点完整留一份。 我把项目拆成了两个目录: 123BLOG/├── hexo-old-web/ # 从 GitHub 拉下来的旧网页└── hexo-source/ # 重新恢复的 Hexo 工程 hexo-old-web 就当现场备份,不在里面直接改东西。后面的解析和转换全部输出到 hexo-source。这样即使恢复脚本写坏了,也不会把仅剩的一份网页覆盖掉。 当时如果直接在原仓库里...
从子带 LSTM 到 SpatialNet:西湖大学多通道语音增强路线
这条路线可以先抓住一个问题:多麦克风录音里有空间信息,神经网络应该怎样用它? 西湖大学李晓飞老师相关工作的主线不是绕开信号处理,而是保留 STFT 这个坐标系。固定一个频率 f,模型看到的是不同时间、不同麦克风上的复数观测: X1(t,f), X2(t,f), …, XM(t,f) M 是麦克风数,t 是时间帧。传统多通道方法经常按频率估计相位差、协方差矩阵或空间滤波器;窄带深度学习沿用这个观察方式,只是把手工规则换成网络学习。 阅读这条路线时,不要只记模型名字。每篇论文都可以按同一组问题读: 它解决的是降噪、分离、去混响,还是联合增强? 输入是单通道还是多通道?是波形还是 STFT? 网络主要在时间、频率、通道、空间哪几个维度上建模? 输出是 mask、复数谱,还是空间滤波器? 训练时怎样处理多说话人排列问题? 下面按时间线展开。中间会插入一篇 Conformer 背景论文,因为 NBC/NBC2 的结构需要先理解这个骨干。 阅读前先统一流程深度学习语音增强和分离通常可以放进这条流水线: 1Input -> Encoder -> Separato...
语音增强基础:从鸡尾酒问题到多通道空间滤波
上一份材料把声音讲成了数字波形和 STFT。现在回到会议录音本身:麦克风录到的不是“一个说话人一条轨道”,而是同一时刻所有声源在麦克风位置的叠加结果。 人耳在现场能把注意力集中到某个说话人身上。麦克风没有这种能力。它保存的是混合声音: x[n]=s1[n]+s2[n]+noise[n]+reverb[n] 这个式子只是一个简化版本。它的意思是:混合录音 x[n] 里可能有第一个说话人 s1[n]、第二个说话人 s2[n]、非语音噪声 noise[n],也有房间反射造成的混响 reverb[n]。 鸡尾酒问题鸡尾酒问题指的是多人同时说话时,系统要从混合录音中恢复目标声音。这个名字来自聚会或餐厅的场景:周围很多人都在说话,但你仍然想听清某一个人。 在语音处理里,这个问题常常出现在: 场景 录音里混进了什么 会议录音 多人重叠说话、投影仪或空调噪声、房间反射 远程课堂 老师声音、学生提问、键盘声、网络设备噪声 车内通话 驾驶员、副驾驶、路噪、发动机声 智能音箱 用户声音、电视声、音乐、房间混响 难点在于,模型只有混合输入。训练时可以拿到干净参考,部署...
语音基础:从采样到 STFT
小组会议录音常常不清楚。桌上的麦克风不会知道谁是主讲人,也不会自动把旁边人的声音、空调声、房间回声分开。它只记录一个位置上的空气振动。回放时听到的混乱,已经被写进了同一条波形。 下面这段 WHAMR 样例 136 会贯穿前两份材料。WHAMR 是一个常用于语音分离研究的数据集,混合语音里带有噪声和混响。图中横轴是时间,纵轴是采样值。波形离 0 越远,表示这一刻记录到的振动越强。 这条波形看起来只是一串上下起伏的曲线。对电脑来说,它确实也只是一串数字。要理解语音增强和分离,第一步不是先看神经网络,而是先弄清楚:声音是什么,麦克风怎样把声音变成数字,为什么研究里常把波形变成 STFT。 声音是什么声音是空气压力随时间的变化。人说话时,声带振动,气流经过口腔、舌头、牙齿和鼻腔后形成不同声音。这个振动会让周围空气一会儿被压紧,一会儿变稀。压力变化传到耳朵,我们听见声音;传到麦克风,麦克风把它转换成电信号。 几个词先讲清楚: 概念 先这样理解 在波形里怎么看 振动 空气压力反复变大、变小 曲线围绕 0 上下摆动 幅度 振动强弱,常和响度有关 曲线离 0 越远,幅度越大 ...
MathType 提示“没有公式被发现”:一次 OMML2MML.XSL 排错记录
最近处理 Word 公式排版时,我一直在用这样一套流程: 12345大模型生成公式代码-> 使用 pasteMD 渲染-> 粘贴到 docx,生成 Word 原生公式-> 使用 MathType 批量转换-> 保存为 doc 这样处理的好处是,保存到旧版 doc 格式后,公式仍然可以编辑,而不是变成一张张图片。之前这套流程一直能用,直到有一次 MathType 突然识别不到文档里的公式。 问题现象文档里的公式能被 Word 正常显示,也确实是 Word 原生公式。但在 MathType 的“转换公式”功能中执行批量转换时,程序直接提示: 没有公式被发现和/或更新。 一开始我把注意力放在文档本身,怀疑是文件损坏、公式格式不对,或者 MathType 出了 Bug。让大模型协助排查时,得到的判断也基本围绕这些方向,但重新建立文档和调整常规设置都没有解决问题。 后来看到有人提到 OMML2MML.XSL,再对照 WIRIS 的官方说明,才找到真正值得检查的地方。 OMML2MML.XSL 是做什么的Word 2007 之后的原生公式使用 OM...
CAD_Converter:从图纸转换到 AI 分析的工程实践
CAD_Converter 是我参与设计和构建的一套 CAD 图纸处理工具。仓库目前是私有的,这里只记录可以公开的技术方案,不涉及内部图纸、模型配置和接口信息。 这个仓库要解决什么问题项目面对的不是单纯的格式转换,而是一批来源、版本和绘图习惯都不统一的工程图纸。使用者需要先把 DWG 转成可处理的 DXF,再按规则清理图层、文字和颜色,最后导出 PNG、PDF 或 SVG。部分图纸还要继续交给视觉模型分析,从中提取设备与连接关系,并把识别结果标回图中。 如果这些步骤各自做成零散脚本,每换一张图就要手动搬文件、改参数,也很难知道失败发生在哪一步。因此我想把它做成一套有界面、能批量运行、能记录进度,也可以直接打包交付的完整工具。 我采用的整体方案我把仓库分成入口、核心能力、界面页面和交付脚本几层。 src/main.py 负责启动 Qt 应用和处理运行期消息;src/gui/main_window.py 组织主窗口,并把功能拆成“格式转换”“图纸清理”“AI 分析”三个页面。页面只负责收集参数、展示预览和反馈任务状态,真正的处理逻辑放在 src/core。 核心层继续分工:dwg_c...
AI_Psyc_Project:用实时多模态对话完成心理测评
AI_Psyc_Project 是一个私有 Fork 项目。上游提供了最初的项目基础,我参与了当前应用的整体构建设计,并继续完成本地模型、实时会话、认证、进度和报告等部分的整合。 如果只把它理解成一个带语音输入的聊天网页,会漏掉这个项目真正想做的事。产品体验上,我希望它接近 GPT Live 或豆包电话:用户不用对着一张问卷逐项选择,而是通过连续的语音和视频对话完成心理测评。系统既要听懂说了什么,也要结合画面、语气和上下文决定下一轮怎么问,最后把整段会话整理成结构化结果。 这里不展开业务数据、测评量表、私有提示词和模型配置,只记录我怎样把多模态模型做成一套可以运行的应用。 从聊天框改成一次完整的测评会话普通聊天应用只需要维护消息列表。实时心理测评还要处理麦克风、摄像头、语音播放、测评轮次、进度和报告状态。用户可能打断模型,也可能在模型说话时继续输入;网络中断后,页面不能把已经完成的轮次当成没发生过。 我把一次测评看成一条连续的数据链路: flowchart LR A["浏览器:语音、视频与文字"] <--> B["Next.js ...
AmbientCarLight:从图片取色到 Art-Net 车载氛围灯控制
本科阶段做车辆氛围灯项目时,我想解决的不是“在手机上选一个颜色”,而是让灯光能跟着用户喜欢的画面变化。用户可以从相册、相机或系统壁纸中选图,应用提取其中的主色,再把这些颜色分配到车内 LED 灯带上。 我把它做成了一套 Android 应用:Kotlin 负责业务逻辑,Jetpack Compose 负责界面,颜色提取在手机本地完成,最后通过 Art-Net 协议直接控制灯光设备。 从一张图片到一条灯带整个流程可以概括为: flowchart LR A["相册 / 相机 / 系统壁纸"] --> B["图片缩放与取色"] B --> C["Palette 或 K-Means"] C --> D["亮度、饱和度与互补色处理"] D --> E["LED 颜色插值"] E --> F["Art-Net DMX 数据包"] F --> G["车内 LED 控制器"]...
航天干扰仿真自动化:从参数录入、截图识别到报告生成
这套航天仿真自动化程序,是我本科阶段写过体量最大的一组桌面自动化脚本。原来的工作需要从 Word 里找轨道、频段、地球站和链路参数,再逐项填进 Visualyse,等待仿真完成后截图、抄数、画图,最后把结果放进固定格式的报告。 单次操作并不难,难的是对象一多,重复点击和复制就会占掉大量时间,而且任何一处填错都会传到最终报告。我没有把它写成一个几千行的单体脚本,而是拆成参数整理、软件填写、结果截图、OCR、绘图和报告生成几组工具。 整条流水线flowchart TD A["原始 Word 参数文档"] --> B["结构解析与分单元整理"] B --> C["轨道 / 频段 / 地球站 / 链路 Excel"] C --> D["Visualyse GUI 自动填写"] D --> E["运行仿真并批量截图"] E --> F["PaddleOCR 提取最坏值与时长"] D -->...
我怎样制作软件使用教程:键鼠显示、鼠标缩放和自动截图
之前为了教新生使用我写的自动化程序,我需要录一套软件教程。真正开始做以后才发现,普通录屏只能把画面录下来,却不一定能把操作讲清楚:鼠标指针太小,快捷键没有提示,界面上的文字一缩就看不见。要是改做图文教程,几十张截图又得一张张截、一张张标。 我在论坛和 GitHub 上找了一圈,最后把需求拆成了三件事:显示键鼠操作、让录制画面跟随鼠标缩放,以及自动记录每一步操作。下面是我试过的工具和目前仍在使用的组合。 把键鼠操作显示出来直接用 keyviz如果不想折腾 OBS,我最推荐 keyviz。安装后就能把按键和鼠标点击显示在屏幕上,位置、颜色、大小和动画都可以调整。 它的优点是简单,开着就能用,平时做演示也方便。它采用屏幕顶层渲染,因此提示会同时出现在我自己的屏幕上。部分全屏程序可能把覆盖层挡住,遇到这种情况就需要换成 OBS 内部叠加。 同类工具还有 Carnac、KeyCastOW、Screenkey 和 KeyPress OSD。Carnac 与 KeyCastOW 更适合 Windows,Screenkey 主要面向 Linux。它们解决的是同一个问题,选一个在自己的系统上...




