一、项目概述
本人使用C#实现一个运行在 Windows 上的 .NET 8 WinForms 应用程序,能够将一段无声的演示或教学视频,通过用户输入文字,自动生成配音和字幕,最终合成为有声的 MP4 视频。
该项目适用于技术博客展示、教学课件配音、文化资料管理项目、动态图文交互场景等。
二、应用场景
三、技术路线
项目主要由以下技术模块组成:
四、字幕生成算法(SubtitleHelper.cs)
思路说明
字幕的生成核心是将一整段文字,按照语义和显示时长合理分段。处理方式如下:
实现代码
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 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,mmm
private static string FormatTime(TimeSpan time) =>
time.ToString(@"hh\:mm\:ss\,fff");
五、系统 TTS 配音(TtsHelper.cs)
思路说明
为简化开发,我们先使用 Windows 自带的 System.Speech 语音合成库,它无需额外安装任何包。基本逻辑是:
实现代码
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 的强大能力,我们将:
实现代码
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)文件夹中,包含的文件及文件如下图所示:
项目结构
项目结构如下图所示:
操作流程
程序的界面如下图所示:
视频生成字幕和配音的操作流程如下:
八、后续扩展建议
九、结语
SilentVideoNarrator 是一个轻量但实用的工具,能快速解决无声视频无法传递信息的问题。它的算法简洁,操作便捷,适合开发者和内容创作者参考使用,也具备良好的二次开发拓展空间。转载和展示请注明出处。