特效歌词如何随音乐律动
给博客播放器做的 AI 特效歌词,蓝色、放大、抖动各自为政,跟歌曲节奏完全脱钩。于是把《信号与系统》搬了进来:一行歌词的上浮当成二阶系统的阶跃响应,只调阻尼比和无阻尼自然频率,就能决定它弹一下还是稳稳浮上来。节拍这边,把检测出的拍点看作加权冲激串,和每种特效的冲激响应做 卷积,强度就随鼓点疏密自己起伏。拍长检测还受八度歧义困扰,改用梳状谐波求和后,39 例合成鼓点的完全正确率从 54% 升到 69%。
给博客播放器做的 AI 特效歌词,蓝色、放大、抖动各自为政,跟歌曲节奏完全脱钩。于是把《信号与系统》搬了进来:一行歌词的上浮当成二阶系统的阶跃响应,只调阻尼比和无阻尼自然频率,就能决定它弹一下还是稳稳浮上来。节拍这边,把检测出的拍点看作加权冲激串,和每种特效的冲激响应做 卷积,强度就随鼓点疏密自己起伏。拍长检测还受八度歧义困扰,改用梳状谐波求和后,39 例合成鼓点的完全正确率从 54% 升到 69%。
网页文字最亮只能到 #fff,HDR 图片却能更亮。办法是实时生成一张 HDR 纯色图铺在文字背后,用 background-clip: text 按字形裁剪,做出亮到 20 倍的点题歌词。粒子动画画在 float16 的 2D 草稿纸上,每帧复制给 WebGPU canvas 显示,实测 M5 上仍是 120 帧。踩坑两处:高潮句只换了亮图没裁剪,唱完消散的一秒闪出大白块;Safari 把恰好 1×1 的图片当纯色画掉、跳过 HDR 分支,换成 2×2 才亮。
10 月 22 日到 30 日给博客提交了一百八十多个 commit。编辑器先画原型再重写,加了版本历史和内容组件;AI 摘要、帮写、润色和 MCP 服务都只给建议、只写草稿,拍板留给自己;音乐播放器重写成沉浸式页面,多来源逐字歌词按质量选择,AI 只挑词、选特效,不碰时间轴。另外重做了前台设计、修了一轮安全问题,补上分享图、访客记录等功能。
校内 App 想复用掌上重邮登录,但掌邮没实现 OIDC Provider。Misskey 的 OAuth2 要把应用元数据写成网页、拿该 URL 当 client_id,卡在 invalid redirect_uri 后放弃。改用两步的 MiAuth:服务端生成 session 拼成认证链接,回调后请求 check 接口换 token 和用户 id。neo-blog 支持 oidc_config 的 type 设为 misskey,但缺 client_secret 校验,安全性存疑。
neo-blog 的 OIDC 登录被一个空字符串击穿,任何用 GitHub 登录的用户都会直接落到第一个绑定 GitHub 的管理员账户上,能发文章、传图。GitHub 走的是 OAuth2,issuer、sub、email 返回空值,结构体绑定后变成空字符串,而代码第一步就用 issuer+sub 查绑定记录,空 sub 正好命中管理员那条。修复分三层:用户信息端点做空值校验并把 GitHub 的 id 映射为 sub,数据库查询函数对空参数直接返回未找到,登录接口新增 is_bind 参数区分绑定与登录。反思集中在对认证方字段差异、空值健壮性和兼容性测试的忽视。
neo-blog 用 OAuth2 单点登录统一认证,让「轻雪」旗下业务共享用户数据,覆盖博主后台和访客互动两类场景。评论没有接 Disqus、Gitalk,也没拆成微服务,而是集成进博客本体,避免小项目多一条链路。内容侧同时输出 RSS 与 Sitemap,编辑器从 mdx-editor 迁到 tiptap,部分会员组件续费太贵。国际化默认选用 next-intl,只是 VS Code 的 i18n 插件还没兼容,多语言字段只能手工维护、没有智能提示。
从 WordPress 到 VuePress、VitePress 再到 Halo,博客换了几轮,每次都卡在同一处:静态站点没有服务端,模板化的系统又没法在不侵入的前提下加自己的小组件,于是干脆自己写一个。前端用 Next.js,部分页面靠 React 服务端渲染优化 SEO。后端是 cloudwego/hertz,数据库同时支持 sqlite 和 postgres,组件库选 shadcn。neo-blog 的基础功能已经跑通,容器化部署在自己的轻雪云上,接下来会把旧文章迁过来。