我这里使用上一篇的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
}