视频硬字幕提取方法(可完全离线),开发个小工具辅助一下

这篇具有很好参考价值的文章主要介绍了视频硬字幕提取方法(可完全离线),开发个小工具辅助一下。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近博主闲下来了,思考人生接下来的方向,无聊时帮别人做了点小东西,贡献出来:

jre-17.0.7_win-x64的生成方式:

以管理员方式运行PowerShell执行命令:

cd $env:JAVA_HOME

jlink --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules java.base,java.xml,java.desktop,jdk.management.agent --output E:\jre-17.0.7_win-x64

内部参数:

java -Dfile.encoding=UTF-8 -jar single-subtitle-text-1.0.0.jar

使用教程:

硬字幕提取工具,java,log4j,gradle

注意该图片的两个文件夹,都在下面这个软件的安装目录中。

VideoSubFinderWXW 拿来做字幕图片截取捕获,这是下载地址:

VideoSubFinder download | SourceForge.net

硬字幕提取工具,java,log4j,gradle

下载安装完成后,步骤:打开视频框选字幕位置,清空所有图片(之前识别的图片),开始识别。

捕获完在安装目录图片所示的第一个文件夹RGBImages中,PearOCR可以安装成浏览器应用可以离线识别,pearOCR官网如下:

PearOCR,在线图片转文字,免费OCR,在线图片文字提取,本地运算,无上传

硬字幕提取工具,java,log4j,gradle

硬字幕提取工具,java,log4j,gradle

上传RGBImages所有图片识别完后导出为txt。(如果后续出现问题,文件路径及文件名不建议带有中文)

接下来是我开发的小工具(代码已开源到github上),下载地址如下,

Release single-subtitle-text · LCJamI/single-subtitle-text (github.com)

下载single-subtitle-text_win-x64.zip解压,看到single-subtitle-text_win-x64.exe

安全无毒,下面是代码:

package pers.lcj.tool;

import lombok.extern.log4j.Log4j2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by Aaron on 2023/4/28 0:29
 */
@Log4j2
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in, "GBK");

        System.out.println("请输入导入文件路径:");
        Path inputPath = getPath(scanner, "导入文件");
        System.out.println("请输入导出目录路径:");
        Path outputPath = getPath(scanner, "导出目录");

        Map<String, String> result = readFile(inputPath.toString());

        writeOutputFiles(outputPath, result);
    }

    public static Path getPath(Scanner sc, String pathType) {
        Path path;
        do {
            String inputPath = sc.nextLine().replaceAll("^\"+|\"+$", "");
            path = Paths.get(inputPath);
            if (pathType.equals("导入文件") && !Files.isRegularFile(path)) {
                System.out.println("输入路径不是一个有效文件路径,请重新输入:");
                path = null;
            } else if (pathType.equals("导出目录") && !Files.isDirectory(path)) {
                System.out.println("输入路径不是一个有效文件路径,请重新输入:");
                path = null;
            }
        } while (path == null);
        return path;
    }

    private static final int BUFFER_SIZE = 8192;
    private static final Pattern REGEX_PATTERN = Pattern.compile("(?<=-\\s)([^.]+)(?=\\.jpeg)");

    private static Map<String, String> readFile(String inputFilePath) {
        Map<String, String> result = new HashMap<>();
        try (BufferedReader br = new BufferedReader(new FileReader(inputFilePath), BUFFER_SIZE)) {
            StringBuilder currentValueBuilder = new StringBuilder(1024); // 初始化StringBuilder大小,避免过多扩容
            Matcher matcher;
            String key = null;
            String currentLine;
            while ((currentLine = br.readLine()) != null) {
                matcher = REGEX_PATTERN.matcher(currentLine);
                if (matcher.find()) {
                    if (key != null) {
                        String value = currentValueBuilder.toString().trim();
                        result.put(key, value.isEmpty() ? "null" : value); // 添加新的结果到Map中,并清空StringBuilder
                        currentValueBuilder.setLength(0);
                    }
                    key = matcher.group(1);
                } else if (key != null) { // 对currentValue进行构建
                    currentValueBuilder.append(currentLine.trim()).append(" "); // 添加空格,避免拼接相邻字符串时出现语义混淆
                }
            }
            if (key != null) { // 处理最后一个结果
                result.put(key, currentValueBuilder.toString().trim().replace("  ------------ prower by PearOCR.com ------------", ""));
            }
        } catch (IOException e) {
            log.error("Error reading file:", e);
        }
        return result;
    }

    private static void writeOutputFiles(Path outputFolderPath, Map<String, String> result) {
        System.out.println("正在处理,请稍等......");
        result.entrySet().parallelStream().forEach(entry -> {
            String fileName = entry.getKey();
            Path txtFilePath = outputFolderPath.resolve(fileName + ".txt");
            try (BufferedWriter bw = Files.newBufferedWriter(txtFilePath, StandardCharsets.UTF_8)) {
                bw.write(entry.getValue());
            } catch (IOException e) {
                log.error("Error write file:", e);
            }
        });
        System.out.println("文件总计(个):" + result.size());
    }

}

Gradle 8.1.1引入的依赖:

plugins {
    // Java插件,该插件提供了Java应用和库的基本功能
    id 'java'

    // lombok插件,该插件支持在Java项目中使用Lombok注解
    id 'io.freefair.lombok' version '8.0.1'
}

group = 'pers.lcj.tool'
version = '1.0.0'

repositories {
    mavenLocal {
        url 'file:///D:/m2/repository'
    }
    maven { url 'https://maven.aliyun.com/repository/public/' }
    mavenCentral()
}

dependencies {
    // Lombok
    compileOnly 'org.projectlombok:lombok:1.18.26'
    annotationProcessor 'org.projectlombok:lombok:1.18.26'

    // Log4j2
    implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
    implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
    implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0'

    // JUnit 5
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.3'
}

jar {
    duplicatesStrategy = 'exclude'
    from {
        configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
    manifest {
        attributes 'Main-Class': 'pers.lcj.tool.Main'
    }
}

test {
    useJUnitPlatform()
}

log4j2.properties log4j2 配置文件

# 设置日志级别为info
rootLogger.level = info

# 控制台Appender的配置
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# 根日志记录器引用控制台Appender
rootLogger.appenderRef.stdout.ref = consoleLogger

# 日志文件存放路径
property.basePath = logs

# 组件Appender的名称、模式、路径和滚动策略
appender.rolling.type = RollingFile
appender.rolling.name = fileLogger
appender.rolling.fileName= ${basePath}/sst.log
appender.rolling.filePattern= ${basePath}/sst_%d{yyyyMMdd}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n
appender.rolling.policies.type = Policies

# 组件Appender的滚动策略,包括按大小滚动和按时间滚动两种策略。
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
# 按大小滚动策略大小限制
appender.rolling.policies.size.size = 310MB
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
# 按时间滚动策略间隔时间(单位:天)
appender.rolling.policies.time.interval = 1
# 按时间滚动策略是否调整时区
appender.rolling.policies.time.modulate = true

# 组件Appender的滚动策略,包括按大小滚动和按时间滚动两种策略。
appender.rolling.strategy.type = DefaultRolloverStrategy

# 组件Appender的删除策略。
appender.rolling.strategy.delete.type = Delete
# 删除文件所在目录路径。
appender.rolling.strategy.delete.basePath = ${basePath}
# 删除最旧的文件之前可以在目录中保留的最大文件数。默认值为0,这意味着不会删除任何文件。
appender.rolling.strategy.delete.maxDepth = 92
# 用于指定删除文件的条件类型,按最后修改时间删除。
appender.rolling.strategy.delete.ifLastModified.type = IfLastModified
# 删除所有早于92天的文件。
appender.rolling.strategy.delete.ifLastModified.age = 92d

# 配置根日志记录器,引用组件Appender。
rootLogger.appenderRef.rolling.ref = fileLogger

打开single-subtitle-text_win-x64.exe,根据提示输入该txt文本文件路径和输入安装目录图片所示的第二个文件夹TXTResults的路径,生成相应的TXTResults后

硬字幕提取工具,java,log4j,gradle

硬字幕提取工具,java,log4j,gradle

硬字幕提取工具,java,log4j,gradle

点击软件ocr菜单中的这个即可生成你想要的视频字幕了,贡献给所有做视频的朋友,市面上做这个的基本都收费,特别视频多且视频时长 长的工作,可以带来助力,大大缩短工作时长,但毕竟ocr识别不是完全准确的,还是需要一些人工审核。虽然意义不是很大但是对同声传译的视频提取字幕,新闻传播类等的二次制作等有帮助,以及博主不知道的领域等有帮助。文章来源地址https://www.toymoban.com/news/detail-740693.html

到了这里,关于视频硬字幕提取方法(可完全离线),开发个小工具辅助一下的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python - 利用 OCR 技术提取视频台词、字幕

    目录 一.引言 二.视频处理 1.视频样式 2.视频截取 ◆ 裁切降帧 ◆ 处理效果 3.视频分段 三.OCR 处理 1.视频帧处理 2.文本识别结果 3.后续工作与优化 ◆ 识别去重 ◆ 多线程提效 ◆ 片头片尾优化 四.总结 视频经常会配套对应的台词或者字幕,通过文本与字幕可以更好地理解视频

    2024年02月03日
    浏览(72)
  • 人工智能——离线情况下自动给视频添加字幕,支持中文,英文,日文等等

    最近打开百度网盘,看到播放视频有一个AI字幕功能,心情非常激动,看视频的同时可以看自动生成的字幕,防止听不清视频中人物的话语 然而不是SVIP,我试用过了之后就没有这个功能选项了 我在想,如果随便哪一个“免费”播放器,都可以一边播放视频,一边生成字幕,外

    2024年02月13日
    浏览(46)
  • 使用剪映提取视频中的字幕并导出(txt或srt格式)

    需要使用 剪映电脑版 ,打开之后 第一步:选择“音频”—“音频提取”—“导入” 在弹出的界面中选择需要的导入的视频,或者直接将视频拖入到“导入”框中 第二步:将导入的视频拖到下方的音频轨道 第三步:识别字幕 依次选择“文本”—“智能字幕”—“开始识别”

    2024年02月06日
    浏览(145)
  • python 视频硬字幕去除 内嵌字幕去除工具 vsr

    开源地址:https://github.com/YaoFANGUK/video-subtitle-remover Video-subtitle-remover (VSR) 是一款基于AI技术,将视频中的硬字幕去除的软件。 主要实现了以下功能: 无损分辨率 将视频中的硬字幕去除,生成去除字幕后的文件 通过超强AI算法模型,对去除字幕文本的区域进行填充(非相邻像

    2024年02月05日
    浏览(37)
  • 怎么去除视频字幕清理视频字幕或水印的四种方法

    大家好,我是七天变小白,欢迎来到我的视频剪辑小课堂,今天给大家分享几种去除视频字幕的方法,软字幕可以用很多博主推荐的方法来删除,通常就是关闭播放器里的字幕选项或者移除SRT字幕文件即可. 但如果你的字幕已经嵌入某个视频中成为了硬字幕,我们通常使用另

    2024年02月15日
    浏览(40)
  • 怎么去除视频字幕清理视频字幕或水印的几种方法

    大家好,我是七天变小白,欢迎来到我的视频剪辑小课堂,今天给大家分享几种去除视频字幕的方法,我认为第三种方法效果最好,先点个小关注,接下来讲教程。 将视频放大至字幕移出屏幕,只保留视频中没有字幕的区域,这样字幕就去除了,这种也是大家最常用的方法,

    2024年02月16日
    浏览(43)
  • 完全离线的OCR图片转文字识别工具Umi-OCR

    OCR图片转文字识别软件,完全离线。截屏/批量导入图片,支持多国语言、合并段落、竖排文字。可排除水印区域,提取干净的文本。基于 PaddleOCR 。 免费:本项目所有代码开源,完全免费。 方便:解压即用,离线运行,无需网络。 批量:可批量导入处理图片,结果保存到本

    2024年02月03日
    浏览(80)
  • 借用AI工具为视频添加中文字幕,消除语言障碍,母语环境最快速地学习

    由于chatgpt的启动,感觉语言已经完全不会成为学习的障碍,突发奇想,在我们查看youtube视频的时候,有没有方便的工具能够将其字幕翻译为中文。这样能够极大提高在youtube学习的效率,于是顺手问了一下ChatGPT,这里使用了一个工具: 1. chrome 浏览器插件里面有一个DeepL翻译

    2024年02月07日
    浏览(52)
  • 完全离线环境下安装配置Vscode Python开发环境及离线包文件的下载与安装实战

    一般在进行项目开发时,都是在有网络的环境下进行的,此时的开发工作,由于有网络的支持,我们需要什么安装包、模块、或者工具,下载安装比较方便,缺少依赖环境时,有些系统和安装包会自动下载补齐。但在一些特情况境下,需要配置完全独立于网络的开发环境,这

    2024年02月04日
    浏览(71)
  • 图片坐标提取软件/图片坐标点和像素点颜色提取软件/图片坐标获取工具/Python图片坐标获取源码/图片像素坐标获取软件/查看图片点XY坐标(完全开源)

    该软件使用python写的,可以提取像素点的坐标还有也能获取像素点的16进制数据RGB565和RGB888(RGB888仅最新的源码才支持),可以单点坐标也可以按键坐标,甚至可以使用简单的左右键配合使用,自动复制到粘贴板,如果图片太大或者太小,也支持图片缩小放大,但是软件会对像素

    2024年02月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包