C#实现无声视频的配音与字幕生成器

一、项目概述

本人使用C#实现一个运行在 Windows 上的 .NET 8 WinForms 应用程序,能够将一段无声的演示或教学视频,通过用户输入文字,自动生成配音和字幕,最终合成为有声的 MP4 视频。

该项目适用于技术博客展示、教学课件配音、文化资料管理项目、动态图文交互场景等。


二、应用场景

  • 无声视频配音编辑
  • 需要文字说明的展示场景
  • 教学课件自动配音
  • 外语版本时序文字加评解

三、技术路线

项目主要由以下技术模块组成:

  1. 字幕生成模块(SubtitleHelper):根据用户输入文字,智能切分为语句或短句,并按语速推算播放时间,生成 .srt 字幕文件。
  2. 文本转语音模块(TtsHelper):使用系统 TTS API 将输入文字转为 .wav 音频文件。
  3. 音视频合成模块(FfmpegHelper):调用 FFmpeg,将原始无声视频 + 配音音频 + 字幕文件进行合成,输出带声音和字幕的视频。
  4. 用户界面模块(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 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 语音合成库,它无需额外安装任何包。基本逻辑是:

  • 使用 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)文件夹中,包含的文件及文件如下图所示:

C#实现无声视频的配音与字幕生成器_第1张图片

项目结构

  •         项目的关键文件有:
    • Program.cs
    • MainForm.cs / MainForm.Designer.cs
    • SubtitleHelper.cs
    • TtsHelper.cs
    • FfmpegHelper.cs     

        项目结构如下图所示:

C#实现无声视频的配音与字幕生成器_第2张图片

操作流程

程序的界面如下图所示:

C#实现无声视频的配音与字幕生成器_第3张图片

视频生成字幕和配音的操作流程如下:

  1. 启动程序,点击“导入视频”,导入无声 MP4;
  2. 输入要讲解的文字;
  3. 点击“生成字幕和配音”:自动输出字幕.srt 和语音.wav;
  4. 点击“导出视频”:一键合成带字幕和配音的视频并保存。

八、后续扩展建议

  • 接入 Coqui TTS、VITS 等开源高自然度语音
  • 自动识别视频片段变化,智能断句分段
  • 支持角色语气、语言切换、男女声选择
  • 云端生成 + 本地缓存功能

九、结语

SilentVideoNarrator 是一个轻量但实用的工具,能快速解决无声视频无法传递信息的问题。它的算法简洁,操作便捷,适合开发者和内容创作者参考使用,也具备良好的二次开发拓展空间。转载和展示请注明出处。

你可能感兴趣的:(WinForms,C#,Windows窗体应用,视频配字幕软件,视频配音软件,文字生成字幕,文字生成配音)