通过本文,你将了解如何编写字幕脚本,然后使用字幕脚本生成人机配音和与之相匹配的字幕文件。
为了节约读者的阅读时间,我就先列举一下整体思路:
- 确定每句话的起始时间。
- 使用「文本转语音」服务将每个句子转换成语音。
- 使用「FFmpeg」将每段语音按照起始时间合成。
- 由于每段语音的长度已知,便不难得到与之对于的字幕文件。
首先,确定每句话的起始时间并记录,这个过程的实现方式有很多,大家自由发挥吧!在本文中,我使用「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 时间间隔 输出文件
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 | ✔ | 音频 |
这样我们得到的合并时间线便有了我们生成字幕和音频的一切。