通过本文,你将了解如何编写字幕脚本,然后使用字幕脚本生成人机配音和与之相匹配的字幕文件。

为了节约读者的阅读时间,我就先列举一下整体思路:

  1. 确定每句话的起始时间。
  2. 使用「文本转语音」服务将每个句子转换成语音。
  3. 使用「FFmpeg」将每段语音按照起始时间合成。
  4. 由于每段语音的长度已知,便不难得到与之对于的字幕文件。

首先,确定每句话的起始时间并记录,这个过程的实现方式有很多,大家自由发挥吧!在本文中,我使用「CSV 格式」来记录每句话的时间点,例如:

0:00,今天教大家怎么启动虚拟机
0:05,首先,打开虚拟机软件
0:10,找到启动按钮并点击
0:15,等待虚拟机完成启动
0:25,这样便启动好了虚拟机
0:30,感谢大家观看,再见

接下来就需要将文本转换成语音。由于我没钱(穷~)买各大平台的「TTS」接口,为了省钱,我就使用网页提供的免费 TTS 服务来生成语音。本例中,我使用的是 Free Text to Speech Online - TTSMaker - 20230516。为了减少操作步骤,我们可以在「设置」中「调节每一个段落(换行)的停顿时间」为 2000 毫秒,等下我们可以使用 ffmpeg 来进行裁剪。由于,我是使用 Excel 编辑的 CSV 文件,所以我可以直接选择文本(第二列)复制到 TTSMaker 输入框中。

接下来,我就先直接列出 ffmpeg 相关命令的使用方法,大家可以自由发挥来使用他们:

获取静音节点
https://efcomputer.net.au/blog/splitting-audio-files-by-detecting-silence-using-ffmpeg

ffmpeg -i 文件名 -af silencedetect=d=时间间隔 -f null -

截取音频
https://superuser.com/questions/525210/splitting-an-audio-file-into-chunks-of-a-specified-length

ffmpeg -ss 起始时间点 -i 输入文件 -c copy -t 时间间隔 输出文件

拼接音频
https://superuser.com/questions/1092291/merge-many-audio-files-with-specific-positions/1092346#1092346

ffmpeg -i 音频1 -i 音频2 以此类推
  -filter_complex
    "[1]adelay=184000|184000[b];
     [2]adelay=360000|360000[c];
     [3]adelay=962000|962000[d];
     [0][b][c][d]amix=4"
输出文件

下面,我就简单讲一下,如何使用编程语言来实现利用 ffmpeg 完成切割、拼接、生成等全部操作。我的思路是,写一个类叫做「时间线」,用于管理一组音频和一组文本,时间节点应该是下面的结构:

@dataclass
class TimeSpot:
    start: timedelta
    duration: timedelta | None
    text: str | None
    audio: Path | None

我们将音频切割后导入时间线,每个时间节点可以取到「start」、「duration」和「audio」这三个字段。我们将字幕脚本导入时间线,这样每个时间节点可以取到「start」、「text」这两个字段。然后,我们将两个时间线合并,得到新的时间段:

节点字段音频时间线字幕时间线合并时间线字段来自于
start字幕
duration 音频
text 字幕
audio 音频

这样我们得到的合并时间线便有了我们生成字幕和音频的一切。

最后修改:2024 年 03 月 02 日
如果觉得我的文章对你有用,请随意赞赏