【教程】每天30分钟免费的视频⾃动⽣成字幕的⽅法
0.问题
经常要剪视频,有时候⾃⼰讲的希望能加个字幕,但是⽹上基本都是收费的,⽽且对于我这种做视频没什么收⼊的UP主来说有点贵了。所以⼀直在寻⼀个便捷⼀点的或者说省钱⼀点的⽅法。
但是⼿机上发现有个软件效果还不错,每天免费30分钟:
显⽰是会员有30分钟,会员就是注册⼀下。
快剪辑快字幕功能操作流程如下
1. 新建项⽬
2. 选择要⽣成字幕的视频
3. 选择原始⽐例(可以随便)
4. 选择⼀段要⾃动⽣成字幕的⽚段点⽣成
5. 编辑调整字幕
其实到这⾥的话已经可以⽣成字幕达到⽬的了,但是快剪辑的字幕⽣成慢,⽽且不好剪辑,想导出到srt字幕⽂件到电脑上⼀起完成剪辑。
1.解决
在应⽤存储⽂件夹下到了这个⽂件
⾥⾯的内容,疑似json保存的项⽬⼯程⽂件
⽤JSON格式化⼯具看发现,字幕是在stickerlist属性下的text属性,开始和结束时间分别是startTime属性和endTime属性,时间是视频开始到当前的毫秒数。
于是我利⽤这个⽂件,⽤Python写了⼀个提取字幕的脚本
#!/usr/bin/python
# coding=UTF-8
import json
import time
import srt
from datetime import timedelta
def FlowlogToSrt(log):
#解析Json为字典
视频教程免费fldict = json.loads(log)
#获取字幕列表
stickerlist = fldict['stickerlist']
#取出字幕
index = 0
subs = []
for sticker in stickerlist:
#序列号
index = index + 1
#开始时间
startTime = timedelta(milliseconds = sticker["startTime"])
#结束时间
endTime = timedelta(milliseconds = sticker["endTime"])
#内容
text = sticker["text"]
#转成srt对象,并存⼊列表
subs.append(srt.Subtitle(index=index, start=startTime, end=endTime, content=text))
#转成srt
srtText = ""
for sub in subs:
srtText = srtText + _srt()
print(srtText)
#写⼊⽂件
filename = "KuaiJianJiSticker"+time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime())+".srt"
with open(filename, 'w', encoding="utf-8") as file_object:
file_object.write(srtText)
if __name__ == "__main__":
txt = input("请输⼊⼿机快剪辑flowlog数据:(数据位于/Android/data/com.qihoo.qeditor/files/keyfiles/flowlog下)\n") FlowlogToSrt(txt)
把那个⽂件上传到电脑,输⼊到代码⾥
但是好像⽂件太⼤了,因为我的是35分钟的会议,基本都有⼈在说话。
那只好提取出有⽤的部分咯
于是在这⾥格式化了⼀下代码,把结果放到另外⼀个⽂件⾥。
⽤Java写了以下代码,⽤于提取出⼤致的JSON结构和所需要的部分属性:
package clearJSON;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
//⽂件路径
static String Path = "D:/eclipse-workspace/clearJSON/";
//结果缓存
static StringBuilder res = new StringBuilder();
public static void main(String[] args) throws IOException, InterruptedException {
//⾏数统计
int lineNumber = 0;
//读取⽂件
FileInputStream fis=new FileInputStream(Path);
InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = "";
while ((adLine())!=null) {
lineNumber++;
//结构保留
if(line.indexOf('{')!=-1 || line.indexOf('}')!=-1) {
add(line);
//保证添加的不是空对象
if((adLine())!=null) {
//结构⾥⾄少有⼀个属性,添加以“{”开头的下⼀⾏
add(line);
}
continue;
}
//属性保留,需要的属性可以以此类推添加到这⾥
if(line.indexOf("\"startTime\"")!=-1 || line.indexOf("\"text\"")!=-1 || line.indexOf("\"endTime\"")!=-1) {
add(line);
}
}
br.close();
fis.close();
//输出结果
System.out.println("⼀共处理⽂件⾏数:"+lineNumber);
//输出精简后的JSON代码
Thread.sleep(2000);
System.out.String());
}
/**
* 添加⽂本到缓存⾥
* 完成对结构的判断,依靠‘}’在第⼀个字符判断是⼀组属性的结尾,
* 然后删除上⼀⾏⾏末的‘,’
* @param str 要添加的⽂字
*/
public static void add(String str) {
//判断是不是⼀组属性的结尾
im().indexOf('}') == 0) {
//删除上⼀⾏⾏末的逗号
res.deleteCharAt(res.length()-1);
}
//添加到缓存
res.append(str);
}
}
把JSON代码精简到了原来⼤⼩的8.6%:
之后再输⼊到Python⾥。
成功⽣成SRT⽂件!
导⼊到ARCTIME中:
成功导⼊到ARCTIME中!
2.总结
基本完成了需求,但是步骤有些⿇烦。
今后可以尝试合并Java和Python的部分。
写这篇⽂章的原因主要还是没钱。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论