0
点赞
收藏
分享

微信扫一扫

node.js使用ass生成视频字幕(上)

脱下愤怒的小裤衩 2022-04-17 阅读 46
node.js

我这里使用上一篇的vosk生成文字

https://blog.csdn.net/qq_22071421/article/details/124224582?spm=1001.2014.3001.5502

创建一个js文件

import fs from "fs"
const cp = require("child_process");
import subtitle from "./subtitle";
import operUtil from "./operUtil";
export default {
    async createAss(that,dir){
        let word=that.word
        await fs.readFile('static/temp/subtitle.temp', function (err, data) {
            if (err) {
                return console.error(err);
            }
            let res=data.toString()
            res=subtitle.wordHandle(that,res)
            fs.writeFile(dir+'.ass',res,  function(err) {
                if (err) {
                    return console.error(err);
                }
                let ass=operUtil.dirFormat(dir)+'.ass'
                subtitle.insertAssByVideo(that,ass,dir)
            });
        });
    },

}

dir是文件路径,提前把ass头部写入一个.temp文件中

[Script Info]
; Script generated by Aegisub 3.2.2
; http://www.aegisub.org/
Title: Default Aegisub file
ScriptType: v4.00+
WrapStyle: 0
ScaledBorderAndShadow: yes
YCbCr Matrix: TV.601
PlayResX: 1960
PlayResY: 1080

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
#Style: Default,微软雅黑,50,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,50,1

ass文本拼凑

 wordHandle(that,data){
        let res=data

        //放置文本format
        res+="\n\r[Events]" +
            "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n"
        let nowTime=0
        let nowLen=0
        let leftTime=null
        let isEmpty=false
        for(let i=0;i<that.word.length;i++){
            let left=that.word[i].size*that.duration/that.fileSize

            if(!that.word[i].word){
                if(!isEmpty){
                    leftTime=operUtil.minToTimeer(nowTime)
                    isEmpty=true
                }else{
                    //TODO
                }
            }else{
                res+='Dialogue: 0,'+leftTime+','
                    +operUtil.minToTimeer(nowTime+left)+',*Default,,0,0,0,,'+that.word[i].word+'\n'
                isEmpty=false
            }

            nowTime=nowTime+left
            nowLen+=that.word[i].size
        }
        return res
    }
举报

相关推荐

0 条评论