语音FFT变换详解:分帧、加窗、频谱泄漏与Python实现
拿到一段语音最先做的往往不是“听”而是把它丢进傅里叶变换里看看这个声音到底由哪些频率成分构成。语音信号分析里的FFT变换过程本质上就是回答一个很基础但又绕不开的问题这段声音里低频、中频、高频各自有多强它们随时间是怎么变化的。今天我把整个流程掰开揉碎讲一遍从参数怎么定到代码怎么写再到那些文档里不会写的坑一次说清楚。整个流程看着不复杂但真正动手做的时候采样率、帧长、窗函数、补零、归一化这些细节掺在一起很容易出一堆“看起来有点奇怪”的结果。这篇文章适合刚接触语音信号分析的读者也适合已经写了几天脚本但对频谱图细节没把握的朋友。我会用Python配合几个常用库把从wav文件到语谱图的完整链路走一遍每一处关键选择都会解释原因。1. FFT在语音分析里的定位时域看不出来的事换到频域就清楚了1.1 为什么光看波形不够语音的时域波形反映的是声压随时间的变化直接看能看到振幅起伏看到静音段和发声段但看不到“音调是什么”“这个音是元音还是辅音”“噪声是从哪个频率带进来的”。举一个实际例子某段录音里混着50Hz的工频干扰如果用耳朵听很多时候背景里多了一点“嗡嗡”声并不明显但画幅频谱图50Hz处一根很扎眼的谱线就直接暴露了问题后续做陷波滤波也有了明确目标。再看基频检测时域里做自相关虽然也能估周期但遇到清音段或低信噪比的情况很容易崩而FFT之后找基频峰值配合频域平滑稳定性和可解释性都会好很多。语音信号本质上是非平稳的发音器官在不停运动声道的形状和激励源都在变化。但好在语音有一个让人欣慰的性质短时平稳。在10ms到30ms这个量级的时间窗内声道形状基本不变化信号可以近似看成平稳过程。这就引出了语音分析里最核心的思路——先把长语音切成短段再对每一段做FFT最后把各帧的频谱拼成一张语谱图。FFT是这一整套流程里的发动机没有它前面提到的频域分析全都无从谈起。1.2 FFT解决的三个核心问题第一是频率分解。语音是由基频和各次谐波叠加而成的基频对应声带振动频率谐波的包络反映了声道共振特性也就是音色。FFT把叠加在一起的各路频率拆开材料就“分层”了。第二是效率。传统的离散傅里叶变换DFT计算复杂度是O(N²)一次4096点的变换要运算约1600万次而FFT利用旋转因子的周期性和对称性将复杂度降到O(NlogN)同样4096点变换只有约4.9万次运算量差了三百倍左右。没有FFT实时语音分析基本是不现实的。第三是谱估计。语音识别前端最常用的滤波器组特征、倒谱特征第一步全部建立在FFT得到的幅度谱之上。可以说FFT是语音特征工程的“通用货币”掌握它的细节后面学什么特征都会顺畅很多。2. 动手之前必须想清楚的几个参数2.1 采样率、奈奎斯特频率和频率分辨率的关系数字信号处理的第一个分水岭是采样率。假设采样率是16000Hz语音处理最常见的配置根据奈奎斯特采样定理能表示的频率范围是0到8000Hz这个上限就是奈奎斯特频率。做FFT时频率轴最多画到8000Hz再往上就没有意义了。频率分辨率直接由两个量决定帧长和FFT点数。如果一帧取400个采样点25ms16kHz不补零直接做400点FFT频率间隔就是Δf fs / N 16000 / 400 40Hz也就是说这个设置下频谱图上相邻两条谱线相差40Hz两个频率如果只差20Hz会在同一根谱线附近“混”在一起无法分辨。想要更细的频率分辨率办法是增加N——要么把帧加长取更多点数要么补零到更大的FFT长度。这里要特别注意一个常见的认知误区补零只能让频谱插值更平滑看起来曲线更细腻并不能提升真实的频率分辨率。真实分辨率只取决于实际参与分析的信号时长T即Δf 1/T的物理极限此处T是加窗后信号的实际时长。补零到2048点谱线间隔变成了7.8Hz但是两个仅差5Hz的频率成分依然分不开因为真实的信号长度并没有变。在做基频检测时这种细节决定了算法能不能精准地区分98Hz和100Hz。2.2 分帧和加窗缺一不可直接把整段语音丢进FFT会得到什么会得到全段信号的平均频谱声母、韵母、不同音调的频率成分全部被“平均”到一起基频随时间的变化根本看不出来。所以必须分帧。分帧由两个参数控制帧长和帧移。帧长通常取20到30ms因为人的语音在这个时长内近似平稳帧移通常取帧长的1/3到1/2也就是10ms左右目的是让相邻帧之间有一定重叠避免帧边界处信息的突变和丢失。以16kHz采样为例25ms帧长对应400个采样点10ms帧移对应160个采样点。这个设置是语音识别领域的“黄金配置”实践验证非常稳。加窗则是另一个容易被忽视的细节。直接截取一段信号等价于给信号乘上了一个矩形窗矩形窗的频谱旁瓣很高主瓣附近衰减速度慢导致能量从真实频率成分“泄漏”到旁边的频点上这就是频谱泄漏。加窗就是在时域上对每一帧信号做一次加权让帧边缘的采样点幅度逐渐衰减到接近零从而压制旁瓣水平。2.3 窗函数选型几个经典选项的取舍工程上最常用的是汉明窗和汉宁窗二者长相相似但细节有差异窗函数主瓣宽度旁瓣衰减应用倾向矩形窗最窄最差约-13dB频率分辨率优先不介意泄漏汉宁窗较宽较好约-31dB通用语音分析兼顾分辨率和泄漏汉明窗较宽较好约-41dB语音分帧的经典选择旁瓣更低布莱克曼窗最宽最好约-58dB需要极低泄漏分辨率要求不严格这里有一个硬性经验做语音分析加窗的“主瓣宽度”代价是必然发生的它压缩了泄漏但会让主瓣变宽结果是原本单频信号在频谱图上也呈现出一定的宽度这会轻微“腐蚀”频率分辨率。因此不要在语音任务里追求“高分辨率又低泄漏”的完美窗那不存在。确定好你的主要矛盾——是分辨两个相近频率选矩形或汉宁还是让弱信号不被强成分的旁瓣淹没选汉明或布莱克曼——再决定窗函数。Python里创建窗也很简单import numpy as np frame_len 400 window np.hamming(frame_len)这个窗要和每一帧信号逐点相乘不是在FFT之后再乘。顺序不能搞反。3. 实操Python完整走一遍语音FFT变换3.1 读取语音文件并做归一化读取wav文件可以用soundfile库比scipy更省心的地方在于它直接用浮点数表示音频数据避免了对整型数据手动转换的麻烦而且对多种格式兼容性更好。读取时最重要的信息是采样率它决定了之后所有频率相关的计算。用一个例子演示import numpy as np import soundfile as sf file_path speech.wav data, sr sf.read(file_path) # 常见情况读取结果为float64范围在-1.0到1.0之间 # 但如果原始文件是16bit PCM有些库返回的是int16数据需要手动归一化 if data.dtype np.int16: data data.astype(np.float32) / 32768.0 print(f采样率: {sr} Hz) print(f信号时长: {len(data) / sr:.3f} 秒)这里有个容易翻车的地方如果文件是双声道data.shape会是(帧数, 2)直接把两声道混在一起做分析会把左右声道的信息搅乱。语音分析通常先转成单声道最简单的做法是取平均if data.ndim 1: data data.mean(axis1)这是在不损失过多信息的前提下最简单有效的做法。3.2 分帧加窗逐帧做FFT分帧逻辑本身不难写难在写得不留边界坑。我的习惯是先算总帧数再用一个循环逐帧取出信号片段frame_len int(0.025 * sr) # 25ms帧长16000Hz下是400点 frame_shift int(0.010 * sr) # 10ms帧移16000Hz下是160点 n_frames 1 (len(data) - frame_len) // frame_shift window np.hamming(frame_len) frames [] for i in range(n_frames): start i * frame_shift end start frame_len frame data[start:end] * window # 加窗 frames.append(frame) frames np.asarray(frames) print(f帧数: {frames.shape[0]}, 每帧长度: {frames.shape[1]})注意帧数和帧移的计算总帧数不是简单地用总长度除以帧移而是要扣除帧长后再除以帧移这样才能保证最后一帧不会越界。比如10秒的语音160000个采样点按上述参数计算得到n_frames 1 (160000 - 400) // 160 996如果没有扣掉帧长直接除帧移会算出1000帧最后拼出来就会少掉“尾巴”上一层重要的频谱信息。这个小细节很多人会忽略。实际工程中为了兼容深度学习框架和不同的语音处理库很多人直接用librosa库的stft函数一步到位import librosa D librosa.stft(data, n_fft512, hop_lengthframe_shift, win_lengthframe_len, windowhamming)注意librosa.stft内部会自己选择大于win_length的n_fft做补零幅度谱的数值和手动实现的略有差异但频率结构是一致的。3.3 计算幅度谱和频率轴对每一帧做FFT之后得到的是复数序列实部虚部都有。幅度谱的计算方式是取复数模值n_fft 512 # FFT长度通常取2的幂 mag_spectrum np.abs(np.fft.rfft(frames, nn_fft, axis1))这里用rfft是因为语音信号是实数信号FFT结果关于奈奎斯特频率共轭对称只保留一半就足够了。n_fft512的情况下rfft输出的频率点数不是512而是257个对应频率范围0到8000Hz。对应频率轴用rfftfreq计算freqs np.fft.rfftfreq(n_fft, d1/sr)频率间隔是31.25Hz因为512点对应16000Hz采样率除以2之后是256个有效频带16000/51231.25Hz。这里可以对比一下之前算的400点。补零到512之后谱线更密了但并不会让真实的频率分辨能力超过帧长本身刚才说过的坑在这里就体现出来了。幅度谱的数值范围很宽直接画图几乎看不到细节。通常做法有两个方向一是取平方得到功率谱二是转成对数域dB。前者在做谱减法去噪时最常用后者在可视化时最好用。转为dB的公式log_mag 20.0 * np.log10(mag_spectrum 1e-6)加一个极小值是为了防止log(0)报错。这里有个具体数值概念如果某帧信号幅度谱的峰值是30dB噪声底在10dB视觉上的动态范围就拉开了20dB画图时噪声区域会显得非常平坦不会有大片黑块。3.4 把各帧拼成语谱图有了每一帧的幅度或对数幅度整个音频文件就可以表示成一个矩阵行是频率点列是时间帧。把这个矩阵画成二维图像常用的方案是imshow或者pcolormesh后者在控制横纵轴刻度时更顺滑import matplotlib.pyplot as plt # 转置为[时间帧, 频率点]的布局 log_spec log_mag.T plt.figure(figsize(10, 6)) plt.pcolormesh(log_spec, cmapmagma) plt.colorbar(labelMagnitude (dB)) plt.xlabel(Frame index) plt.ylabel(Frequency (Hz)) plt.show()一张完整像样的语谱图就出来了。横轴可以按帧数乘上帧移换算成实际时间秒数纵轴可以按频率索引换成赫兹。语谱图上那些横向的亮纹就是基频及其谐波亮纹间隔反映音高变化纵向的暗条纹对应清音和停顿颜色深浅直接反映能量分布。保存语谱图时有一个细节用plt.savefig而不是plt.show后截图因为交互窗口的DPI默认值较低保存时指定dpi300才能获得论文和汇报里能用的清晰图。4. 常见问题与排查技巧实录4.1 频谱图上出现的“裙边”频谱泄漏现象是明明一个纯净的正弦音FFT之后谱线周围却有拖尾。这通常就是没有加窗或者窗函数选得太“尖锐”比如用了矩形窗。我实际测试过一次对一段纯净的440Hz正弦波做FFT不加窗时440Hz附近300Hz到600Hz的范围里都散布着不小的能量加上汉明窗之后这些旁瓣被压到很低的水平频谱一下就干净了。矩形窗不是不能用但必须明确你选它牺牲了什么。如果加了窗还是有一圈“毛刺”再看两种情况一是FFT点数没有覆盖整帧数据二是频率分辨率不够导致两个邻近成分互相干扰。前者补零可以缓解后者则需要调长分析窗口。4.2 想要的细分频率分不出来分辨率瓶颈场景复现有一段语音里有基频100Hz和另一个微弱成分101Hz用25ms帧长做FFT理论上分辨极限是40Hz这两根差1Hz的线当然合并成了同一根。解决办法是把帧长加长到50ms甚至100ms但代价是语音的非平稳性开始变得明显帧内信号的性质可能已经发生变化。这是语音分析里经典的二难选择时间分辨率与频率分辨率不可兼得。一个折中做法是多尺度分析对基频检测这类需要精细频率分辨率的任务用较长的帧如50ms和较小的帧移如10ms来补偿时间上的损失对语谱图可视化和语音识别前端特征用标准的25ms帧长即可因为此时关注的是共振峰包络而不是单个谐波的位置。4.3 幅度谱数值看起来“不对”归一化问题做FFT之后取了abs得到的是正比于信号的数值但它并不是“真实的”幅度谱需要除以FFT长度来归一化mag_spectrum np.abs(np.fft.rfft(frames, nn_fft, axis1)) / n_fft单边谱还需要注意一个细节除直流分量第0个频率点和奈奎斯特频率点最后一个点外其余频率点幅度要乘以2因为负频率部分的能量被折叠到了正频率一侧。我见过不少人在这一步直接把所有点统一乘以2结果出图的直流分量比别人高出一倍看起来非常突兀。正确的写法是构造一个系数数组中间点乘2两个端点不乘。4.4 低频段一大块“能量墙”直流偏置和趋势项录音设备的偏置电压或信号里的缓慢趋势会在频谱图0Hz附近形成一条亮线。解决办法很简单分帧前先对整段信号去均值或者用高通滤波器滤掉50Hz以下的成分。语音的有效频率范围通常是100到4000Hz去掉超低部分不会损失语音信息反而能减少环境噪声的影响。代码加一行就行data data - data.mean()4.5 语谱图上出现水平条纹谐波叠加效应纯净的元音在语谱图上应该是均匀的亮带但有时会出现周期性水平细纹。这是基频的多次谐波分量没有被平滑处理造成的常见于噪声较重的录音。前置步骤可以做预加重增强高频段或者用对数幅度压缩来减小动态范围。预加重最简单的实现是一个一阶差分pre_emphasis 0.97 data np.append(data[0], data[1:] - pre_emphasis * data[:-1])系数0.97是经验值目的是补偿语音信号高频段在发声和传输过程中的自然衰减。加了预加重之后语谱图的高频段细节会显著清晰。5. 从FFT往后走这些结果能怎么用5.1 从幅度谱到语音特征FFT得到的幅度谱很少直接当作特征丢给模型一般还会做几步后处理。最常见的链路是算出功率谱用梅尔滤波器组压缩到40个频带取对数再做离散余弦变换得到MFCC梅尔频率倒谱系数。整个流程的前三道门槛就是FFT、加窗、幅度谱转功率谱这些步骤做扎实了后面的特征工程才有意義。另一路是基频提取。对每一帧幅度谱在80Hz到400Hz范围找峰值配合时域自相关结果做校正得到基频轨迹。这个方法在语音转谱分析、语调可视化等场景里非常常用。一旦找到基频下一步就可以计算5%到95%的分布范围来评估说话人的音域或者画出音调走势曲线。FFT在其中扮演的是“给出精确候选频率”的角色比单纯的自相关法抗噪更好。5.2 几个值得记住的工程经验第一处理长语音文件时分帧循环不要一次开太多内存。如果一段60秒的语音按25ms帧长、10ms帧移分帧会产生约6000帧每帧400点累计存储量约240万个浮点数还好。但如果再用大窗口重叠做高分辨率分析内存占用会迅速膨胀。我会在帧循环内直接做完FFT并只保存幅度谱不保存原始帧这是最省内存的做法。第二验证代码写没写对的简单办法是构造一个已知信号比如1kHz正弦波加一点噪声跑完整个流程后看频谱图上1kHz的位置是不是一根清晰的峰峰值dB值是否符合预期。我每次换电脑、换环境都要跑一次这个自检几分钟就能排除绝大部分低级错误。第三窗函数和FFT点数的关系要想清楚。n_fft大于frame_len时框架会自动补零n_fft小于frame_len时数据会被截断。两者都会影响结果前者常见且可接受是插值而不是提高分辨率后者通常不是一个好主意会丢掉信息。最后一件事我想单独提一下。做FFT变换时最容易让人觉得“难”的其实不是数学公式而是感觉自己明明按教程写了代码出来的图却和书上的长得不太一样。这个时候最有效的排查手段不是反复调试代码参数而是回到信号本身画一段时域波形找出静音段和发声段确认信号长度、采样率和声道数然后逐步检查分帧逻辑、加窗形状和一个纯正弦信号的FFT结果。从简单信号做起确认每一步都正确再回到真实语音上这个坏习惯我今天仍然在坚持。保持这种从基础验证到复杂场景的工作方式能节省大量调试时间也能让你对这个分析过程的理解越来越扎实。

相关新闻

LTMU元更新器:让长期目标跟踪不再因更新策略而丢目标

LTMU元更新器:让长期目标跟踪不再因更新策略而丢目标

最近在整理长期目标跟踪相关的资料时,又把这篇文章翻出来重读了一遍。说实话,很多跟踪领域的论文看的是“怎么把特征提得更好”,但LTMU这篇不一样,它瞄准的是一个常被忽略却又致命的问题——跟踪器到底该什么时候更新。这个决定看…

2026/10/13 23:17:20 阅读更多 →
Docker入门与实战——容器实战思考

Docker入门与实战——容器实战思考

容器实战思考1、Docker为什么会成功2、研发人员该如何看待容器2.1、快速上手新技术2.2、容器化的代码仓库2.3、面向业务编程2.4、使用Docker Hub发布开源项目3、容器化开发模式3.1、操作流程3.2、场景示例3.3、注意事项3.4、容器与生产环境1、Docker为什么会成功 Docker实现所…

2026/10/13 23:17:20 阅读更多 →
前馈算法(Feedforward)完全指南:多层感知机与矩阵运算——《Nature of Code》第10章神经网络系列 10.12

前馈算法(Feedforward)完全指南:多层感知机与矩阵运算——《Nature of Code》第10章神经网络系列 10.12

教程文档示例工程 【免费下载链接】website-archive Archive of the Coding Train website (first version) 项目地址: https://gitcode.com/gh_mirrors/we/website-archive 点击查看 免费下载 本文以 Coding Train 网站存档中《Nature of Code》第 10 章 Neural N…

2026/10/13 23:16:20 阅读更多 →

最新新闻

如何让手机访问Symfony WebServerBundle本地服务器:0.0.0.0绑定与局域网暴露完整指南

如何让手机访问Symfony WebServerBundle本地服务器:0.0.0.0绑定与局域网暴露完整指南

【免费下载链接】web-server-bundle Provides commands for running applications using the PHP built-in web server 项目地址: https://gitcode.com/gh_mirrors/we/web-server-bundle 点击查看 免费下载 想让手机直接打开你电脑上跑的 Symfony 应用吗&#xff1…

2026/10/14 0:16:46 阅读更多 →
极大极小值算法与Alpha-Beta剪枝:棋类博弈搜索核心解析

极大极小值算法与Alpha-Beta剪枝:棋类博弈搜索核心解析

写一个会下棋的 AI 难吗?如果只靠暴力枚举,哪怕是一盘井字棋,顶多 9! 种走法还能忍,换到五子棋、国际象棋,分支因子一下子爆炸,普通程序根本算不完。这时候就得回到博弈树搜索的老套路:极大极小…

