基于GMM的语音识别系统原理与MATLAB实现详解
说到基于高斯混合模型GMM的语音识别系统很多人第一反应就是一堆数学公式觉得门槛很高。但如果你真的在MATLAB里把它落地跑通会发现核心其实就是三件事把声音变成特征向量用GMM给每个类别建模最后算一下谁的概率最大。这个思路用在小型语音识别项目里比如中文数字识别、孤立词识别或者说话人身份确认都非常舒服既不需要深度学习那样的大算力也能把原理讲得很清楚。这篇文章我想从一个实际做过的项目出发把GMM语音识别系统的核心原理、MATLAB实现步骤、训练细节和踩坑经历都梳理出来。适合刚接触语音信号处理的人也适合想快速在MATLAB里搭一个可以演示的识别原型的同学。我会尽量用干活的口吻讲代码也会给到能直接改着用的程度。1. 先聊聊为什么用GMM做语音识别1.1 一个最通俗的理解方式你可以把GMM理解成“用一堆高斯分布去拼凑任意形状的分布”。每个语音类别比如数字“一”、数字“二”它的一批特征向量在高维空间里并不是规规矩矩地聚成一坨而是可能有几个不同的聚集区域。比如同样说一个“三”有人声音低沉有人声音偏亮环境噪声不同录音音量不同表现在特征空间里就会形成几团“各有偏向”的数据。单个高斯分布只有一个均值和一个协方差表达这种多峰特征会力不从心。GMM的思路很简单我不再用一个分布硬扛而是用多个高斯分布加权组合每个高斯负责描述特征空间中的一块区域最后把它们的贡献加起来形成一个整体的概率密度模型。这个想法放到识别任务里就变成很自然的做法每个类别训练一个GMM识别新语音时把它的特征依次丢进每一个GMM里算概率密度得分哪个模型给分最高就判定为哪个类别。1.2 GMM在语音任务里到底扮演什么角色在深度学习流行起来之前GMM是语音领域里的主力模型之一。最经典的是HMM-GMM架构HMM负责建模语音时序变化GMM负责建模每一帧语音特征的概率分布。但如果只是做小规模的孤立词识别可以不引入HMM直接对每个词训练一个GMM也能获得不错的基线效果。这个方案特别适合MATLAB环境下的课程设计、实验室原型验证和个人学习。原因有几个GMM本身是生成模型训练过程直观似然值可以直接解释。MATLAB的统计工具箱已经把EM算法封装好了用几行代码就能完成模型训练。特征提取部分用信号处理工具箱也可以比较轻松地搭出一个MFCC流程。相比神经网络GMM参数量小训练时间短对小样本数据更友好。我当年在某高校实验室做语音识别原型时就是用这个方案快速搭建了第一版系统验证完算法思路之后再决定要不要上更复杂的模型。这个“先做基线再迭代”的思路用在个人项目里非常值得参考。1.3 系统整体流程整个系统前后串起来是这样的录音并读取音频文件。对音频做预加重、分帧、加窗。提取MFCC特征一般取13维可加一阶差分。对每个类别收集多段录音的特征训练一个GMM。识别时把测试音频按同样方式提取特征然后分别计算它在每个GMM下的对数似然。取对数似然最大的类别作为识别结果。流程本身并不复杂但每一步都有不少细节。很多项目跑不通往往不是GMM理论的问题而是前面特征提取或者后面对数似然计算时埋了坑。这一点我在后面会专门讲。2. 核心原理从MFCC到高斯混合模型2.1 声音怎么变成特征向量语音信号本身是时域波形直接丢给模型是不行的。一方面维度太高另一方面冗余信息太多。所以要先转换成更紧凑、更能反映发音特点的特征。最常用的特征就是MFCC中文叫梅尔频率倒谱系数。它的计算流程大致如下预加重语音信号的高频部分通常能量较弱用一阶高通滤波器提升高频。分帧语音是短时平稳的一般取25ms一帧帧移10ms。加窗每帧乘一个汉明窗减少频谱泄漏。FFT把每一帧变换到频域得到频谱。Mel滤波器组把频谱按人耳感知特性映射到梅尔刻度上得到每个频带的能量。取对数模拟人对声音强度的对数感知。DCT对对数能量做离散余弦变换得到倒谱系数通常取前13维。MFCC的低维系数描述的是语音频谱的平滑形状正好能反映声道滤波特性对说话内容区分度很好。后面再加一阶差分可以补充帧与帧之间的动态变化信息。2.2 高斯混合模型的数学骨架一个包含K个分量的GMM可以写成p(x) sum_{i1..K} w_i * N(x; mu_i, Sigma_i)其中w_i是第i个高斯的权重mu_i是均值向量Sigma_i是协方差矩阵。N(x; mu, Sigma)表示多元高斯分布的概率密度函数N(x; mu, Sigma) 1 / ((2*pi)^(D/2) * det(Sigma)^(1/2)) * exp(-0.5 * (x-mu) * inv(Sigma) * (x-mu))这里D是特征维数。GMM就是要根据一批训练数据估计出每个分量的权重、均值、协方差使得这批数据的总体似然最大化。在语音识别任务里一般对每个类别单独训练一个GMM。比如类别“零”一个模型类别“一”一个模型。每个模型在训练时只用自己的样本所以模型之间的区分度完全靠数据驱动。2.3 EM算法在干什么GMM的参数不能像单高斯那样直接算闭式解因为每个样本到底是“属于”哪个高斯分量这件事是未知的。EM算法就是解决这个问题的标准方法。EM的全称是期望最大化。它分成两步交替迭代E步根据当前参数计算每个样本属于每个高斯分量的后验概率。这个概率叫responsibility可以理解为软归属。M步利用这些软归属重新加权计算每个高斯的均值、协方差和权重。E步和M步反复执行每次迭代都能保证训练数据的总似然不下降。到收敛后就得到一组比较可靠的GMM参数。在MATLAB里你完全不用手动写EM循环用统计工具箱里的函数就能完成。但理解EM过程仍然很重要因为它决定了你要怎么初始化参数、怎么设置迭代次数以及为什么某些情况下训练会失败。3. MATLAB实现从零搭一个识别系统3.1 模块划分与工具准备我建议把系统拆成几个独立模块这样调试和扩展都方便extract_mfcc.m输入音频和采样率输出MFCC特征矩阵。train_gmm.m输入某类别的所有特征输出训练好的GMM模型对象。recognize.m输入测试音频输出识别类别。在MATLAB里最简单的方式是用自带的音频读取函数和统计建模函数。如果你有相关的工具箱训练GMM可以直接用封装好的拟合函数。如果没有也可以手写EM代码量不算大后面我会给出关键片段。3.2 MFCC特征提取代码下面是一个比较完整的MFCC提取函数适合直接用在MATLAB里function mfccs extract_mfcc(audio, fs) % 参数设置 frameLen round(0.025 * fs); % 25ms 帧长 frameShift round(0.010 * fs); % 10ms 帧移 numMelFilters 26; % Mel滤波器个数 numCepstral 13; % 保留13维倒谱系数 % 预加重 audio filter([1, -0.97], 1, audio); % 分帧用buffer函数实现 frames buffer(audio, frameLen, frameLen - frameShift, nodelay); frames frames(:, 1:floor((length(audio) - frameLen) / frameShift) 1); % 加窗 window hamming(frameLen, periodic); frames frames .* repmat(window, 1, size(frames, 2)); % FFT NFFT 2^nextpow2(frameLen); spec abs(fft(frames, NFFT, 1)); % Mel滤波器组 melFiltBank designMelFilterBank(fs, NFFT, numMelFilters); melEnergy melFiltBank * spec; % 取对数 logMelEnergy log(melEnergy eps); % DCT mfccs dct(logMelEnergy); mfccs mfccs(1:numCepstral, :); end完整的Mel滤波器组生成函数比较长这里给一个简化版function melFiltBank designMelFilterBank(fs, NFFT, numFilters) fMin 0; fMax fs / 2; melMin 2595 * log10(1 fMin / 700); melMax 2595 * log10(1 fMax / 700); melPoints linspace(melMin, melMax, numFilters 2); hzPoints 700 * (10.^(melPoints / 2595) - 1); binPoints floor((NFFT 1) * hzPoints / fs); melFiltBank zeros(numFilters, NFFT / 2 1); for m 2:numFilters1 left binPoints(m - 1); center binPoints(m); right binPoints(m 1); for k left1:center if k NFFT/2 melFiltBank(m-1, k) (k - left) / (center - left); end end for k center1:right if k NFFT/2 melFiltBank(m-1, k) (right - k) / (right - center); end end end end这段代码在测试中表现稳定。注意buffer分帧时如果音频短于一个帧长会出现问题所以在调用前最好先检查音频长度。3.3 GMM训练与保存提取完特征后训练GMM可以非常简洁。假设我们已经把所有“类别一”的特征拼成一个大的矩阵trainData每行是一帧特征每列是一个维度那么训练代码长这样function gmmModel train_gmm(trainData, numComponents) options statset(Display, final, MaxIter, 300); gmmModel fitgmdist(trainData, numComponents, ... CovarianceType, diagonal, ... RegularizationValue, 0.01, ... Options, options); end这里我特意用了对角协方差。语音特征维度之间往往有相关性但为了训练稳定、减少参数数量对角协方差是一个很实用的选择。RegularizationValue用来避免协方差奇异如果数据量少这个值很关键。如果没有统计工具箱也可以手动实现EM。核心代码是这几个步骤的循环% 初始化用kmeans把数据粗聚类 [idx, centers] kmeans(trainData, numComponents, MaxIter, 100); weights ones(1, numComponents) / numComponents; mu centers; sigma repmat(var(trainData), 1, numComponents); for iter 1:100 % E步 resp zeros(size(trainData, 1), numComponents); for k 1:numComponents resp(:, k) weights(k) * mvnpdf(trainData, mu(:, k), sigma(:, k)); end resp resp ./ (sum(resp, 2) eps); % M步 Nk sum(resp, 1); weights Nk / sum(Nk); mu (trainData * resp) ./ Nk; for k 1:numComponents diff trainData - repmat(mu(:, k), size(trainData, 1), 1); sigma(:, k) sum(resp(:, k) .* (diff.^2), 1) ./ Nk(k); end end这段手动版本没有加正则只适合数据量充足的小规模实验。在实际项目中我更推荐直接用工具函数因为它内部做了很多数值保护。训练好模型后直接把模型对象保存到mat文件里即可save(gmm_models.mat, gmmModel1, gmmModel2);3.4 识别打分与判决识别的时候先提取测试音频的MFCC特征然后计算它在每个GMM下的对数似然。为了防止不同长度音频导致分数失真可以把总的对数似然除以帧数得到平均对数似然。function label recognize(features, gmmModels) numClasses length(gmmModels); logLikelihood zeros(1, numClasses); for c 1:numClasses [~, logLikelihood(c)] gmmModels{c}.cluster(features); % 有些版本没有直接暴露pdf函数可以用cluster来近似打分 end [~, label] max(logLikelihood); end更精确的做法是用pdf方法或者自己算对数密度function logLik computeLogLikelihood(gmm, X) [P, ~] gmm.cluster(X); % P是后验概率矩阵 logLik sum(log(sum(P, 2) eps)); end之所以强调用对数似然是因为一组语音特征帧很多直接乘起来会小到数值下溢连电脑都表示不了。取对数之后乘法变成了加法数值稳定性会好很多。4. 训练细节与调参心得4.1 高斯分量数量怎么选这是很多人第一个会问的问题GMM到底应该选几个高斯分量我给一个从实际测试中得到的经验值对于单个数字或单词识别每个类别用8到16个高斯分量通常就够用了。数据量越少分量越多越容易过拟合。如果每个类只有10段录音建议分量控制在8个以内如果每个类有50段以上的录音可以用16个甚至32个。分量数太少模型表达力不够类内方差描述不细致。分量数太多训练数据不够部分分量会被分配到极少数样本上协方差矩阵容易变成奇异矩阵。这个平衡点需要实验来确定可以画一下每个分量数下的测试集识别率取一个拐点位置。4.2 协方差矩阵的三种约束GMM的协方差矩阵有三种常用形式完整协方差能描述维度之间的相关性但参数量大容易过拟合。对角协方差假设维度相互独立参数量小训练快语音识别里用得最多。共享协方差所有高斯分量共用同一个协方差矩阵进一步减少参数量适合小样本场景。在实际项目中我第一次用的是完整协方差结果训练数据稍少一点就频繁报错。后来换成对角协方差之后系统立刻稳定了识别率也没有明显下降。我的建议是优先对角协方差只有在数据量很充足并且对角模型明显不够用时再考虑完整协方差。4.3 特征归一化与端点检测很多人在提取MFCC后直接丢给GMM训练这其实很容易出问题。不同录音的音量大小不一样导致特征分布整体偏移。某一次录音离麦克风近一点模型就可能被带偏。我的做法是在拼接所有训练特征之前先对每一维特征做均值和方差归一化trainData (trainData - mean(trainData)) ./ std(trainData);这个操作对提升系统稳定性很有帮助。需要注意的是归一化参数应该只用训练集计算然后应用到测试特征上否则会把测试集信息提前泄露给模型。另一个容易忽略的点是端点检测。录音文件前后经常有一段静音静音的MFCC特征和语音内容本身差异很大如果把这些静音帧也纳入训练模型会分出一部分高斯分量去描述静音白白浪费表达能力。简单起见可以用短时能量做门限frameEnergy sum(frames.^2, 1); validIdx frameEnergy max(frameEnergy) * 0.05; frames frames(:, validIdx);这样可以把低能量的静音帧去掉。如果项目里语音都是干净的这一步必要性不大但如果录音环境杂一点就值得加。5. 常见问题与排查技巧实录5.1 训练发散或者聚类失败现象训练GMM时某次迭代后参数变NaN或者所有样本都被分到了同一个高斯分量里。排查方向检查特征矩阵里是否存在NaN或Inf。这种情况经常来自log(0)所以在取对数时我加了eps。检查协方差是否奇异。如果特征维数很高但训练帧数很少就容易发生。解决办法是增加正则化系数或者切换为对角协方差。检查初始化方式。直接随机初始化很容易陷入不好的局部解。用kmeans初始化是目前非常稳妥的做法工具函数内部默认就用了类似策略。5.2 数值下溢与对数域计算现象识别时某个模型得分算出来是0或者训练时似然值出现-Inf。原因很直接帧数乘以维数似然概率可能远远小于浮点数能表示的最小值。解决办法是把所有概率运算都放到对数域。比如GMM的概率密度函数可以写为log p(x) log(sum_i w_i * exp(logN_i))直接展开会有数值风险可以先用logsumexp技巧抵消误差。MATLAB里用fitgmdist训练时内部已经做了数值保护手动实现EM时一定要自己注意。5.3 说话人混淆与录音条件影响如果系统在训练时用A同学的声音测试时换B同学的声音识别率往往会下降。这不是GMM模型的错而是训练集和测试集的数据分布不一致。缓解办法有几个多采集几个人的录音混合训练让模型尽量覆盖不同说话人的特征。录音时固定设备、固定距离、固定环境减少信道差异。对特征做倒谱均值减CMS可以在一定程度上抵消信道和麦克风的影响。倒谱均值减的实现非常简单mfccs mfccs - mean(mfccs, 2);这个操作对消除录音通道差异效果明显我在一个跨设备测试中试过识别率能提升几个百分点。5.4 内存爆炸与小样本训练如果训练数据很大、GMM分量很多fitgmdist可能会占掉大量内存。这时候可以用自带的statset限制迭代次数或者对训练特征随机抽样一部分帧来训练。每一帧之间本身有大量冗余抽样后模型质量不会下降太多。反过来小样本训练时比如每个类只有几十秒录音就不要追求大GMM。我有一个原则每个高斯分量至少要有几十帧有效数据去支撑否则统计量不可靠。如果总帧数只有500帧用16个分量平均每个分量只有30帧数据结果会非常不稳。6. 让系统更稳的几件事实操经验6.1 加一点模型自适应如果项目需要做说话人自适应又不想引入太复杂的算法可以试试最大后验MAP自适应。思路很简单先用大规模通用数据训练一个背景模型再用某个特定说话人的少量数据去微调均值。在MATLAB里实现MAP自适应其实就是按后验概率把旧均值和新的统计量加权融合new_mu (alpha * new_stat (1 - alpha) * old_mu)这个alpha根据新数据的量动态调整数据越多alpha越大。虽然这里只是提一句但如果你的GMM识别系统遇到新用户时表现不好这招往往立竿见影。6.2 声音活动检测不能省我在早期版本里跳过端点检测结果发现识别错误多数发生在录音首尾的静音段。后来加了一个很简单的能量门限整个系统识别率立刻提升了一截。当然如果环境噪声比较强单纯用能量门限会误判可以换成过零率加能量的双重判断。更复杂的也可以用语音活动检测模型但对小型项目来说先把能量门限调好就够用了。6.3 评估指标与常见指标误区最后提醒一下评估方法。很多同学在汇报识别率时直接用训练集来测结果自然是百分之九十多但这没有任何说服力。正确的做法是留出独立的测试集或者做几折交叉验证。对每个类别建议至少留出20%的数据不参与训练专门用来测试。如果数据量少可以用留一法每一次取其中一段做测试其余全部训练最后把结果平均。我在实际项目中还发现单独看整体识别率会掩盖问题。建议同时看每个类别的识别率。某个数字识别率偏低时可以输出混淆矩阵看看它最容易被误判成哪个类别然后针对性分析是不是特征相似度过高。写到这里我自己最深的体会是GMM语音识别系统的代码工程量并不大真正花时间的地方永远在数据准备、特征处理和调试细节上。MATLAB给了你非常方便的封装函数但如果你不理解底层原理出了问题会完全找不到方向。把这个系统完整做一遍你会对语音特征、生成模型、概率打分这些概念有一种“打通了”的感觉。之后再去学深度学习语音识别也会轻松很多。

