今天看到一篇"一个视频自动加字幕的小工具,如何做到月入2W"的博文(突字幕,有兴趣的同学可以度娘,作者的动手能力确实很强!),考虑实现这个小工具就能做到这个收入,还是挺让人羡慕的!在当前人工智能、机器学习的热度不减的当下,依托成熟三方服务或者开源实现,实现一个类似的应用理论上是不难的,而核心的技术难点也显而易见,主要在语音识别,以及机器翻译的准确性上,考虑到商用,所以感觉最大可能是使用了三方成熟的API!
关键功能点,给视频自动添加多语种字幕,大概的实现流程:
1、视频中音频部分提取! -> 源码改造ffmpeg,或者直接命令提取,大多数三方识别平台只识别PCM,所以提取再加上转码,可以参考:https://www.zhihu.com/question/389948583
ffmpeg -i input.mp4
Stream #0:2(chi): Audio: ac3, 48000 Hz, stereo, fltp, 448 kb/s
将mp4文件转换为pcm音频文件命令参数:-i 输入文件
-an 去除音频流
-vn 去除视频流
-acodec 设置音频编码
-f 强制指定输入或输出文件的编码
-ac 设置音频轨道数,
-ar 设置音频采用频率
-y 不经过确认,直接覆盖同名文件
# 例如,以下是将t1801.mp4文件,去除视频流并用pcm_s16le进行音频编码,输出文件也采用s16le编码,同时音轨为1且采样频率为16000:
ffmpeg -i t1801.mp4 -vn -acodec pcm_s16le -f s16le -ac 1 -ar 16000 t1801.pcm
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
2、语音识别,音频部分转文字! -> 使用讯飞进行pcm语音识别?或者 python的语音识别库、或者语音模块,autosub_app?
文字部分需要增加时间戳信息,这部分可能需要手动解析PCM包实现?
3、文字翻译,比方中文转英文! -> 使用商用的API,百度、腾讯等云服务商均有提供机器翻译API;
4、将文字+时间戳生成外挂式SRT字幕文件,后台服务程序处理即可!
一个典型的SRT文件如下(截取自阿凡达中英字幕):
3
00:00:39,770 --> 00:00:41,880
在经历了一场人生巨变之后
When I was lying there in the VA hospital ...
4
00:00:42,550 --> 00:00:44,690
我被送进了退伍军人管理局医院
... with a big hole blown through the middle of my life,
5
00:00:45,590 --> 00:00:48,120
那段时间我经常会梦到自己在飞翔
... I started having these dreams of flying.
6
00:00:49,740 --> 00:00:51,520
终获自由
I was free.
7
00:00:54,620 --> 00:00:55,830
而不幸的是
Sooner or later though, ...
2 SRT格式化设置
多数SRT支持一些特定格式化,比如斜体、粗体、下划线以及字体颜色。使用时需要基于HTML的标签,具体用法如下:
<font color=red>颜色</font>
<i>字体斜体</i>
<u>字体下加划线</u>
<br>换行
<b>字体加粗</b>
这些HTML可嵌套。
当然某些播放器还对SRT做了扩展,可以支持ASS/SSA中部分格式化代码。
SRT文件格式参考:https://www.cnblogs.com/tocy/p/subtitle-format-srt.html
http://ale5000.altervista.org/subtitles.htm
5、字幕和视频合成!
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4
-c:v copy -c:a copy -c:s mov_text不适用于-c copy
-c:v copy -c:a copy -c:s mov_text的顺序很重要。 你在告诉FFmpeg:
视频:copy,Audio:copy,Subtitle:copy
副标题:mov_text
ffmpeg -i 01.mkv -vf subtitles=01.ass 01_out.mkv
未验证的方法,增加字幕流:
ffmpeg -i video.avi -i sub.ass -map 0:0 -map 0:1 -map 1 -c:a copy -c:v copy -c:s copy video.mkv