【教程】每天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 + sub.to_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分鍾的會議,基本都有人在說話。

  • 那只好提取出有用的部分咯
    於是在JSON在線格式化這里格式化了一下代碼,把結果放到另外一個文件里。
    用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/clearJSON/json.txt"; 
	//結果緩存
	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 ((line=br.readLine())!=null) {
        	lineNumber++;
        	
        	//結構保留
        	if(line.indexOf('{')!=-1 || line.indexOf('}')!=-1) {
        		add(line);
        		//保證添加的不是空對象
				if((line=br.readLine())!=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.println(res.toString());
	}
	
	/**
	 * 添加文本到緩存里
	 * 完成對結構的判斷,依靠‘}’在第一個字符判斷是一組屬性的結尾,
	 * 然后刪除上一行行末的‘,’
	 * @param str 要添加的文字
	 */
	public static void add(String str) {
		//判斷是不是一組屬性的結尾
		if(str.trim().indexOf('}') == 0) {
			//刪除上一行行末的逗號
			res.deleteCharAt(res.length()-1);
		}
		//添加到緩存
		res.append(str);
	}
}
  • 把JSON代碼精簡到了原來大小的8.6%:

  • 之后再輸入到Python里。

    成功生成SRT文件!

  • 導入到ARCTIME中:

    成功導入到ARCTIME中!

2.總結

  • 基本完成了需求,但是步驟有些麻煩。
  • 今后可以嘗試合並Java和Python的部分。
  • 寫這篇文章的原因主要還是沒錢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM