C#实现无声视频的配音与字幕生成器
一、项目概述
本人使用C#实现一个运行在 Windows 上的 .NET 8 WinForms 应用程序,能够将一段无声的演示或教学视频,通过用户输入文字,自动生成配音和字幕,最终合成为有声的 MP4 视频。
该项目适用于技术博客展示、教学课件配音、文化资料管理项目、动态图文交互场景等。
二、应用场景
- 无声视频配音编辑
- 需要文字说明的展示场景
- 教学课件自动配音
- 外语版本时序文字加评解
三、技术路线
项目主要由以下技术模块组成:
- 字幕生成模块(SubtitleHelper):根据用户输入文字,智能切分为语句或短句,并按语速推算播放时间,生成 .srt 字幕文件。
- 文本转语音模块(TtsHelper):使用系统 TTS API 将输入文字转为 .wav 音频文件。
- 音视频合成模块(FfmpegHelper):调用 FFmpeg,将原始无声视频 + 配音音频 + 字幕文件进行合成,输出带声音和字幕的视频。
- 用户界面模块(WinForms):提供直观操作界面,包括导入视频、粘贴文字、生成字幕和语音、一键合成输出等功能。
四、字幕生成算法(SubtitleHelper.cs)
思路说明
字幕的生成核心是将一整段文字,按照语义和显示时长合理分段。处理方式如下:
- 使用正则表达式按中文句号、问号、感叹号等进行断句;
- 将每句根据字符长度进一步分割成 20 个字以内的小段,防止字幕过长超出屏幕;
- 按照平均语速(每秒3.3个字)估算每段文字的显示时长;
- 最终生成符合 SRT 格式的字幕内容。
实现代码
public static string SplitTextToSrt(string text, double wordsPerSecond = 3.3){var sentences = Regex.Split(text, @"(?<=[。?!!?])");var sb = new StringBuilder();double currentTime = 0;int index = 1;foreach (var sentence in sentences){if (string.IsNullOrWhiteSpace(sentence)) continue;// 对每个句子进行分行foreach (var line in SmartSplit(sentence.Trim(), 20)){var duration = line.Length / wordsPerSecond;var start = TimeSpan.FromSeconds(currentTime);var end = TimeSpan.FromSeconds(currentTime + duration);sb.AppendLine(index.ToString());sb.AppendLine($"{FormatTime(start)} --> {FormatTime(end)}");sb.AppendLine(line);sb.AppendLine();currentTime += duration;index++;}}return sb.ToString();}// 将长句分割为每行不超过 maxLen 个字符的短句private static IEnumerable<string> SmartSplit(string input, int maxLen){for (int i = 0; i < input.Length; i += maxLen){yield return input.Substring(i, Math.Min(maxLen, input.Length - i));}}// 格式化为 SRT 时间格式 hh:mm:ss,mmmprivate static string FormatTime(TimeSpan time) =>time.ToString(@"hh\:mm\:ss\,fff");
五、系统 TTS 配音(TtsHelper.cs)
思路说明
为简化开发,我们先使用 Windows 自带的 System.Speech 语音合成库,它无需额外安装任何包。基本逻辑是:
- 使用 SpeechSynthesizer 创建合成器实例;
- 设置输出路径为 .wav 文件;
- 调用 Speak() 合成整段文字为音频。
实现代码
public static void GenerateSpeech(string text, string outputPath){using var synth = new SpeechSynthesizer();synth.Rate = 0; // 语速 0 为中等// 输出到指定 wav 文件synth.SetOutputToWaveFile(outputPath);// 开始合成synth.Speak(text);}
后续可拓展更自然的 TTS(如 Coqui TTS、VITS),并通过 Python 服务或 REST API 接入。
六、FFmpeg 合成视频(FfmpegHelper.cs)
思路说明
借助 FFmpeg 的强大能力,我们将:
- 视频流(无声) + 音频流(配音) + 字幕文件(srt)
- 使用 -map 精准选择轨道,-vf subtitles 加载字幕
- -shortest 确保音视频同步结束
实现代码
public static void CombineVideoAudioSubtitle(string videoPath, string audioPath, string srtPath, string outputPath){// 构建 FFmpeg 命令var command = $"/C ffmpeg -y -i \"{videoPath}\" -i \"{audioPath}\" -vf subtitles=\"{srtPath}\" -map 0:v -map 1:a -shortest \"{outputPath}\"";// 使用命令行执行Process.Start(new ProcessStartInfo("cmd.exe", command){CreateNoWindow = true,UseShellExecute = false});}
注意:需要在系统 PATH 中配置好 ffmpeg.exe 所在目录,或将ffmpeg.exe放在.NET程序运行的文件夹里(如 D:\SilentVideoNarrator\bin\Debug\net8.0-windows\)。
七、项目结构与操作流程
在项目(本例取名为 SilentVideoNarrator)文件夹中,包含的文件及文件如下图所示:
项目结构
- 项目的关键文件有:
- Program.cs
- MainForm.cs / MainForm.Designer.cs
- SubtitleHelper.cs
- TtsHelper.cs
- FfmpegHelper.cs
项目结构如下图所示:
操作流程
程序的界面如下图所示:
视频生成字幕和配音的操作流程如下:
- 启动程序,点击“导入视频”,导入无声 MP4;
- 输入要讲解的文字;
- 点击“生成字幕和配音”:自动输出字幕.srt 和语音.wav;
- 点击“导出视频”:一键合成带字幕和配音的视频并保存。
八、后续扩展建议
- 接入 Coqui TTS、VITS 等开源高自然度语音
- 自动识别视频片段变化,智能断句分段
- 支持角色语气、语言切换、男女声选择
- 云端生成 + 本地缓存功能
九、结语
SilentVideoNarrator 是一个轻量但实用的工具,能快速解决无声视频无法传递信息的问题。它的算法简洁,操作便捷,适合开发者和内容创作者参考使用,也具备良好的二次开发拓展空间。转载和展示请注明出处。