2026/10/14 0:16:46 阅读更多 →
Chan-Vese 图像分割算法 Python 实现与参数调优实战

Chan-Vese 图像分割算法 Python 实现与参数调优实战

简介:这份资源提供Chan-Vese图像分割算法的Python实现代码,面向正在学习图像处理、计算机视觉或活动轮廓模型的学生与开发者。Chan-Vese模型是首个完全脱离图像梯度信息、依靠区域信息构建能量函数的活动轮廓模型,为后续分割方法开辟了新方向…

2026/10/14 0:16:46 阅读更多 →
Neo4j 5.23 Windows 配置避坑指南:从安装到生产就绪

Neo4j 5.23 Windows 配置避坑指南:从安装到生产就绪

简介:Neo4j Community Edition 5.23.0 Windows版安装包,面向图形数据库初学者、高校学生及中小型项目开发者,提供开箱即用的本地图数据库环境,适用于社交关系分析、推荐系统原型开发、知识图谱构建等高度关联性数据场景。压缩包共…

2026/10/14 0:16:46 阅读更多 →
noto-fonts NEWS 解读:Noto 字体三次关键演进、upem 网格限制与 OFL 1.1 授权切换

noto-fonts NEWS 解读:Noto 字体三次关键演进、upem 网格限制与 OFL 1.1 授权切换

数据集 【免费下载链接】noto-fonts Noto fonts, except for CJK and emoji 项目地址: https://gitcode.com/gh_mirrors/no/noto-fonts 点击查看 免费下载 本文基于 noto-fonts 仓库根目录下的 NEWS.md 编写,梳理 2015—2018 年间 Noto 字体项目的三次里…

2026/10/14 0:16:46 阅读更多 →
glibc内存管理核心:malloc/free原理、RSS异常排查与调优实践

glibc内存管理核心:malloc/free原理、RSS异常排查与调优实践

搞了十多年Linux服务端,我遇到过不少内存方面的疑难杂症:程序跑着跑着RSS飙到十几个GB,看代码却找不到任何泄漏;压力测试一过进程就被OOM干掉;线上明明有内存空闲,服务却越跑越慢。这些问题表面上是业务逻辑…

2026/10/14 0:15:46 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →