MATLAB实战:HMM孤立字语音识别从特征提取到Viterbi解码
简介本资源为基于隐马尔可夫模型HMM的孤立字语音识别MATLAB实现代码面向语音信号处理方向的学生、研究人员及算法入门者帮助理解并复现从特征提取到模型训练与识别的完整流程。压缩包共15个文件以13个.m脚本和2个.mat数据文件为主整体约591KB脚本覆盖MFCC特征提取、端点检测、K均值聚类初始化、Baum-Welch参数重估及维特比解码等核心环节数据文件则用于训练与识别阶段的样本加载。已有100人学习下载适合作为课程设计或算法验证的参考。读者可据此搭建训练集、估计状态转移与输出概率并完成待识别语音的最优状态序列推断从而掌握HMM孤立字识别的基本原理与MATLAB工程实现思路。1. 从一段“听不清”的录音说起HMM 孤立字语音识别到底在做什么如果你手里有一段几百毫秒的录音里面只念了一个字比如“零”“开”“关”你想让 MATLAB 判断它到底是哪个字这件事就是孤立字语音识别。它和连续语音识别最大的区别在于每个词之间有天然停顿识别单元边界清晰不需要先做端点检测之外的复杂切分。很多做嵌入式指令词、工业设备语音控制、实验教学演示的团队第一站都会选这个方向因为它的数学骨架足够清晰代码量可控而且用隐马尔可夫模型HMM就能跑出一个能看的基线。我见过太多人一上来就冲深度学习结果卡在数据标注和算力上最后连一个能复现的 demo 都没有。孤立字场景下HMM 依然是性价比最高的方案它用状态转移描述发音的时序变化用观测概率描述每一帧 MFCC 特征的分布训练用 Baum-Welch识别用 Viterbi 解码。整套流程在 MATLAB 里不到三百行核心代码就能闭环。这篇文章面向的是想亲手复现一套孤立字识别系统的工程师和学生我会把特征提取、模型初始化、训练、解码、避坑点全部拆开讲参数给到你能直接改。2. 用 MATLAB 搭一条孤立字识别流水线从 WAV 到 MFCC 特征矩阵2.1 为什么孤立字场景优先选 MFCC 而不是原始波形原始波形是时域采样点直接送进 HMM 会有两个致命问题一是维度太高二是同一字不同次发音的相位和幅度差异极大模型根本学不到稳定分布。MFCC 的做法是先做预加重、分帧、加窗再经 FFT 转到频域取 Mel 滤波器组能量最后做 DCT 得到倒谱系数。它把语音的包络信息压缩到 12 到 13 维同时保留了对人耳感知重要的低频细节。在孤立字任务里我一般取 13 维 MFCC加上一阶差分和二阶差分拼成 39 维。帧长 25 ms帧移 10 ms采样率 16 kHz。这个配置在几百个孤立字的小词表上足够稳。如果你用 8 kHz 采样帧长改成 32 ms 也能跑但高频信息会丢像“四”和“十”这种靠摩擦音区分的字容易混。2.2 特征提取的完整 MATLAB 代码与参数说明下面这段代码把一段 WAV 转成 N×39 的特征矩阵N 是帧数。我把它写成函数方便后面批量处理。function mfcc_feat extract_mfcc(filename, fs_target) % extract_mfcc 读取WAV并提取39维MFCC特征 % filename: WAV文件路径 % fs_target: 目标采样率默认16000 if nargin 2 fs_target 16000; end [x, fs] audioread(filename); if fs ~ fs_target x resample(x, fs_target, fs); % 重采样到统一采样率 fs fs_target; end x x / max(abs(x)); % 幅度归一化避免音量差异影响 frame_len round(0.025 * fs); % 25ms帧长 frame_shift round(0.010 * fs); % 10ms帧移 nfft 512; n_mel 26; % Mel滤波器个数 n_ceps 13; % 保留的倒谱系数个数 % 分帧 n_frames floor((length(x) - frame_len) / frame_shift) 1; frames zeros(frame_len, n_frames); for i 1:n_frames idx (i-1)*frame_shift 1; frames(:, i) x(idx : idx frame_len - 1); end % 预加重 汉明窗 frames filter([1 -0.97], 1, frames); frames frames .* hamming(frame_len); % FFT 与 Mel 滤波 mag_spec abs(fft(frames, nfft)).^2; mag_spec mag_spec(1:nfft/21, :); mel_fb mel_filterbank(n_mel, nfft, fs); mel_energy mel_fb * mag_spec; mel_energy(mel_energy 1e-10) 1e-10; % 防止log(0) % DCT 取倒谱 ceps dct(log(mel_energy)); ceps ceps(2:n_ceps1, :); % 去掉第0阶能量项 % 一阶、二阶差分 d1 diff(ceps, 1, 2); d1 [d1, d1(:, end)]; d2 diff(d1, 1, 2); d2 [d2, d2(:, end)]; mfcc_feat [ceps; d1; d2]; % 转置为 帧数×39 end逻辑上分四步重采样统一采样率、分帧加窗、Mel 滤波取对数能量、DCT 加差分。参数里最需要盯的是n_mel和n_ceps。Mel 滤波器个数一般取 24 到 4026 是常用折中倒谱系数保留 12 到 13 个再多会引入噪声。frame_shift决定特征帧率10 ms 对应每秒 100 帧孤立字通常 0.5 秒左右也就是 50 帧上下这个长度对 HMM 训练刚好。2.3 端点检测别让静音段污染你的 HMM孤立字虽然词间有停顿但录音前后往往还有环境噪声。如果不做端点检测HMM 会把静音也当成一个状态去学识别时容易把“短字”判成“长字加静音”。我一般用短时能量加过零率做双门限检测代码不复杂function [start_idx, end_idx] endpoint_detect(x, fs) % 双门限端点检测短时能量 过零率 frame_len round(0.025 * fs); frame_shift round(0.010 * fs); n_frames floor((length(x) - frame_len) / frame_shift) 1; energy zeros(n_frames, 1); zcr zeros(n_frames, 1); for i 1:n_frames idx (i-1)*frame_shift 1; seg x(idx : idx frame_len - 1); energy(i) sum(seg.^2); zcr(i) sum(abs(diff(sign(seg)))) / (2 * frame_len); end energy_db 10*log10(energy 1e-10); high_th max(energy_db) - 20; % 高门限峰值下降20dB low_th high_th - 10; % 低门限 start_idx find(energy_db low_th, 1, first); end_idx find(energy_db low_th, 1, last); start_idx max(1, start_idx - 2); % 向前后各留2帧余量 end_idx min(n_frames, end_idx 2); end这里的高门限取峰值下降 20 dB低门限再降 10 dB是经验值。如果你的录音底噪大可以把高门限改成峰值下降 15 dB避免把弱辅音切掉。端点检测之后只保留有效段做 MFCC能明显提升小词表下的区分度。3. 训练 HMMBaum-Welch 在 MATLAB 里怎么落地3.1 拓扑结构选择从左到右模型为什么是孤立字标配HMM 的拓扑结构决定了状态怎么跳。孤立字发音是单向时序过程所以用从左到右left-to-right无跳转模型也叫 Bakis 模型。每个字一个 HMM状态数一般取 5 到 8 个加上一个进入状态和一个退出状态。状态只能向前跳或者自环不能回退。这个约束直接砍掉了大量无效路径训练收敛更快解码也更稳。对比另一种常见拓扑全连接 ergodic 模型。它在说话人识别或者状态无关的任务里有用但孤立字里会让模型学到“倒着发音”的荒谬路径训练数据少的时候直接过拟合。我试过在 10 个字的词表上用 ergodic识别率比 left-to-right 低了将近 15 个百分点血泪经验。3.2 用 MATLAB 统计工具箱还是自己写 Baum-WelchMATLAB 的统计与机器学习工具箱里有hmmtrain和hmmdecode但它的接口对孤立字任务不够灵活尤其是多观测序列训练和自定义拓扑。我一般自己写 Baum-Welch核心就是前向-后向算法加参数重估。下面给出训练单字 HMM 的主循环function [A, B, pi] train_hmm(features_list, n_states, n_mix, n_iter) % features_list: cell数组每个元素是一个T×39的特征矩阵 % n_states: 隐状态数不含进入/退出 % n_mix: 每个状态的混合高斯分量数 % n_iter: Baum-Welch迭代次数 n_dim 39; % 初始化均匀转移 全局GMM初始化观测 A zeros(n_states2, n_states2); for i 2:n_states1 A(i, i) 0.6; % 自环 A(i, i1) 0.4; % 前跳 end A(1, 2) 1; % 进入状态 A(n_states2, n_states2) 1; % 退出状态自环 pi zeros(n_states2, 1); pi(1) 1; % 用所有帧做全局GMM初始化B all_feat vertcat(features_list{:}); B init_gmm(all_feat, n_states, n_mix, n_dim); for iter 1:n_iter % 累积统计量 A_num zeros(size(A)); B_num cell(size(B)); for s 1:n_states2 for m 1:n_mix B_num{s,m} struct(w,0,mu,zeros(n_dim,1),Sigma,zeros(n_dim)); end end for k 1:length(features_list) O features_list{k}; [alpha, beta, gamma, xi] forward_backward(O, A, B, pi, n_states, n_mix); % 累积转移计数 for i 1:n_states2 for j 1:n_states2 A_num(i,j) A_num(i,j) sum(xi{i,j}); end end % 累积观测统计量混合高斯重估 for t 1:size(O,1) for s 2:n_states1 for m 1:n_mix w gamma{t}(s,m); B_num{s,m}.w B_num{s,m}.w w; B_num{s,m}.mu B_num{s,m}.mu w * O(t,:); B_num{s,m}.Sigma B_num{s,m}.Sigma w * (O(t,:) * O(t,:)); end end end end % 重估A for i 1:n_states2 row_sum sum(A_num(i,:)); if row_sum 0 A(i,:) A_num(i,:) / row_sum; end end % 重估B混合高斯权重、均值、协方差 B update_gmm(B, B_num, n_states, n_mix, n_dim); end end这段代码的关键在于forward_backward返回的gamma和xi。gamma是每个时刻处于某状态某混合分量的后验概率xi是相邻时刻状态转移的后验概率。重估时用它们做加权平均就是 Baum-Welch 的 EM 步骤。n_iter一般设 10 到 20再多容易过拟合尤其是每个字只有十几条训练样本的时候。3.3 混合高斯分量数怎么定1 还是 3 还是 5每个状态的观测概率用混合高斯GMM建模分量数n_mix是个关键参数。孤立字词表小、数据少的时候n_mix1往往就够了因为每个状态对应的发音片段本身比较稳定。数据量上来之后比如每个字有 50 条以上录音可以加到 3 或 5用来捕捉不同说话人、不同语速带来的帧分布差异。我做过一组对比10 个字、每字 20 条训练样本n_mix1时识别率 88%n_mix3时 91%n_mix5时反而掉到 86%。原因是分量多了之后每个分量的协方差估计不准EM 容易陷到局部极值。所以我的建议是每字样本少于 30 条用 1 个分量30 到 100 条用 3 个超过 100 条再考虑 5 个。协方差矩阵用对角阵不要用全协方差39 维全协方差需要估计 780 个参数小数据下必翻车。4. 识别与解码Viterbi 怎么在 MATLAB 里跑出结果4.1 多模型并行解码的代码结构识别阶段每个字对应一个训练好的 HMM。对一段测试语音提取 MFCC 后分别计算它在每个 HMM 下的对数似然取最大的那个作为识别结果。用 Viterbi 算法算对数似然同时可以回溯最优状态路径方便调试。function [best_label, scores] recognize_hmm(test_feat, models, labels) % test_feat: T×39 测试特征 % models: cell数组每个元素是训练好的HMM结构体 % labels: 对应的字标签 n_models length(models); scores zeros(n_models, 1); for k 1:n_models scores(k) viterbi_loglik(test_feat, models{k}); end [~, idx] max(scores); best_label labels{idx}; end function loglik viterbi_loglik(O, model) % 对数域Viterbi返回最优路径对数似然 A model.A; B model.B; pi model.pi; n_states size(A, 1); T size(O, 1); delta -inf(n_states, T); delta(:, 1) log(pi 1e-300) log_obs_prob(O(1,:), B, 1); for t 2:T for j 1:n_states trans delta(:, t-1) log(A(:, j) 1e-300); delta(j, t) max(trans) log_obs_prob(O(t,:), B, j); end end loglik max(delta(:, T)); endviterbi_loglik里全部取对数避免概率连乘下溢。log_obs_prob计算某帧在某状态下的混合高斯对数概率这里不展开核心就是 GMM 的 log-sum-exp。注意1e-300是防止 log(0) 的兜底实际工程里转移概率不会真的为 0因为初始化时给了平滑。4.2 识别阶段的三个必调参数第一个是帧移。训练和测试必须一致都是 10 ms。如果测试时改成 5 ms帧数翻倍HMM 的状态时长建模会错位识别率断崖下跌。第二个是是否加差分。训练用了 39 维测试也必须 39 维不能只给 13 维。第三个是对数似然归一化。不同字的测试语音长度不同长语音的累积对数似然天然更低直接比最大值会偏向短字。我一般除以帧数做平均或者用每帧平均对数似然来比较。% 长度归一化比较 scores_norm scores / size(test_feat, 1); [~, idx] max(scores_norm);这个细节很多教程不讲但不做归一化在“一”和“三”这种时长差异大的字上错误率能差出 10 个百分点。4.3 用混淆矩阵定位问题字识别跑通之后别只看总识别率。画一个混淆矩阵看哪些字互相混。常见的是韵母相近的字比如“零”和“林”“四”和“十”。如果某两个字互相混得厉害说明 MFCC 的区分度不够可以考虑加感知线性预测PLP系数或者把帧长从 25 ms 降到 20 ms 提升时间分辨率。混淆矩阵在 MATLAB 里用confusionchart就能画输入是真实标签和预测标签。5. 避坑与排查孤立字 HMM 训练里最容易翻车的 5 个点5.1 现象训练时对数似然一直下降最后变成 NaN原因通常是某帧的观测概率算出来是 0取对数后负无穷前向变量累积后下溢。解决方法是所有概率加一个小常数1e-300并且在 GMM 协方差矩阵上加正则项1e-6 * eye(n_dim)防止协方差奇异。另外检查 MFCC 里有没有 Inf 或 NaN端点检测切出空段就会这样。5.2 现象识别率在训练集上很高测试集上惨不忍睹这是典型的过拟合。原因可能是状态数太多、混合分量太多或者训练样本太少。解决把n_states从 8 降到 5n_mix从 3 降到 1同时增加训练样本。另一个隐藏原因是训练和测试的录音设备不同MFCC 的幅度分布偏移。我一般会在特征提取后做倒谱均值归一化CMN减去整句的均值能显著提升跨设备鲁棒性。5.3 现象所有测试语音都被识别成同一个字检查标签映射是不是错了或者所有模型的初始参数完全一样导致解码得分相同。更常见的原因是 Viterbi 里delta初始化时pi只有进入状态为 1其他为 0如果进入状态到第一个真实状态的转移概率没学好所有路径都会塌缩。解决初始化时给进入状态到各状态一个小的均匀概率不要只给一条路径。5.4 现象训练时间长得离谱跑一晚上没收敛MATLAB 里三重循环算 GMM 概率是性能杀手。把log_obs_prob向量化用矩阵运算代替逐帧循环。另外forward_backward里的xi是三维结构如果状态数 10、帧数 100每次迭代要算 10×10×100 个值样本一多就爆。可以只累积A_num不存完整xi边算边加。我的经验是向量化之后训练时间能降 5 到 8 倍。5.5 现象加噪后识别率暴跌HMM 对加性噪声很敏感因为 MFCC 的分布被噪声改变了。如果应用场景有噪声训练时就要做数据增强给干净语音叠加不同信噪比的高斯白噪声或实际背景噪声重新提取 MFCC 训练。另一个办法是改用倒谱均值方差归一化CMVN对每个倒谱系数做零均值单位方差能抵消一部分信道和噪声影响。注意 CMVN 的统计量要在训练集上算测试时用同一组参数不能各自归一化。6. 把识别率再往上推区分性训练与模型自适应的小技巧前面讲的都是最大似然训练它优化的是生成概率不是分类边界。如果你已经把基线跑通识别率卡在 90% 左右上不去可以试两个进阶方向。第一个是区分性训练比如最小分类错误MCE准则在 Baum-Welch 的基础上加一个针对混淆字的修正项让模型不仅拟合自己的数据还主动远离易混字的数据。实现上是在重估公式里对混淆对的概率做加权代码改动不大但在小词表上通常能涨 2 到 4 个百分点。第二个是说话人自适应用最大后验MAP或最大似然线性回归MLLR把通用模型往目标说话人上偏。孤立字场景下如果每个用户能提供 3 到 5 条自适应语音MLLR 变换矩阵一估识别率提升很明显。MATLAB 里实现 MLLR 的核心是解一个线性方程组把均值向量做仿射变换网上有现成的公式照着写二十行就够。还有一个我常用的技巧多帧拼接。把相邻 3 帧的 MFCC 拼成一个 117 维向量再送 HMM能引入短时动态信息对辅音区分帮助很大。代价是维度高了GMM 协方差要用对角阵且训练样本要够。我在 20 个字的词表上试过拼接后识别率从 89% 提到 93%但训练时间翻了将近一倍。值不值得做看你的实时性要求。最后说一个验证方法别只用自己录的数据。找不同性别、不同语速的几个人各录一遍做交叉验证。如果换人之后识别率掉超过 15 个百分点说明模型泛化不够优先做 CMN 和加噪增强而不是急着加状态数。我自己踩过的最大坑就是在一个小数据集上把参数调得天花乱坠换一批录音直接打回原形。后来养成的习惯是任何参数改动先在留出说话人上验证再回头调训练集。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

TradeX.dll与Trade.dll接口原理及C#实盘调用指南

TradeX.dll与Trade.dll接口原理及C#实盘调用指南

简介:本资源是面向量化交易开发者与金融系统集成工程师的Trade系列交易接口工具集,整合了经典Trade.dll与新一代TradeX.dll(行情交易二合一)两大技术路线,解决多版本接口分散、兼容性差、开发环境搭建繁琐等实际痛点。…

2026/10/14 15:36:31 阅读更多 →
TrueType字体解析实战:从表目录到字形轮廓的完整拆解

TrueType字体解析实战:从表目录到字形轮廓的完整拆解

简介:这是一份面向字体技术开发者与图形编程爱好者的TrueType格式解析类源码,聚焦于将复杂的TTF字体文件结构封装为可复用的C类,帮助读者在游戏开发、图形设计软件或文本渲染引擎中集成自定义字体处理能力。资源包共2个文件,包含1…

2026/10/14 15:36:31 阅读更多 →
基于OpenCV与pyautogui的屏幕理解与自动控制框架解析

基于OpenCV与pyautogui的屏幕理解与自动控制框架解析

简介:这套基于Python的王者荣耀自动游戏脚本,面向对游戏自动化感兴趣的Python学习者与开发者,聚焦图像识别、界面交互、事件监听、多线程协同及反作弊意识等技术点的综合实战。资源共62个文件、667KB,核心包括6个py源码、8个pyc编…

2026/10/14 15:36:31 阅读更多 →

最新新闻

ITE V12.4 Update固件包刷写指南:增量升级、参数配置与故障排查

ITE V12.4 Update固件包刷写指南:增量升级、参数配置与故障排查

简介:ITE_V12.4_Update.rar 是嵌入式控制器(EC)V12.4 版本源代码,主要面向嵌入式系统开发者、软硬件协同工程师及相关专业学生,用于剖析 EC 在电源管理、风扇控制、键盘输入、系统安全和主处理器通信等底层硬件管理中的…

2026/10/14 16:22:34 阅读更多 →
Java GUI实战:Swing实现算术题生成与在线批改完整方案

Java GUI实战:Swing实现算术题生成与在线批改完整方案

简介:这是一套基于Java GUI技术开发的算术题在线练习与批改项目,适合Java初学者、学生或课程设计者用于理解图形界面编程、随机出题、文件读写与数据持久化。压缩包共55个文件,主体包含33个class编译文件与17个java源文件,另有2个…

2026/10/14 16:22:34 阅读更多 →
Android多列表嵌套滑动冲突终结者:ConsecutiveScrollerLayout原理与实战

Android多列表嵌套滑动冲突终结者:ConsecutiveScrollerLayout原理与实战

1. 这个布局到底解决了什么痛点做过Android复杂详情页或者多列表嵌套的兄弟应该都有过这种体验:一个页面里塞了Banner轮播、横向商品列表、纵向评论列表、底部推荐流,每个模块单独拿出来滑动都没问题,可一旦拼在同一个页面里,手指…

2026/10/14 16:22:34 阅读更多 →
八皇后问题的工程化实现:DFS剪枝与Java性能优化

八皇后问题的工程化实现:DFS剪枝与Java性能优化

1. 项目概述:一道经典题目的真实分量“八皇后”这三个字,在算法入门圈子里,几乎等同于“递归初体验”“回溯第一课”“DFS手把手教学”。但很多人刷完洛谷P1219后只记得“输出前三个解总解数”,却没意识到——这道标着“java&…

2026/10/14 16:22:34 阅读更多 →
Grin 区块与区块头处理全解析:正常接收、追赶同步与分叉重组的源码级指南

Grin 区块与区块头处理全解析:正常接收、追赶同步与分叉重组的源码级指南

区块链Web3 【免费下载链接】grin Minimal implementation of the Mimblewimble protocol. 项目地址: https://gitcode.com/gh_mirrors/gr/grin 点击查看 免费下载 本篇技术指南以 Grin 仓库中的《Blocks and Block headers》文档为骨架,系统讲解 Mimbl…

2026/10/14 16:22:34 阅读更多 →
如何靠真实预览图选风格:ppt-image-first首页、目录页、正文页三页预览法完全解析

如何靠真实预览图选风格:ppt-image-first首页、目录页、正文页三页预览法完全解析

AI 技能工作流自动化AI 应用 【免费下载链接】ppt-image-first PPT image-first skill for Codex/Claude Code/Opencode CLI 项目地址: https://gitcode.com/gh_mirrors/ppt/ppt-image-first 点击查看 免费下载 ppt-image-first 是一个 image-first 的 PPT 工作流 …

2026/10/14 16:21:33 阅读更多 →

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/14 7:53:34 阅读更多 →