一种字幕文件编辑方法及加载应用的字幕编辑器
文献发布时间:2024-04-18 20:01:23
技术领域
本申请涉及字幕编辑领域,特别是涉及一种字幕文件编辑方法及加载应用的字幕编辑器。
背景技术
字幕指的是以文字形式显示电视、电影、舞台作品中的对话等非影像内容,在影像视频中正确合适的字幕将使得影像内容以高质量的方式被展示,特别的,对于面对于适龄孩童的英语教学视频而言,字幕的重要性是不言而喻的。
目前市面上也存在一些字幕编辑器,比如VideoSrtPro这款视频字幕编辑器,其可以支持SRT、ASS、VTT格式的字幕的编辑和修改,但无法支持JSON数据格式的字幕的编辑。然而JSON格式相较于SRT、ASS、VTT格式具有更大的灵活性和扩展性,可以更好地适配于各类应用平台的数据处理,比如在线翻译平台大部分都直接对接于JSON格式的数据。由于目前的字幕编辑器不支持JSON格式的数据编辑,故导致现有的字幕编辑器需要引入额外的字幕编辑器(如Notepad++、Sublime Text、Subtitle Edit、Aegisub等)对SRT、ASS、VTT格式的字幕进行翻译,或者需要将SRT、ASS、VTT格式的字幕导出转换后再利用在线翻译工具进行翻译,存在翻译效率低、准确度低的问题。
发明内容
本申请实施例提供了一种字幕文件编辑方法及加载应用的字幕编辑器,通过将上传的字幕自动转换为Go结构体对象数据结构,将Go结构体对象数据结构转换为JSON格式的数据进行在线编辑,提高字幕编辑的质量和效率。
第一方面,本申请实施例提供了一种字幕文件编辑方法方法,所述方法包括:获取上传的srt格式或vtt格式的字幕文件,将vtt格式的字幕文件转换为srt格式;定义Go结构体对象数据结构;调用os.open打开srt格式的字幕文件,调用bufio.NewScanner以及scanner.Scan逐行循环遍历字幕文件的内容,其中在循环遍历字幕文件的内容的过程中将内容中识别到的序号、时间戳和文字加入到块切片内,每当出现空内容时则将块切片加入到二维切片中;循环遍历二维切片根据序号、时间戳和文本按照对应的格式存储在Go结构体对象数据结构中得到Go结构体对象,其中Go结构体对象内包括多个按照序号排列的结构单体,每一结构单体含有序号、时间戳和文本;将Go结构体对象转换为json数据显示在前端页面,基于前端页面获取的编辑要求调用后端的Go结构体对象进行编辑操作,并将编辑操作后的Go结构体对象依旧以json数据显示在前端页面。
第二方面,本申请实施例提供了一种字幕文件编辑器,包括前端页面和后端页面,其中前端页面用于输入以及展示字幕文件,后端加载运行任一所述的提到的字幕文件编辑方法。
第三方面, 本申请实施例提供了一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行任一所述的字幕文件编辑方法。
第四方面,本申请实施例提供了一种可读存储介质,所述可读存储介质中存储有计算机程序,所述计算机程序包括用于控制过程以执行过程的程序代码,所述过程包括任一项所述的字幕文件编辑方法。
本发明的主要贡献和创新点如下:
本申请实施例提供的字幕文件编辑方法通过自研方法将srt和vtt格式的字幕文件转换为json数据结构进行编辑处理,具有字幕文件编辑方便、可对接其他平台API、校对效率高以及使用门槛低的诸多优点,该字幕文件编辑方法可以根据业务修改字幕需求, 单语字幕一键增加双语字幕,单语字幕互相转换,一键去除标点符号,字幕时间校对,内容批量替换等功能。
本申请的一个或多个实施例的细节在以下附图和描述中提出,以使本申请的其他特征、目的和优点更加简明易懂。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是根据本申请一种实施例的加载运行字幕文件编辑方法的字幕文件编辑器的文件上传界面;
图2是根据本申请一种实施例的加载运行字幕文件编辑方法的字字幕文件编辑器的前端展示JSON格式的字幕的界面示意图;
图3是根据本申请一种实施例的加载运行字幕文件编辑方法的字字幕文件编辑器的前端显示功能需求的界面示意图;
图4是根据本申请一种实施例的加载运行字幕文件编辑方法的字字幕文件编辑器的前端下载字幕的界面示意图;
图5是根据本申请一种实施例的字幕文件编辑方法的流程示意图。
图6是根据本申请实施例的电子装置的硬件结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
实施例一
本方案提供了一种字幕文件编辑方法,不同于传统的编辑方法仅能对srt、vtt格式的字幕进行编辑的方法,本方案提供的字幕文件编辑方法可以将上传的文字转换为Go结构体对象数据结构进行处理,以此方式提高了各种字幕编辑功能的效率和质量,具体的,如图5所示,本方案提供的字幕文件编辑方法包括以下步骤:
获取上传的srt格式或vtt格式的字幕文件,将vtt格式的字幕文件转换为srt格式;
定义Go结构体对象数据结构;
调用os.open打开srt格式的字幕文件,调用bufio.NewScanner以及scanner.Scan逐行循环遍历字幕文件的内容,其中在循环遍历字幕文件的内容的过程中将内容中识别到的序号、时间戳和文字加入到块切片内,每当出现空内容时则将块切片加入到二维切片中;
循环遍历二维切片根据序号、时间戳和文本按照对应的格式存储在Go结构体对象数据结构中得到Go结构体对象,其中Go结构体对象内包括多个按照序号排列的结构单体,每一结构单体含有序号、时间戳和文本;
将Go结构体对象转换为json数据显示在前端页面,基于前端页面获取的编辑要求调用后端的Go结构体对象进行编辑操作,并将编辑操作后的Go结构体对象依旧以json数据显示在前端页面。
本方案利用自研的方法将上传的字幕文件转换为Go结构体对象,以便于后续对Go结构体对象进行各类编辑操作,为实现Go结构体对象的转换,本方案首先定义了Go结构体对象数据结构,具体的,在“定义Go结构体对象数据结构”步骤中,Go结构体对象数据结构由id字段,start字段,end字段以及line[]字段组成,其中start字段,end字段以及line[]字段后定义变量为字符串,id字段后定义变量为整数,id字段填充序号,start字段和end字段填充时间戳,line[]字段填充文本。
示例性的,本方案提供的Go结构体对象数据结构如下:
type SubtitleSlice struct {
Subtitle struct {
Content []Subtitle
}
}
type Subtitle struct {
Idint
Start string
Endstring
Line[]string
}
另外,本方案的Go结构体对象数据格式适用于srt格式的字幕文本数据,故本方案在“获取上传的srt格式或vtt格式的字幕文件,将vtt格式的字幕文件转换为srt格式”步骤中:
获取字幕文件,判断字幕文件的字幕类型,若字幕类型为webvtt格式,调用ffmpeg-i xxx.webvtt xxx.srt 将webvtt转成srt格式。
具体的,如图1所示,用户在本方案提供的字幕编辑器的前端页面上导入字幕文件,后端在收到字幕文件后存储在服务器上并读取字幕文件以判断字幕文件的字幕类型。
需要说明的是,本方案在将srt格式的字幕文件转换为Go结构体对象数据前需要先实例化Go结构体对象数据,以使其能够准备存储数据。以下将重点说明将srt格式的字幕文件转换为Go结构体对象数据的详细内容:
具体的,在“调用os.open打开srt格式的字幕文件,调用bufio.NewScanner以及scanner.Scan逐行循环遍历字幕文件的内容”步骤中,调用Go内置的os.open方法打开srt格式的字幕文件,并调用Go内置的bufio.NewScanner方法按行读取字幕文件中的内容,调用scanner.Scan循环遍历每一行字幕文件的内容。在调用Go内置的bufio.NewScanner方法按行读取字幕文件中的内容的过程中,若字幕文件的行内容中含有特殊字符或者乱码的话则将乱码和特殊字符替换为空字节,示例性如下;line = strings.Replace(line, "ufeff", "", -1)
line = strings.Replace(line, "xefxbbxbf", "", -1)。
为了实现字幕文件的存储,本方案额外定义块切片和二维切片,当bufio.NewScanner方法按行读取的字幕文件中的内容中识别到的序号、时间戳和文字加入到块切片内,每当出现孔内容的话则将块切片加入到二维切片中。
在“循环遍历二维切片根据序号、时间戳和文本按照对应的格式存储在Go结构体对象数据结构中得到Go结构体对象”步骤中,序列、时间戳和文字定义各自的下标存储在块切片中,在遍历二维切片的过程中,若块切片中的数据下标识别到序号,则使用strconv.Atoi将序号转成int;若块切片中的数据下标识别到时间戳,则使用strings.Split(t, " ")分隔,得到start和end的字符串;若块切片的数据下标识别到文字,则将文字存储在Go结构体对象的Subtitle结构体,且每一次遍历二维切片时将Go结构体对象的Subtitle结构体追加到SubtitleSlice.Content 中得到Go结构体对象。
本方案的Go结构体对象由诸多结构单体组成,在一些实施例中,本方案得到的Go结构体对象示例如下:[{1 00:00:03,160 00:00:04,620 [I'm Peppa Pig. 我是小猪佩奇]} {2 00:00:05,200 00:00:07,500 [This is my little brother George, 这是我的弟弟乔治 ]} {3 00:00:07,840 00:00:09,700 [this is Mummy Pig 这是猪妈妈]} {4 00:00:10,080 00:00:11,980 [and this is Daddy Pig 这是猪爸爸]}]
在“将Go结构体对象转换为json数据显示在前端页面”步骤中,调用json.Marshal根据Go结构体对象数据结构将Go结构体对象转换为json数据。需要说明的是,若Go结构体对象没有结构的话,前端页面会将Go结构体对象视为一个整体字符串,无法进行后续的编辑处理。而本方案则是由于定义了Go结构体对象数据结构,所以使得本方案转换得到的json数据也具有一定的格式,在一些实施例中,本方案的前端页面上显示的json数据如图2所示。
在“基于前端页面获取的编辑要求调用后端的Go结构体对象进行编辑操作,并将编辑操作后的Go结构体对象依旧以json数据显示在前端页面”步骤中,编辑要求包括但不限于单英文字幕功能、单中文字幕功能、中英双字幕功能、去除标点符号功能、全局搜索功能、删除单行数据功能以及修改数据功能的一种或以上组合。在一些实施例中,本方案的前端页面上显示的编辑要求如图3所示。
具体的,当编辑要求是单英文字幕功能时,判断Go结构体对象中的line字段内的文本是否为中文,若是中文,则调用go内置的copy函数重组Go结构体对象的变量以删除中文所在的结构单体的line字段形成新的Go结构体对象并转换。
因为Go结构体对象的line字段中存储的是文本,判断line字段内的值是否为[u4E00-u9FA5],若是的话则Line字段内为中文则删除当前line字段,具体的代码如下:
index = N(根据判断获行0或是1)
s := make([]string, len(srt.Subtitle.Content)-1)
copy(s[:index], srt.Subtitle.Line[:index])
copy(s[index:],srt.Subtitle.Line[index+1:])
srt.Subtitle.Line = s
具体的,当编辑要求是单中文字幕功能时,判断Go结构体对象中的line字段内的文本是否为英文,若是英文,则调用go内置的copy函数重组Go结构体对象的变量以删除英文所在的结构单体的line字段形成新的Go结构体对象并转换。
因为Go结构体对象的line字段中存储的是英文,判断line字段内的值是否为[A-Za-z],若是的话则Line字段内为英文则删除当前line字段。
具体的,当编辑要求是中英双字幕功能时,则检测Go结构体对象中的lineZ字段的文本的语种,若是中文的话调用有道api接口翻译成英文并填充当前line字段,若是英文的话调用有道api接口翻译成中文并填充当前line字段形成新的Go结构体对象并转换。
具体的,当编辑要求是去除英文标点符号功能时,检测Go结构体对象中的line字段是否为英文,若是英文的话则将标点符号替换为空形成新的Go结构体对象并转换。
示例如下:
t2 := strings.Replace(t1, ",", " ", -1)
t3 := strings.Replace(t2, "。", " ", -1)
t5 := strings.Replace(t3, "!", " ", -1)
t6 := strings.Replace(t5, "?", " ", -1)
t7 := strings.Replace(t6, "?", " ", -1)
t8 := strings.Replace(t7, ",", " ", -1)
t9 := strings.Replace(t8, "!", " ", -1)
t0 := strings.Replace(t9, ".", " ", -1)
具体的,当编辑要求是全局搜索功能时,后端获取前端页面传来的关键词,并循环Go结构体对象以strings.Contains比较每一条结构单体是否含有关键词,若含有关键词的话则提取当前Go结构体对象形成新的Go结构体对象并转换。
具体的,当编辑要求是删除单行数据功能时,获取待删除的行并定位其所在的结构单体,将结构单体进行删除形成新的Go结构体对象并转换。
具体的,当编辑要求是修改数据功能时,获取待修改的字幕文件的待修改内容,并根据待修改内容定位对应的Go结构体对象中的结构单体,对结构单体进行修改形成新的Go结构体对象并转换。换言之,用户可在前端页面双击某行即可修改该行的开始时间、结束时间以及中英文内容,后端根据修改的内容覆盖写入形成新的Go结构体对象并转换。
在一些实施例中,本方案提供的字幕文件编辑方法还提供了字幕下载功能。具体的,当获取下载字幕请求时,前端页面将被请求的字幕文本以json格式发送给后端后,后端将json格式的户数据写入srt格式的字幕文本中,srt格式的字幕文本再次返回给前端页面供本地下载。如图4所示,图4是本方案提供字幕下载功能的示意图。
实施例二
基于相同的构思,本申请还提出了一种字幕文件编辑器,包括前端页面和后端,其中前端页面用于输入以及展示字幕文件,后端加载运行实施例一提到的字幕文件编辑方法。关于实施例一中相同内容在此不进行累赘说明。
实施例三
本实施例还提供了一种电子装置,参考图6,包括存储器304和处理器302,该存储器304中存储有计算机程序,该处理器302被设置为运行计算机程序以执行上述任一项字幕文件编辑方法实施例中的步骤。
具体地,上述处理器302可以包括中央处理器(CPU),或者特定集成电路(ApplicationSpecificIntegratedCircuit,简称为ASIC),或者可以被配置成实施本申请实施例的一个或多个集成电路。
其中,存储器304可以包括用于数据或指令的大容量存储器304。举例来说而非限制,存储器304可包括硬盘驱动器(HardDiskDrive,简称为HDD)、软盘驱动器、固态驱动器(SolidStateDrive,简称为SSD)、闪存、光盘、磁光盘、磁带或通用串行总线(UniversalSerialBus,简称为USB)驱动器或者两个或更多个以上这些的组合。在合适的情况下,存储器304可包括可移除或不可移除(或固定)的介质。在合适的情况下,存储器304可在数据处理装置的内部或外部。在特定实施例中,存储器304是非易失性(Non-Volatile)存储器。在特定实施例中,存储器304包括只读存储器(Read-OnlyMemory,简称为ROM)和随机存取存储器(RandomAccessMemory,简称为RAM)。在合适的情况下,该ROM可以是掩模编程的ROM、可编程ROM(ProgrammableRead-OnlyMemory,简称为PROM)、可擦除PROM(ErasableProgrammableRead-OnlyMemory,简称为EPROM)、电可擦除PROM(ElectricallyErasableProgrammableRead-OnlyMemory,简称为EEPROM)、电可改写ROM(ElectricallyAlterableRead-OnlyMemory,简称为EAROM)或闪存(FLASH)或者两个或更多个以上这些的组合。在合适的情况下,该RAM可以是静态随机存取存储器(StaticRandom-AccessMemory,简称为SRAM)或动态随机存取存储器(DynamicRandomAccessMemory,简称为DRAM),其中,DRAM可以是快速页模式动态随机存取存储器304(FastPageModeDynamicRandomAccessMemory,简称为FPMDRAM)、扩展数据输出动态随机存取存储器(ExtendedDateOutDynamicRandomAccessMemory,简称为EDODRAM)、同步动态随机存取内存(SynchronousDynamicRandom-AccessMemory,简称SDRAM)等。
存储器304可以用来存储或者缓存需要处理和/或通信使用的各种数据文件,以及处理器302所执行的可能的计算机程序指令。
处理器302通过读取并执行存储器304中存储的计算机程序指令,以实现上述实施例中的任意一种字幕文件编辑方法。
可选地,上述电子装置还可以包括传输设备306以及输入输出设备308,其中,该传输设备306和上述处理器302连接,该输入输出设备308和上述处理器302连接。
传输设备306可以用来经由一个网络接收或者发送数据。上述的网络具体实例可包括电子装置的通信供应商提供的有线或无线网络。在一个实例中,传输设备包括一个网络适配器(Network Interface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备306可以为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。
输入输出设备308用于输入或输出信息。在本实施例中,输入的信息可以是srt格式的字幕文件等,输出的信息可以是可编辑的json格式的字幕数据等。
可选地,在本实施例中,上述处理器302可以被设置为通过计算机程序执行以下步骤:
需要说明的是,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
通常,各种实施例可以以硬件或专用电路、软件、逻辑或其任何组合来实现。本发明的一些方面可以以硬件来实现,而其他方面可以以可以由控制器、微处理器或其他计算设备执行的固件或软件来实现,但是本发明不限于此。尽管本发明的各个方面可以被示出和描述为框图、流程图或使用一些其他图形表示,但是应当理解,作为非限制性示例,本文中描述的这些框、装置、系统、技术或方法可以以硬件、软件、固件、专用电路或逻辑、通用硬件或控制器或其他计算设备或其某种组合来实现。
本发明的实施例可以由计算机软件来实现,该计算机软件由移动设备的数据处理器诸如在处理器实体中可执行,或者由硬件来实现,或者由软件和硬件的组合来实现。包括软件例程、小程序和/或宏的计算机软件或程序(也称为程序产品)可以存储在任何装置可读数据存储介质中,并且它们包括用于执行特定任务的程序指令。计算机程序产品可以包括当程序运行时被配置为执行实施例的一个或多个计算机可执行组件。一个或多个计算机可执行组件可以是至少一个软件代码或其一部分。另外,在这一点上,应当注意,如图中的逻辑流程的任何框可以表示程序步骤、或者互连的逻辑电路、框和功能、或者程序步骤和逻辑电路、框和功能的组合。软件可以存储在诸如存储器芯片或在处理器内实现的存储块等物理介质、诸如硬盘或软盘等磁性介质、以及诸如例如DVD及其数据变体、CD等光学介质上。物理介质是非瞬态介质。
本领域的技术人员应该明白,以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。
- 一种极片宽度测量方法与极片宽度测量装置
- 极片浆料、电极片及极片浆料的制作方法
- 一种快速诊断心肌缺血的电极片装置及其制备方法和应用
- 一种用于锂离子电池极片补锂的装置及方法
- 一种锂电池极片的毛刺检测装置和方法
- 一种电极极片导热性评测的装置及其方法和应用
- 一种电极活性组合物、电极极片、电极极片制备方法和低温化成方法