基于深度学习的音频分离实战:从原理到应用,以Demucs和UVR为例
在音乐制作与音频处理领域将一首完整的歌曲进行精确的拆分提取出纯净的人声、伴奏乃至各个乐器音轨是许多音乐爱好者、内容创作者和开发者都曾遇到过的需求。无论是为了制作卡拉OK伴奏、进行混音学习、创作Remix还是进行更深层次的音乐信息检索MIR研究音频分离技术都扮演着关键角色。然而面对网上零散的教程、复杂的专业软件和效果不一的在线工具很多人常常感到无从下手。本文将以日本流行乐队 Every Little Thing 的经典歌曲《说不出口》UNSPEAKABLE为例手把手带你走通一套高效、高质量的音频分离实战流程。我们将从核心工具的选择与原理讲起逐步深入到环境配置、代码实操、结果优化以及常见问题排查。无论你是想为心爱的歌曲制作双语字幕MV的纯净伴奏还是希望学习这项实用的音频处理技能本文提供的完整方案和代码都能让你直接复用快速获得理想成果。1. 背景与核心概念什么是音频分离在开始实战之前我们有必要厘清几个核心概念这有助于理解后续工具的选择和工作原理。音频分离Audio Source Separation是指从一段混合的音频信号如一首完整的歌曲中将不同的声源成分分离出来的技术。最常见的分离目标包括人声Vocals歌手演唱的部分。伴奏Accompaniment除人声外的所有部分通常包括鼓、贝斯、吉他、键盘等乐器。各乐器音轨Stems更进一步将伴奏分离为独立的鼓组、贝斯、钢琴、其他乐器等音轨。为什么传统方法难以实现高质量分离一首制作完成的歌曲是各个音轨经过混音Mixing和母带处理Mastering后的产物所有声音在频率、时间和空间声像上都交织在一起。简单地使用均衡器EQ过滤某个频段虽然能削弱某些乐器但也会严重损伤人声且无法彻底分离效果很差。现代音频分离技术如何实现目前主流的高质量方案都基于深度学习。其基本思路是使用大量已标注的“混合音频-源音频”配对数据例如成千上万首歌曲及其分轨文件训练神经网络模型。模型学习到音频信号中不同声源如人声、鼓、贝斯的深层特征和模式。在推理阶段当输入一首新的歌曲时模型就能根据学到的知识预测并生成出各个分离后的音源。本文将使用的Demucs和Ultimate Vocal Remover (UVR)都是基于此类技术的优秀开源工具。2. 环境准备与工具选型工欲善其事必先利其器。我们将介绍两个最主流、效果最好的工具并给出详细的环境准备步骤。2.1 工具介绍与选型建议Demucs (by Facebook Research)特点开源命令行工具基于PyTorch模型更新活跃分离质量极高尤其在人声和伴奏的分离上表现出色。支持分离为4轨vocals人声,drums鼓,bass贝斯,other其他。适用场景追求最高分离质量熟悉命令行操作希望在本地批量处理音频的开发者和高级用户。项目地址https://github.com/facebookresearch/demucsUltimate Vocal Remover (UVR)特点提供图形化界面GUI和命令行界面集成了多个先进的分离模型包括Demucs内置音频处理工具链如降噪、音高修正对用户非常友好。适用场景不熟悉命令行的普通用户需要图形化操作或希望快速试听和调整参数。项目地址https://ultimatevocalremover.com/选型建议如果你是开发者或技术爱好者希望将分离功能集成到自己的项目或进行批量处理推荐使用Demucs它更轻量、纯粹。如果你是音乐爱好者或内容创作者主要进行单曲或少量歌曲的处理追求便捷的操作和试听推荐使用UVR的图形界面。考虑到教程的完整性和代码的可复现性本文将主要使用Demucs进行演示因为它能更清晰地展示从环境搭建到代码执行的全过程。同时也会简要介绍 UVR 图形界面的使用方法。2.2 基础环境准备 (以 Demucs 为例)我们将在一个干净的 Python 环境中进行。请确保你的系统已安装 Python (推荐 3.8 - 3.10)。步骤 1创建并激活虚拟环境使用虚拟环境可以避免包依赖冲突是 Python 项目的最佳实践。# 打开终端 (Linux/macOS) 或命令提示符/PowerShell (Windows) # 创建一个名为 audio_sep 的虚拟环境 python -m venv audio_sep # 激活虚拟环境 # 在 Windows 上 audio_sep\Scripts\activate # 在 Linux/macOS 上 source audio_sep/bin/activate激活后你的命令行提示符前通常会显示(audio_sep)表示已进入该环境。步骤 2安装 PyTorchDemucs 依赖 PyTorch。请根据你的操作系统和是否有 GPUCUDA前往 PyTorch 官网 获取安装命令。以下提供两个常见示例# 示例1安装仅支持CPU的PyTorch通用速度较慢 pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu # 示例2安装支持CUDA 11.8的PyTorch如果你有NVIDIA GPU并安装了对应驱动和CUDA pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu118步骤 3安装 Demucs在虚拟环境中使用 pip 安装 Demucs。pip install demucs为了获得更好的体验我们还可以安装一个用于播放音频的库如sounddevice和一个用于音频处理的库如librosa非必须但很有用。pip install sounddevice librosa至此核心环境就准备好了。3. 核心原理与 Demucs 模型浅析了解工具背后的原理能帮助我们在使用和调优时更有方向。Demucs 的核心是一个时域音频分离网络。与早期在频域如频谱图上进行分离的方法不同Demucs 直接处理原始的波形信号时域。它的网络结构通常包含编码器Encoder将输入的混合音频波形通过一系列卷积层转换为一个高维的中间表示潜空间特征同时进行下采样。分离模块Separator在潜空间中对特征进行建模和分离。这部分是核心可能使用循环神经网络RNN、Transformer或卷积层来学习声源之间的复杂关系并为每个源生成一个掩码Mask或直接估计源信号。解码器Decoder将分离后的潜空间特征通过转置卷积层上采样重构回原始采样率的波形信号分别输出人声、鼓等音轨。Demucs 提供了多个预训练模型如htdemucs默认且推荐、htdemucs_ft在专业音乐数据上微调过质量更高等。运行时会自动下载对应的模型文件。4. 完整实战分离《说不出口》的人声与伴奏现在让我们进入实战环节。假设我们已经获得了 Every Little Thing - 《UNSPEAKABLE》的高质量音频文件例如unspeakable.mp3或unspeakable.wav。请确保你拥有该音频文件的合法使用权。4.1 使用命令行快速分离Demucs 安装后最简单的使用方式就是通过命令行。将终端工作目录切换到你的音频文件所在文件夹。# 基本命令格式 demucs [选项] 音频文件路径 # 实际示例分离 unspeakable.mp3 demucs unspeakable.mp3运行后Demucs 会开始下载模型首次运行需要然后进行分离。分离完成后会在当前目录下生成一个separated文件夹其结构如下separated/ └── htdemucs/ # 使用的模型名称 └── unspeakable/ # 以歌曲名命名的子文件夹 ├── bass.wav ├── drums.wav ├── other.wav └── vocals.wav # 这就是我们想要的人声音轨如果你只想要人声和伴奏非人声部分可以稍后将drums.wav,bass.wav,other.wav用音频编辑软件如 Audacity混合在一起得到伴奏。或者使用 Demucs 的--two-stems参数直接输出人声和伴奏。# 直接分离为人声和伴奏两轨 demucs --two-stemsvocals unspeakable.mp3运行后在输出文件夹中你会得到vocals.wav和no_vocals.wav伴奏。4.2 使用 Python 脚本进行精细控制对于更复杂的场景比如集成到自动化流程、调整参数或处理多个文件编写 Python 脚本更灵活。下面是一个完整的示例脚本separate_audio.py# separate_audio.py import torch import argparse from demucs import pretrained from demucs.apply import apply_model from demucs.audio import AudioFile, save_audio import warnings warnings.filterwarnings(ignore) def separate_tracks(input_path, output_dir./separated, model_namehtdemucs, deviceNone): 使用Demucs分离音频文件。 参数: input_path (str): 输入音频文件路径。 output_dir (str): 输出目录。 model_name (str): 使用的模型名称如 htdemucs, htdemucs_ft。 device (str or torch.device): 运行设备cuda 或 cpu。 if device is None: device cuda if torch.cuda.is_available() else cpu print(f使用设备: {device}) # 1. 加载预训练模型 print(f正在加载模型 {model_name}...) model pretrained.get_model(model_name).to(device) model.eval() # 2. 加载音频文件 print(f正在加载音频文件: {input_path}) # AudioFile会自动进行重采样以匹配模型期望的采样率 wav AudioFile(input_path).read(streams0, sampleratemodel.samplerate, channelsmodel.audio_channels) # 转换为Tensor并添加批次维度 wav torch.from_numpy(wav).unsqueeze(0).to(device) # 3. 应用模型进行分离 print(正在分离音轨... (这可能需要一些时间取决于音频长度和硬件)) with torch.no_grad(): # 禁用梯度计算节省内存 sources apply_model(model, wav, shifts1, splitTrue, overlap0.25, progressTrue) # sources 形状: [批次, 音轨数, 通道数, 采样数] # 4. 保存分离出的音轨 # Demucs 默认音轨顺序: [drums, bass, other, vocals] stems [drums, bass, other, vocals] import os import pathlib # 创建输出目录 base_name pathlib.Path(input_path).stem track_output_dir pathlib.Path(output_dir) / model_name / base_name track_output_dir.mkdir(parentsTrue, exist_okTrue) print(f正在保存音轨到: {track_output_dir}) for stem, source in zip(stems, sources.squeeze(0)): # 将Tensor转回numpy数组并移除批次维度 audio source.cpu().numpy().T # 转置为 [采样数, 通道数] output_path track_output_dir / f{stem}.wav save_audio(audio, str(output_path), sampleratemodel.samplerate) print(f 已保存: {stem}.wav) print(分离完成) # 5. (可选) 混合生成伴奏轨 (no_vocals) print(正在生成伴奏轨 (no_vocals.wav)...) # 伴奏 鼓 贝斯 其他 accompaniment sources.squeeze(0)[0:3].sum(dim0).cpu().numpy().T acc_path track_output_dir / no_vocals.wav save_audio(accompaniment, str(acc_path), sampleratemodel.samplerate) print(f 已保存: no_vocals.wav) if __name__ __main__: parser argparse.ArgumentParser(description使用Demucs分离音频人声和伴奏。) parser.add_argument(input, typestr, help输入音频文件路径) parser.add_argument(-o, --output, typestr, default./separated, help输出目录) parser.add_argument(-m, --model, typestr, defaulthtdemucs, choices[htdemucs, htdemucs_ft, mdx], help选择分离模型) parser.add_argument(-d, --device, typestr, help强制使用设备如 cpu 或 cuda) args parser.parse_args() separate_tracks(args.input, args.output, args.model, args.device)如何使用这个脚本将上述代码保存为separate_audio.py。在终端中确保处于激活的虚拟环境并导航到脚本所在目录。运行脚本# 基本用法 python separate_audio.py unspeakable.mp3 # 指定输出目录和模型 python separate_audio.py unspeakable.mp3 -o ./my_output -m htdemucs_ft # 强制使用CPU如果GPU内存不足 python separate_audio.py unspeakable.mp3 -d cpu4.3 使用 UVR 图形界面快速处理对于不想敲命令的用户UVR 提供了极其友好的界面。下载与安装从 UVR 官网下载对应操作系统的安装包如.exe或.dmg并安装。基本操作流程打开 UVR。在Input区域点击Select Input选择你的unspeakable.mp3文件。在Output区域点击Select Output选择保存结果的文件夹。在AI Model下拉菜单中选择一个模型。对于人声分离VR Architecture下的5_HP-Karaoke-UVR.pth或6_HP-Karaoke-UVR.pth是不错的选择你也可以选择Demucs架构的模型。可选调整参数如Aggression Setting处理强度。点击Start Processing开始分离。输出处理完成后在输出文件夹你会找到类似unspeakable_(Vocals).wav和unspeakable_(Instrumental).wav的文件。UVR 的优点是即时试听、参数可调并且集成了后期处理功能如降噪、音高标准化适合快速获得可直接使用的成品。5. 结果评估与常见问题排查分离完成后如何判断质量以及遇到问题怎么办5.1 分离质量评估用音频播放器如 Foobar2000, VLC或音频编辑软件如 Audacity打开分离出的vocals.wav和no_vocals.wav。人声轨应尽可能纯净包含少量混响是正常的但不应有明显的乐器残留如突出的贝斯或鼓点。伴奏轨应完整且自然不应有人声“鬼影”即原人声旋律的微弱残留。仔细聆听副歌部分这里人声和伴奏通常交织最紧密是检验分离效果的“试金石”。《说不出口》这首歌的分离难点ELT 的音乐编曲通常层次丰富人声与电子合成器、吉他等乐器融合度很高。高质量的模型如htdemucs_ft能较好地处理但在极高频和极低频处可能仍有轻微残留或损伤这属于当前技术的普遍局限。5.2 常见问题与解决方案问题现象可能原因解决思路报错CUDA out of memoryGPU 显存不足无法处理长音频或高精度模型。1. 使用-d cpu参数强制在 CPU 上运行。2. 使用 Demucs 的--segment参数如--segment10将音频切分成10秒片段处理减少单次内存占用。分离出的音频有卡顿或杂音可能是原始音频文件本身有损或模型在处理复杂段落时出现 artifacts人工痕迹。1. 确保输入音频是高质量的无损或高码率有损格式如 WAV, FLAC, 320kbps MP3。2. 尝试 UVR 中不同的模型有些模型对特定音乐风格更鲁棒。3. 在 UVR 中尝试启用Post-process选项如降噪。人声轨里有明显的背景和声或广告音这些声音在声学特征上与人声主唱接近模型难以区分。这是当前技术的难点。可以尝试用音频编辑软件手动衰减这些片段或寻找官方 instrumental 版本。命令行运行 demucs 无反应或报错Python 环境或依赖问题。1. 确认虚拟环境已激活(audio_sep)。2. 尝试重新安装demucspip install --upgrade demucs。3. 检查 PyTorch 是否安装正确在 Python 中运行import torch; print(torch.__version__)。UVR 处理速度非常慢使用了大型模型且电脑性能尤其是CPU较弱。1. 在 UVR 设置中尝试选择更小的模型如非-Large版本。2. 确保电脑电源模式为高性能。6. 最佳实践与工程化建议将音频分离从单次操作变为稳定可靠的流程需要考虑更多。输入音频质量是关键尽可能使用最高质量的源文件如 CD 抓轨的 FLAC/WAV。低码率 MP3 会丢失大量细节导致分离效果下降并引入更多噪声。批量处理自动化如果你需要处理大量歌曲可以编写一个简单的 Shell 脚本或 Python 循环。# 示例Linux/macOS Shell 脚本 batch_separate.sh #!/bin/bash for file in ./music_library/*.mp3; do echo “正在处理: $file” demucs --two-stemsvocals “$file” -o ./output_library done# 示例Python 批量处理 import glob import subprocess import os input_dir “./music_library” output_dir “./output_library” os.makedirs(output_dir, exist_okTrue) for mp3_file in glob.glob(os.path.join(input_dir, “*.mp3”)): print(f“Processing {mp3_file}...”) # 使用命令行调用 subprocess.run([“demucs”, “—two-stemsvocals”, mp3_file, “-o”, output_dir], checkTrue)结果后处理分离出的音轨通常是 32 位浮点 WAV 格式体积较大。可以使用ffmpeg进行格式转换和压缩同时进行响度标准化如 EBU R128。# 将 vocals.wav 转换为 320k MP3并进行响度标准化 ffmpeg -i vocals.wav -af “loudnormI-16:LRA11:TP-1.5” -c:a libmp3lame -b:a 320k vocals.mp3模型选择策略通用流行/摇滚音乐htdemucs_ft通常是效果最好的选择。古典音乐或纯音乐可能不需要人声分离或者使用更通用的模型。实时或低延迟需求需要寻找专为实时性优化的轻量级模型而非 Demucs。合法与合规使用务必牢记分离出的音频版权仍归原始权利人所有。个人学习、研究、制作字幕配乐等通常属于合理使用范畴但严禁用于商业发行、盗版传播或任何侵犯原作品版权的行为。为像《说不出口》这样的作品制作双语字幕并分享是一种推广和致敬但应明确标注原作品信息。通过以上步骤你应该已经成功将《说不出口》的人声与伴奏清晰分离并掌握了这项技术的核心使用方法。从环境搭建到脚本编写从工具使用到问题排查这套流程可以迁移到任何你需要的歌曲上。音频分离技术仍在快速发展未来会有更精准的模型出现但当前基于深度学习的方案已经能为我们的创作和学习提供强大的助力。

相关新闻

AI视觉生成:从扩散模型到工程化落地的可控工作流

AI视觉生成:从扩散模型到工程化落地的可控工作流

上周,我帮一个做内容的朋友处理一批视频素材,他指着屏幕上一个极其逼真的手部特写镜头问我:“这得花多少钱请特效团队?”我告诉他,这可能不是特效,而是用AI“做”出来的。他愣了几秒,然后问了一…

2026/10/11 4:16:28 阅读更多 →
BetterGenshinImpact终极指南:如何用智能原神自动化助手解放你的游戏时间

BetterGenshinImpact终极指南:如何用智能原神自动化助手解放你的游戏时间

BetterGenshinImpact终极指南:如何用智能原神自动化助手解放你的游戏时间 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条…

2026/10/10 18:12:45 阅读更多 →
Node.js构建高并发民宿管理系统的实战经验

Node.js构建高并发民宿管理系统的实战经验

1. 项目概述:当Node.js遇上民宿管理去年帮朋友改造他那套手工Excel管理的民宿时,我意识到传统管理方式存在三大痛点:订单漏单率高达15%、房态更新延迟严重、跨平台数据无法同步。这正是我们选择Node.js构建民宿管理系统的核心原因——通过异步…

2026/10/14 8:12:20 阅读更多 →

最新新闻

Kiln AI Server Python 客户端库使用指南:同步/异步 API 调用与高级定制实战

Kiln AI Server Python 客户端库使用指南:同步/异步 API 调用与高级定制实战

人工智能AI 应用AI 评测RAG微调提示工程开发工具桌面应用 【免费下载链接】Kiln Build, Evaluate, and Optimize AI Systems. Includes evals, RAG, agents, fine-tuning, synthetic data generation, dataset management, MCP, and more. 项目地址: https://gitcod…

2026/10/14 18:22:46 阅读更多 →
鸿蒙应用内添加服务卡片到桌面:权限配置至formId管理的完整实践

鸿蒙应用内添加服务卡片到桌面:权限配置至formId管理的完整实践

前两天有个开发者在我写的卡片文章下面留言:应用里能不能直接触发“添加卡片到桌面”?用户根本不知道要长按桌面再选卡片,好多功能做出来都没人发现。这个问题其实问的人挺多的。鸿蒙的服务卡片虽然好用,但系统默认的添加路径藏在…

2026/10/14 18:22:46 阅读更多 →
自制轻量级单片机UI框架:低资源平台的架构设计与内存优化

自制轻量级单片机UI框架:低资源平台的架构设计与内存优化

我最早动起"自制轻量级单片机UI框架"这个念头,是在一个被现成UI库逼疯的下午。手里这块板子的MCU只给了64KB Flash和16KB RAM,产品需求却要一个带按钮、进度条和多级菜单的界面。我试着把一个开源UI库编进去,编译完一看&#xff0c…

2026/10/14 18:22:46 阅读更多 →
51单片机红外遥控NEC解码与波形显示方案

51单片机红外遥控NEC解码与波形显示方案

简介:这是一套基于51单片机的红外遥控解码与波形显示项目资料,面向电子爱好者、嵌入式初学者以及单片机课程设计/毕业设计人群,解决从红外信号接收、脉冲解码到LCD波形显示的全流程实现问题。压缩包共38个文件、9.68MB,涵盖C语言源…

2026/10/14 18:22:46 阅读更多 →
uIP TCP/IP协议栈实战:从Client到Server的嵌入式移植全解析

uIP TCP/IP协议栈实战:从Client到Server的嵌入式移植全解析

简介:基于uIP协议栈的TCP客户端与服务器程序,源自ALIENTEK战舰STM32开发板第52章,面向使用STM32与ENC28J60进行嵌入式网络通信的开发者。资源包含完整工程与配套文档,共223个文件,以C语言源文件(76个.c&…

2026/10/14 18:22:46 阅读更多 →
JavaScript sort排序原理与常见陷阱解析

JavaScript sort排序原理与常见陷阱解析

先说个我自己的真实经历。有次帮同事排查一个列表排序问题,数据是几组数字,他写了 arr.sort() ,结果排出来是 [1, 10, 2, 22, 3] 这种完全看不懂的顺序。他盯着屏幕看了半天,第一反应是"sort排序坏了"。其实不是坏了…

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

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

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

2026/10/14 16:30:29 阅读更多 →
影刀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 阅读更多 →