相关新闻

Unity桌面透明窗口方案:壁纸背景与真透明两种实现路线

Unity桌面透明窗口方案:壁纸背景与真透明两种实现路线

最近接了个桌面悬浮面板的小项目,需求一句话就能说清:做一个跑在 Windows 桌面上的 Unity 程序,窗口背景要透明,桌面壁纸要从软件背景里透出来。听起来好像并不复杂,但 Unity 默认的 Player 窗口天生就是一块不透明矩形…

2026/10/17 23:59:54 阅读更多 →
彻底搞懂JavaScript中的map:数组方法、Map集合与实战选型

彻底搞懂JavaScript中的map:数组方法、Map集合与实战选型

1. 刚接触 map 时最容易混淆的两个概念先说个普遍现象:不管你是前端还是后端,只要写过几天代码,一定撞见过 map 这个词。关键是,它在不同的语言、不同的场景里往往指代完全不同的东西——一个是数组的遍历方法,一个是键…

2026/10/17 23:58:53 阅读更多 →
Vue过滤器实战:从实时时钟到时间格式化,避开五个常见坑

Vue过滤器实战:从实时时钟到时间格式化,避开五个常见坑

简介:这份PDF围绕Vue.js中的过滤器应用,面向前端开发与Vue入门者,专门解决在页面中实时展示、自动更新当前时间并完成格式转换的问题。文档直接给出可运行代码:在模板中使用{{ currentTime | filterTime }}调用自定义过滤器&#…

2026/10/17 23:58:53 阅读更多 →

最新新闻

LayoutLM v3深度解析:多模态文档智能模型微调实战

LayoutLM v3深度解析:多模态文档智能模型微调实战

每次看到开源社区放出的文档智能模型有实质更新,我都要停下来仔细研究一番,LayoutLM系列就是这中间绕不开的名字。这个系列从最初把文本、布局、图像三种模态塞进同一个预训练框架开始,一步步变成了表格解析、票据识别、合同信息抽取这些场景…

2026/10/18 0:46:29 阅读更多 →
Event2Mind:让机器从事件文本中推理意图与反应

Event2Mind:让机器从事件文本中推理意图与反应

每次读到关于事件理解的研究,我都会习惯性地先想一个问题:机器读一句话,真的“读懂了”吗?拿“这个人被公司开除了”来说,字面上是一个解雇事件,但稍微有点常识的人都会接着想:他慌不慌&#xf…

2026/10/18 0:46:29 阅读更多 →
向量与矩阵范数详解:从L1/L2到谱范数的机器学习应用指南

向量与矩阵范数详解:从L1/L2到谱范数的机器学习应用指南

1. 为什么我们要关心“范数”这个数学工具第一次接触“范数”这个词,很多人会觉得它离实际开发很远,像是数学系课本里才会出现的抽象概念。但如果你做过机器学习、数值计算、信号处理,甚至只是用过正则化去调一个过拟合的模型,那你…

2026/10/18 0:46:29 阅读更多 →
多层网络关键节点识别:超邻接矩阵与GNN实战指南

多层网络关键节点识别:超邻接矩阵与GNN实战指南

简介:这份文档面向人工智能、大模型与复杂网络分析方向的学习者和研究者,系统梳理多层网络建模与关键节点智能识别技术。内容从多层网络的定义、模型分类与应用领域切入,逐步展开关键节点的定义、重要性及常见识别方法,并深入讲解…

2026/10/18 0:46:29 阅读更多 →
集团企业指标体系落地指南:从指标字典到数据治理的完整路径

集团企业指标体系落地指南:从指标字典到数据治理的完整路径

简介:《大型集团企业指标体系建设方案》PPT面向集团企业管理者、战略规划与运营管理岗位,是一套可直接套用的指标体系构建模板。内容从建设背景与意义切入,提出SMART指标原则,重点讲解战略目标、业务板块、运营管理、支持保障四个…

2026/10/18 0:46:29 阅读更多 →
NPDP BOK第二版:七大知识领域解析与产品开发实战应用

NPDP BOK第二版:七大知识领域解析与产品开发实战应用

简介:这是PDMA(产品发展与管理协会)官方编译的NPDP知识体系指南第二版,面向计划参加NPDP认证考试的产品经理与产品开发专业人士,是系统了解产品创新与管理核心内容的权威参考书。全书围绕七大领域展开:策略…

2026/10/18 0:45:28 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →