免费工具链自制ニコカ拉:音轨分离、字幕打轴与FFmpeg合成
有些歌曲在 Niconico 或 B 站上传者手里是“视频越做越精音轨处理越来越糙”而当你想自己动手给喜欢的那首同人曲做一个能跟唱的卡拉 OK 版时会发现情况完全反过来你手里可能只有一个原始音频甚至只有一个混音完成的视频文件。既没有工程文件也找不到官方伴奏想给歌词配上能跟着唱的字幕更不知道该从哪一步开始。这就是自制ニコカラ的真实处境。所谓“ニコカラ”简单说就是 Niconico 上常见的卡拉 OK 视频保留原曲画面或自制画面配上带节奏提示的歌词字幕再分出一个 on vocal带主唱和 off vocal纯伴奏的版本方便观众先听原唱、再跟伴奏练习。很多人觉得这不过是在视频上压一行字幕真正动手后才发现没有伴奏就去网上找找不到就放弃找到字幕模板又不知道时间轴怎么对好不容易把音轨做出来了合成时又出现音画不同步。我给你的判断是自制ニコカラ本质上不是视频剪辑工作而是一条标准的三段式音频工程流水线——音轨分离、字幕打轴、双版本合成。其中真正决定成品质量的不是你会不会用“高级”的视频软件而是你能不能把每一段流程拆清楚、把每一步的验证标准定明白。这篇文章就以曲目《Salt, Pepper, Birds, and the Thought Police》为例用一套完全免费、可复制的流程从零带你做出 on/off vocal 两个版本的卡拉 OK 视频。读完你不仅能跑通整套制作链路还能掌握素材对齐、字幕打轴、FFmpeg 合成等一套通用方法以后换任何一首歌都能直接复用。1. 这篇文章真正要解决的问题先说说为什么明明有现成的剪辑工具我们还要单独研究“制作ニコカラ”这件事。对普通观众来说ニコカラ视频就是一个“视频字幕两版音轨”的成品。但对制作者来说它至少包含三个独立的工程环节第一你手里的音频可能不是干净的。很多同人曲、翻唱曲、音游曲只有 MP3 或视频封装不存在“官方伴奏”。要做出 off vocal 版本就必须从混音里把伴奏“拆”出来。第二歌词和音乐必须逐句对齐。卡拉 OK 的字幕不是简单的“整句显示”而是按音节或小节点亮。如果时间轴偏慢 0.3 秒跟唱体验会非常差。第三要输出两个文件。on vocal 和 off vocal 在音轨上不同但画面和字幕保持一致。手动做两份工程文件容易失控标准做法是搭建一个统一的目录和合成脚本。这三个问题分别对应音频处理、字幕制作和视频合成的能力边界。很多人卡住不是因为某一个环节有多难而是因为他们用“剪视频”的思路去解决“做音频”的问题结果在每个环节都遇到了不熟悉的概念。所以我们这篇文章要解决的核心问题可以概括成一句话在不依赖原始工程文件、不付费购买伴奏的前提下如何用一套免费工具链完成ニコカラ的 on/off vocal 双版本制作并且在每个环节都有可验证的检查点。适合读这篇文章的人有两类一类是想把自己喜欢的歌曲做成卡拉 OK 视频的爱好者另一类是做翻唱内容、需要处理音轨和字幕的创作者。如果你只是想找一个现成的伴奏文件这篇也值得看因为你会知道为什么“直接找伴奏”往往不如“自己分离”可靠。2. 基础概念ニコカラ、on/off vocal 与三段式流程2.1 什么是ニコカラニコカラNico Karaoke是 Niconico 平台上一种视频类型特点是画面配合歌词字幕并且通常提供两个音轨版本on vocal带有主唱声音的版本适合观众先熟悉旋律和唱法。off vocal去掉主唱、只保留伴奏的版本适合自己跟唱或录音参考。国内 B 站也会看到类似形式的“卡拉 OK 字幕”视频但ニコカラ更强调“双版本可选”的发布习惯。有些创作者会把两个版本做成一个视频的音轨切换但更常见的做法是同一首歌发布两个独立视频用户根据自己的练习阶段去选择。2.2 为什么 off vocal 版最难搞定同人曲和原创曲最容易遇到的问题没有官方伴奏。即使创作者发布了完整版也可能只发布在流媒体平台或只在现场演出中听过伴奏。网络上的“消音伴奏”很多是用 EQ 和相位抵消做的效果通常很糟——乐器频段被削弱人声残留明显还伴随严重的金属声。而 AI 音源分离技术改变了这件事。它不再是简单地把中频切掉而是通过训练模型识别“人声”和“伴奏”各自的频谱特征再从混音中重建出两个音轨。这类工具的代表包括 UVR5Ultimate Vocal Remover和 Meta 开源的 Demucs。有了 AI 分离技术自制 off vocal 的质量已经接近“能用”的水平这也是现在可以认真讨论“自己做ニコカラ”的原因之一。2.3 三段式流程总览成熟的自制流程可以拆成三步音轨分离从原始混音音频中分离出人声和伴奏并对伴奏做必要的降噪、响度归一化。字幕制作用打轴工具逐句标记歌词时间并添加卡拉 OK 节奏效果。双版本合成分别把 on vocal 音轨、off vocal 音轨与画面、字幕封装成两个视频文件。每一步的输出都会成为下一步的输入所以每一步都必须有明确的验证标准。下面这张表概括了整条链路流程环节输入输出验证标准音轨分离原始混音音频vocals.wav、instrumental.wav人声/伴奏无明显串扰无爆音音频后期instrumental.wavinstrumental_clean.wav音量均衡无低频嗡嗡声字幕制作歌词文本、歌曲音频subtitle.ass逐句歌词对齐节奏标签正确双版本合成视频画面、两版音轨、字幕on_vocal.mp4、off_vocal.mp4音画同步字幕无闪烁双版本切换正常你会注意到整个链路里没有一个环节是“给视频加字幕”那么简单。它更像一个微型音频生产线而你要同时担任素材准备、质量检查和最终封装三个角色。3. 环境准备免费工具链与目录设计这一节先解决“用什么工具”和“怎么组织文件”两个问题。工具选择以免费、跨平台、可脚本化优先。3.1 工具清单以下工具都可以在 Windows、macOS 或 Linux 上使用安装方式各有不同但功能一致工具用途可选替代DemucsAI 音源分离命令行工具UVR5 图形界面、SpleeterAudacity音频降噪、响度归一化、波形检查Reaper、Adobe AuditionAegisub字幕打轴和卡拉 OK 特效制作Subtitle Edit、ArcTimeFFmpeg音视频封装、转码、硬字幕合成无建议优先掌握MediaInfo查看媒体文件编码参数VLC 的媒体信息面板Demucs 的优势是命令行调用方便便于写进自动化脚本UVR5 的优势是图形界面直观模型选择多。如果你不熟悉命令行可以先从 UVR5 入门但建议把 Demucs 也装上因为后面“批量处理”的场景中命令行工具效率高得多。3.2 安装要点Demucs 依赖 Python 环境和 PyTorch建议在虚拟环境中安装python -m venv demucs_env source demucs_env/bin/activate # Windows 下使用 demucs_env\Scripts\activate pip install demucs安装后可以执行demucs --help确认成功。首次运行某个模型时Demucs 会自动下载模型权重需要保持网络连接。Aegisub 和 Audacity 直接用官方安装包安装即可不需要额外配置。FFmpeg 是很多工具的关键依赖安装后请在终端里确认ffmpeg -version如果提示找不到命令需要先把 FFmpeg 的可执行目录加入系统 PATH或者使用完整路径调用。3.3 工程目录设计制作过程会产生大量中间文件。如果不做目录规划很容易在最后合成时弄混版本。建议为每首歌单独建立一个工程目录project/ ├── _source/ # 原始素材视频、音频、歌词文本 │ ├── song.mp4 # 原始视频或音频 │ └── lyrics.txt # 歌词文本 ├── audio/ # 音频处理产物 │ ├── vocals.wav # 分离出的人声 │ ├── instrumental.wav # 分离出的伴奏 │ └── instrumental_clean.wav# 处理后的伴奏 ├── subtitle/ # 字幕文件 │ └── subtitle.ass └── output/ # 最终成品 ├── on_vocal.mp4 └── off_vocal.mp4这样做的好处是原始素材永远留在_source里不会被动改audio和subtitle两个目录可以独立保存版本方便反复调整output目录里的文件就是可以直接发布的成品。很多人做到一半出了问题时往往就是因为所有文件堆在一个文件夹里分不清哪个是最终版。4. 核心流程一用 Demucs 分离音轨4.1 为什么选择 Demucs音源分离领域的模型有很多但 Demucs 是其中效果稳定、上手成本低的一个。它以“混合 Transformer 模型”作为核心能处理常见的音乐分离任务。我们在ニコカラ制作中只需要人声和伴奏两组音轨因此使用--two-stemsvocals参数即可。4.2 分离命令先把原始视频中的音轨提取出来。如果是 MP4 文件直接用 FFmpeg 拉取ffmpeg -i _source/song.mp4 -vn -ac 2 -ar 44100 audio/source_stereo.wav这一步把视频里的音频提取为 44.1kHz、双声道的 WAV 文件保证后续处理不会因为采样率不一致出现音调偏差。如果你的原始素材已经是单声道或 48kHz也可以用 MediaInfo 先检查再决定是否转换。然后执行分离demucs --two-stemsvocals audio/source_stereo.wav -o audio/demucs_output命令输出后会在audio/demucs_output/htdemucs/目录下生成vocals.wav和no_vocals.wav两个文件。htdemucs是 Demucs 默认使用的模型名称。为了方便后续使用把文件改名mv audio/demucs_output/htdemucs/source_stereo/vocals.wav audio/vocals.wav mv audio/demucs_output/htdemucs/source_stereo/no_vocals.wav audio/instrumental.wav4.3 分离后的检查与处理分离完成后立刻用播放器听一遍两个轨人声轨里应该能清楚听到歌声伴奏可能带有轻微的“水声”或“撕裂感”这是 AI 分离的正常副作用。伴奏轨里应该没有明显的主唱残留鼓、贝斯、键盘的节奏仍然清晰。如果伴奏中还能听到清晰的歌声说明原始音频比较复杂可以尝试更换 Demucs 的其他模型例如htdemucs_ft它的分离质量通常更好但耗时更长。这一步最容易忽略的是音量。人声轨和伴奏轨分离后响度可能相差很多。建议用 Audacity 打开伴奏轨先查看波形再执行“效果 → 响度归一化”目标值设置为 -16 LUFS 左右具体以你的输出平台规范为准。这个操作不是必需的但能让最终成品的听感稳定很多。最后用一句话归纳这一环节分离的目标不是得到“绝对干净”的伴奏而是得到“不再影响跟唱”的伴奏。完美分离在现实中很难达成我们要做的是在成本和效果之间找一个平衡点。5. 核心流程二用 Aegisub 制作卡拉 OK 字幕5.1 歌词准备与打轴字幕制作的第一步是拿到歌词并逐句对齐。你可以在_source/lyrics.txt里整理歌词文本建议按“一句一行”的格式排列Aegisub 会自动识别并逐条生成事件。打开 Aegisub选择“文件 → 打开音频”加载audio/source_stereo.wav。然后对着波形或直接播放找到每一句歌词的开始和结束时间。快捷键可以分句定位听到句子开始前一瞬间按“播放/暂停”并记录时间点句子结束后再记录一个时间点。这个过程叫“打轴”。新手容易犯的错误是只关心句子起点不关心终点。但卡拉 OK 字幕需要知道每个句子渲染的结束时间如果终点设置晚了下一句会出现覆盖或重叠。5.2 卡拉 OK 标签Aegisub 最核心的功能是卡拉 OK 模板。它的原理很简单在每个字或音节的开始处插入\k标签播放到对应时间点时字幕笔画会从左侧开始填充颜色形成逐字变色的效果。这里用的是 ASS 字幕的卡拉 OK 标签模式最常用的是\k按百分之一秒计时和\kf更平滑的填充效果。一个简单的示例如下Dialogue: 0,0:00:01.00,0:00:03.50,Default,,0,0,0,,{\kf40}S{\kf20}alt {\kf30}Pe{\kf20}pper {\kf40}B{\kf30}irds分解来看{\kf40}S先处理“S”这个字母持续 40 厘秒也就是 0.4 秒。{\kf20}alt然后是“alt ”这一串持续 0.2 秒。后面依次类推。Aegisub 提供了自动化工具选中音频后按节奏敲击键盘会自动为每个字符生成标签。所以不建议手动写标签而应该用 Aegisub 的“卡拉 OK 计时”功能逐个音节打点。5.3 字幕样式设置ニコカラ字幕质量很大程度取决于样式设置。比较稳妥的设置是使用清晰的中等偏粗字体自带描边放置在画面下方或中下方。推荐使用Noto Sans CJK JP这类同时支持日文汉字和假名的字体。一份完整的 ASS 脚本文件包含了脚本头、样式表和事件表。下面是可以直接参考的最小模板[Script Info] ScriptType: v4.00 PlayResX: 1920 PlayResY: 1080 [V4 Styles] Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding Style: Default,Noto Sans CJK JP,60,H00FFFFFF,H000000FF,H00101010,H64000000,0,0,0,0,100,100,0,0,1,3,1,2,80,80,80,1 [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:01.00,0:00:03.50,Default,,0,0,0,,{\kf40}S{\kf20}alt {\kf30}Pe{\kf20}pper {\kf40}B{\kf30}irds其中PrimaryColour是文字主体颜色但卡拉 OK 播放时被点亮的部分使用SecondaryColour显示。因此建议把PrimaryColour设置为偏暗的白色SecondaryColour设置为醒目的亮色例如黄色或青色这样音节点亮后的对比度会更好。样式里还有两个容易被忽略的参数Outline描边建议 2 到 3 像素不能太小否则在浅色画面上文字会看不清。Shadow阴影建议 1 像素只要能让文字与背景稍微分离即可阴影过大反而显得脏。5.4 字幕检查打轴完成后一定要先在 Aegisub 里完整播放一遍。重点检查每句歌词的结束时间是否紧接下一句的开始时间不能有大段空白。卡拉 OK 标签是否在每个字前都有有没有漏掉标点或空格。有没有句子因为过长被超出画面边界。字幕文件保存为subtitle/subtitle.ass建议使用 UTF-8 编码避免字体显示异常。6. 核心流程三用 FFmpeg 合成双版本视频6.1 理解合成需求最后一步是把画面、音轨和字幕封装在一起。我们有两个音轨on vocal 和 off vocal一套共用字幕一个原始视频画面。目标输出两个 MP4 文件output/on_vocal.mp4视频画面 原始混音或人声伴奏的重新混合 字幕。output/off_vocal.mp4视频画面 分离后的伴奏 字幕。这里的关键决策是用软字幕还是硬字幕。软字幕把 ASS 文件作为独立轨道封装进 MP4播放器可以自由开关字幕文件体积更小但部分播放器或在线平台可能无法渲染 ASS 的特效。硬字幕用 FFmpeg 把字幕以烧录方式画进画面最终视频像“烤”进去的文字任何播放器都能看到这是许多ニコカラ发布时的常见做法。对在线发布来说硬字幕更稳妥因为平台转码后不会丢失字幕。我们这里演示硬字幕的方案。6.2 on vocal 版本合成命令先处理 on vocal 版本。按照设计on vocal 也应该挂上字幕音轨使用原始音频即可ffmpeg -y \ -i _source/song.mp4 \ -i audio/source_stereo.wav \ -vf asssubtitle/subtitle.ass \ -map 0:v:0 -map 1:a:0 \ -c:v libx264 -preset medium -crf 18 \ -c:a aac -b:a 320k \ -shortest \ output/on_vocal.mp4参数说明-vf asssubtitle/subtitle.ass将 ASS 字幕烧录到画面上。如果文件路径中有空格记得加引号。-map 0:v:0 -map 1:a:0明确选择第一个输入文件的视频流以及第二个输入文件的第一个音频流。-c:v libx264 -preset medium -crf 18使用 H.264 编码CRF 18 属于视觉无损范围。-c:a aac -b:a 320k音频使用 AAC 编码。-shortest输出长度以较短的流为准避免画面太长或声音太长导致异常。6.3 off vocal 版本合成命令off vocal 版本唯一区别是音频轨换成audio/instrumental_clean.wavffmpeg -y \ -i _source/song.mp4 \ -i audio/instrumental_clean.wav \ -vf asssubtitle/subtitle.ass \ -map 0:v:0 -map 1:a:0 \ -c:v libx264 -preset medium -crf 18 \ -c:a aac -b:a 320k \ -shortest \ output/off_vocal.mp4如果你需要把 on vocal 版本做成“人声伴奏”的混合而非原始音频也可以在分离后用 FFmpeg 的amix滤镜把vocals.wav和instrumental_clean.wav重新混合再作为音轨输入。一般情况下原始音频是最好的 on vocal 音源所以建议优先直接使用source_stereo.wav。7. 运行结果与效果验证FFmpeg 命令执行完成后请用播放器打开output/on_vocal.mp4和output/off_vocal.mp4逐项检查检查项标准检查方法音轨内容on vocal 有人声off vocal 无主唱分别播放在副歌部分对比字幕显示有逐字变色效果无乱码打开视频直接观看音画同步人声、节奏与画面动作一致在画面有明显动作的时间点对比字幕时间轴歌词与唱词一一对应从开头连续播放 1 分钟画面完整性无黑边、无花屏、无字幕溢出快进到几个时间点抽查如果发现字幕整体偏移可以选择修改 ASS 文件。在 Aegisub 中使用“时间 → 平移时间”功能可以用一个固定偏移量调整全部歌词的起始时间比如整体提前 0.3 秒。调整后重新保存再执行一次 FFmpeg 合成命令即可。如果发现音画不同步第一步先检查两个输入文件的参数是否一致。用 MediaInfo 分别查看_source/song.mp4和audio/source_stereo.wav的采样率如果一个是 44100Hz一个是 48000Hz必须在提取音频时统一到同一个采样率。如果发现 FFmpeg 命令报错不要慌张。把错误信息中Error后面那部分关键词输入搜索引擎大多数情况都是路径错误、编码器不支持或滤镜参数问题。8. 常见问题与排查方法结合整个流程的实际操作经验这里列出最容易踩到的 7 个问题问题现象可能原因排查方式解决方案Demucs 分离出的伴奏仍有明显人声原曲混音复杂默认模型能力不足在 Audacity 中放大波形查看中频残留使用--two-stemsvocals -n htdemucs_ft重新分离分离后的伴奏有“金属声”AI 分离导致的音色染色听高频部分是否刺耳在 Audacity 中用低通或动态降噪轻微处理字幕不显示ASS 文件路径写错或编码异常查看 FFmpeg 输出的 filter 错误检查路径引号将 ASS 转为 UTF-8 编码字幕没有逐字变色效果使用了软字幕或播放器不支持 ASS 特效在 FFmpeg 命令行确认ass滤镜改用硬字幕烧录方式音画不同步音频采样率不一致MediaInfo 查看采样率提取音频时统一为 44100Hz合成视频长度比原视频长/短音轨长度与视频不等查看文件时长加上-shortest参数播放时字体变方块系统中缺少对应日文字体查看字体渲染错误安装 Noto Sans CJK JP 或更换字体名称如果你遇到“人声彻底消失但伴奏也残缺”的情况这属于分离模型处理高频打击乐时的固有问题。处理思路不是反复重试同一模型而是换模型或用 Audacity 做多段手动修补——把音频裁成多个片段分别处理再拼接回来。对于单曲制作而言这一步的性价比很高。9. 最佳实践与工程建议9.1 保留全部中间产物分离出来的 vocals 和 instrumental字幕的初始版本和调整版本都建议保留在工程目录里。因为它们不仅是当前作品的素材也是后续做其他歌曲时的参考样本。特别是调整好的 ASS 样式可以存为独立模板下次新建工程直接复制使用。9.2 建立字幕样式模板ニコカラ的字幕风格虽然多种多样但基本要素是一致的主色、点亮色、描边、阴影、字体。建议你固定一两套自己的默认样式比如“日文大字版”和“双语对照版”。这样每首歌的字幕风格统一观众也更容易形成辨识度。9.3 统一命名规范文件命名建议采用“歌名_版本_分辨率”的格式例如SaltPepperBirds_offvocal_1080p.mp4 SaltPepperBirds_onvocal_1080p.mp4避免出现“最终版”“真最终版”“最后最后版”这类无意义命名这种命名方式在多人协作或长期维护时会造成严重混乱。9.4 质量控制清单发布前建议按以下清单做一次收尾检查两个版本是否都包含字幕。off vocal 版本的人声残留是否在你可接受范围内。音量是否稳定副歌部分是否存在破音。字幕是否在画面安全框内不会在网页播放器里被裁掉。视频编码是否为 H.264 或 H.265音频是否为 AAC以保证平台兼容性。9.5 版权与发布注意事项ニコカラ本质上是粉丝向二次创作。发布时务必在简介中注明歌曲原作者、原曲信息以及视频素材来源。不同平台对二次创作的审核规则不同有些平台要求提供原曲链接有些平台禁止直接搬运。建议在发布前查阅平台的相关规定不要因为工具链足够顺手就随意传播使用受限的素材。10. 总结与后续学习方向自制ニコカラ这套流程核心在于把“做视频”的模糊感觉变成“跑工程”的清晰步骤。音轨分离、字幕打轴、双版本合成每一段都有自己的输入、输出和验收标准。你在《Salt, Pepper, Birds, and the Thought Police》上跑通的这套流程可以直接复用到任何同人曲或原创曲上——只要你有音频就能做出可用的 on/off vocal 双版本。如果你接下来想继续深入建议优先研究三个方向Demucs 的模型和参数了解不同模型对乐器类型的偏好能让你在分离特定风格音乐时做出更准确的判断。Aegisub 的模板自动化学习用模板功能和 Lua 脚本批量生成卡拉 OK 效果不再手工逐字打点。FFmpeg 的滤镜体系掌握amix、sidechaincompress、eq等音频滤镜就能在合成阶段直接完成混音调整而不是把所有处理都堆到 Audacity 里做。整个项目中最值得保留的资产不是那两个 MP4 成品而是你调整稳定的字幕样式模板、一条可靠的分离命令以及你亲手验证过的工程目录结构。这些东西会让你下一次制作时直接从“重新走一遍流程”变成“只需要跑一遍命令”。