Java离线视频提取音频+音频提取文案

news/2024/5/4 18:55:51

需引入依赖javacv、vosk相关依赖,

至于javacv依赖,网上有很多缩减方案,注释部分是可行的缩减方案,至于视频提取视频这里无需安装ffmpeg,只需引入依赖。而vosk需要下载模型方可使用,并且下载比较慢,可先用小模型跑通。

    <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><javacv.version>1.5.6</javacv.version><system.windowsx64>windows-x86_64</system.windowsx64></properties><!--  javacv+javacpp -->
<!--    <dependency>-->
<!--      <groupId>org.bytedeco</groupId>-->
<!--      <artifactId>javacv</artifactId>-->
<!--      <version>${javacv.version}</version>-->
<!--    </dependency>-->
<!--    <dependency>-->
<!--      <groupId>org.bytedeco</groupId>-->
<!--      <artifactId>javacpp-platform</artifactId>-->
<!--      <version>${javacv.version}</version>-->
<!--    </dependency>-->
<!--    &lt;!&ndash; ffmpeg最小依赖包,必须包含上面的javacv+javacpp核心库 &ndash;&gt;-->
<!--    <dependency>-->
<!--      <groupId>org.bytedeco</groupId>-->
<!--      <artifactId>ffmpeg</artifactId>-->
<!--      <version>4.4-${javacv.version}</version>-->
<!--      <classifier>${system.windowsx64}</classifier>-->
<!--    </dependency>-->
<!--&lt;!&ndash;     最小opencv依赖包 ,必须包含上面的javacv+javacpp&ndash;&gt;-->
<!--        <dependency>-->
<!--          <groupId>org.bytedeco</groupId>-->
<!--          <artifactId>opencv</artifactId>-->
<!--          <version>4.5.1-${javacv.version}</version>-->
<!--          <classifier>${system.windowsx64}</classifier>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--          <groupId>org.bytedeco</groupId>-->
<!--          <artifactId>openblas</artifactId>-->
<!--          <version>0.3.13-${javacv.version}</version>-->
<!--          <classifier>${system.windowsx64}</classifier>-->
<!--        </dependency>-->
<!--    <dependency>-->
<!--      <groupId>org.bytedeco</groupId>-->
<!--      <artifactId>flycapture</artifactId>-->
<!--      <version>2.13.3.31-${javacv.version}</version>-->
<!--      <classifier>${system.windowsx64}</classifier>-->
<!--    </dependency>--><dependencies><!-- 视频提取音频信息 --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.10</version></dependency><!-- 获取音频信息 --><dependency><groupId>org</groupId><artifactId>jaudiotagger</artifactId><version>2.0.3</version></dependency><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.13.0</version></dependency><dependency><groupId>com.alphacephei</groupId><artifactId>vosk</artifactId><version>0.3.45</version></dependency><!-- JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器。 --><dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>3.1.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency></dependencies>

视频提取音频

package org.example;import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;public class Test {public static void extractVoice(String sourceFileName, String audioUrl) throws FFmpegFrameGrabber.Exception, FFmpegFrameRecorder.Exception {//抓取资源FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(sourceFileName);Frame frame = null;FFmpegFrameRecorder recorder = null;frameGrabber.start();//转录为单轨, 16K采样率, wav格式recorder = new FFmpegFrameRecorder(audioUrl, frameGrabber.getAudioChannels());recorder.setFormat(frameGrabber.getFormat());recorder.setSampleRate(frameGrabber.getSampleRate());//frameGrabber.getSampleRate()//recorder.setAudioBitrate(128000);// 音频比特率recorder.setTimestamp(frameGrabber.getTimestamp());recorder.setVideoCodec(avcodec.AV_CODEC_ID_NONE); // 不录制视频recorder.start();int index = 0;while (true) {frame = frameGrabber.grabSamples();if (frame == null) break;if (frame.samples != null) {recorder.recordSamples(frame.sampleRate, frame.audioChannels, frame.samples);recorder.setTimestamp(frameGrabber.getTimestamp());}index++;}recorder.stop();recorder.release();frameGrabber.stop();frameGrabber.release();}public static void main(String[] args) throws FFmpegFrameGrabber.Exception, FFmpegFrameRecorder.Exception {String videoFilePath = "I:\\workspace\\test.mp4"; // 视频文件路径String audioOutputPath = "I:\\workspace\\test_audio.wav"; // 输出的音频文件路径long s = System.currentTimeMillis();extractVoice(videoFilePath, audioOutputPath);System.out.println(System.currentTimeMillis() - s);}}

音频提取文字

至于model可去此网站下载,解压使用。大模型下载较慢

VOSK Models

package org.example;import com.alibaba.fastjson.JSON;
import org.vosk.LibVosk;
import org.vosk.LogLevel;
import org.vosk.Model;
import org.vosk.Recognizer;import javax.sound.sampled.*;
import java.io.*;
import java.util.Optional;public class Test3 {public static void main(String[] args) {StringBuilder result = new StringBuilder();LibVosk.setLogLevel(LogLevel.DEBUG);AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, false);DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);TargetDataLine microphone;SourceDataLine speakers;try (Model model = new Model("I:\\workspace\\vosk-model-small-cn-0.22");InputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream("I:\\workspace\\test_audio.wav")));Recognizer recognizer = new Recognizer(model, 120000)) {try {microphone = (TargetDataLine) AudioSystem.getLine(info);microphone.open(format);microphone.start();ByteArrayOutputStream out = new ByteArrayOutputStream();int numBytesRead;int CHUNK_SIZE = 1024;int bytesRead = 0;DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format);speakers = (SourceDataLine) AudioSystem.getLine(dataLineInfo);speakers.open(format);speakers.start();byte[] b = new byte[4096];while (bytesRead <= 100000000) {byte[] audioData = new byte[CHUNK_SIZE];numBytesRead = ais.read(audioData, 0, CHUNK_SIZE);bytesRead += numBytesRead;out.write(audioData, 0, numBytesRead);speakers.write(audioData, 0, numBytesRead);if (recognizer.acceptWaveForm(audioData, numBytesRead)) {result.append(getResult(recognizer.getResult()));} else {result.append(getResult(recognizer.getPartialResult()));}}result.append(getResult(recognizer.getFinalResult()));speakers.drain();speakers.close();microphone.close();} catch (Exception e) {e.printStackTrace();}System.out.println(result.toString());} catch (IOException e) {throw new RuntimeException(e);} catch (UnsupportedAudioFileException e) {throw new RuntimeException(e);}}/*** 获取返回结果** @param result* @return*/private static String getResult(String result) {VoskResult vr = JSON.parseObject(result,VoskResult.class);return  Optional.ofNullable(vr).map(VoskResult::getText).orElse("");}public static void main1(String[] argv) throws IOException, UnsupportedAudioFileException {LibVosk.setLogLevel(LogLevel.DEBUG);StringBuilder result = new StringBuilder();try (Model model = new Model("I:\\workspace\\vosk-model-small-cn-0.22");InputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream("I:\\workspace\\test_audio.wav")));Recognizer recognizer = new Recognizer(model, 120000)) {int nbytes;byte[] b = new byte[4096];while ((nbytes = ais.read(b)) >= 0) {if (recognizer.acceptWaveForm(b, nbytes)) {result.append(getResult(recognizer.getResult()));} else {result.append(getResult(recognizer.getPartialResult()));}}result.append(getResult(recognizer.getFinalResult()));}System.out.println(result);}
}

感谢网上各位大佬能分享这些信息

测试可行,识别率没有做过对比、大模型也没有试过。这里也就提供一种可行的离线解决方案。


http://www.mrgr.cn/p/11606162

相关文章

微信小程序4~6章总结

目录 第四章 页面组件总结 4.1 组件的定义及属性 4.2 容器视图组件 4.2.1 view 4.2.2 scroll-view 4.2.3 swiper 4.3 基础内容组件 4.3.1 icon ​编辑 4.3.2 text 4.3.3 progress ​编辑 4.4 表单组件 4.4.1 button 4.4.2 radio 4.4.3 checkbox 4.4.4 switch …

手撕sql面试题:根据分数进行排名,不使用窗口函数

分享一道面试题&#xff1a; 有一个分数表id 是该表的主键。该表的每一行都包含了一场考试的分数。Score 是一个有两位小数点的浮点值。 以下是表结构和数据&#xff1a; Create table Scores ( id int(11) NOT NULL AUTO_INCREMENT, score DECIMAL(3,2), PRIMARY KEY…

OpenAI未至,Open-Sora再度升级!已支持生成16秒720p视频

Open-Sora 在开源社区悄悄更新了!现在支持长达 16 秒的视频生成,分辨率最高可达 720p,并且可以处理任何宽高比的文本到图像、文本到视频、图像到视频、视频到视频和无限长视频的生成需求。我们来试试效果。 生成个横屏圣诞雪景,发b站再生成个竖屏,发抖音还能生成16秒的长视…

解决宏定义后面无法加分号

总结&#xff1a;注意是针对单行if语句使用&#xff0c;并且宏定义后面必须带分号&#xff08;格式统一&#xff09; 参考连接 C语言种do_while(0)的妙用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1vk4y1R7VJ/?spm_id_from333.337.search-card.all.click&vd_…

OpenCV——Bernsen局部阈值二值化方法

目录 一、Bernsen算法1、算法概述2、参考文献二、代码实现三、结果展示Bernsen局部阈值二值化方法由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、Bernsen算法 1、算法概述 Bernsen 算法是另一种流行的局部阈值二值化方…

Jenkins CI/CD 持续集成专题四 Jenkins服务器IP更换

一、查看brew 的 services brew services list 二、编辑 homebrew.mxcl.jenkins-lts.plist 将下面的httpListenAddress值修改为自己的ip 服务器&#xff0c;这里我是用的本机的ip 三 、重新启动 jenkins-lts brew services restart jenkins-lts 四 、浏览器访问 http://10.…

Microchip 32位MCU CAN驱动图文教程-附源码

文章目录 创建一个新的32位MCU工程Microchip MCC Harmony配置界面说明在MCC下配置系统的时钟在MCC下配置所需要使用的模块配置调试打印模块配置CAN模块配置管脚功能修改系统堆栈大小生成代码 添加用户代码 创建一个新的32位MCU工程 确保电脑上已经安装最新的MPlab X IDE、XC32编…

黑龙江—等保测评三级安全设计思路

需求分析 6.1、 系统现状 6.2、 现有措施 目前&#xff0c;信息系统已经采取了下述的安全措施&#xff1a; 1、在物理层面上&#xff0c; 2、在网络层面上&#xff0c; 3、在系统层面上&#xff0c; 4、在应用层面上&#xff0c; 5、在管理层面上&#xff0c; 6.…

几种中文字体的比较

根据自己的喜好给常见的几个中文字体的打分:字体选项 字体名 得分adobe Adobe 宋体 Std 5fandol FandolSong 0founder 方正书宋_GPK 10hanyi 汉仪宋体 6sinotype 华文宋体 3win 中易宋体 9fandol 缺少偏僻字体,故得零分。

数据治理之数据质量管理

一、数据质量概述什么是数据质量数据质量差的危害数据质量维度(数据六大评价标准)什么是数据质量测量数据质量测量必须要有目的数据质量测量必须可重复数据质量测量必须可解释什么是数据质量管理二、数据问题根因分析什么是根因分析为什么要进行根因分析产生数据问题的阶段规…

第十五届蓝桥杯省赛第二场C/C++B组A题【进制】题解(AC)

解题思路 按照题意进行模拟&#xff0c;计算 x x x 的 b b b 进制过程中&#xff0c;若出现余数大于 9 9 9&#xff0c;则说明 x x x 的 b b b 进制一定要用字母进行表示。 #include <iostream> #include <cstring> #include <algorithm> #include &l…

如何用微信发布考试成绩(如月考、期中、期末等)

自教育部《未成年人学校保护规定》颁布后,教育部明确表示:学校不得公开学生的考试成绩、排名等信息!同时学校应采取措施,便利家长知道学生的成绩等学业信息,对于教师来说,如何用微信发布考试成绩(如:月考、期中、期末等)就成了一道难题... 公开吧,会伤害到学生自尊心,甚至被投诉…

implicit declaration of item ‘write’; did him mean ‘fwrite’?

include <unistd.h> implicit declaration of item ‘write’; did him mean ‘fwrite’?Ask QuestionQuestions 2 years, 5 months ago Modified 2 years, 5 months ago Viewed 5k times 0IODIN bundled an case of a uncomplicated note-taking program that uses sav…

TapData + 实时数仓:实时数据如何赋能船舶制造业,助力数字化应用升级和科学管理运营

老牌国有制造企业实践案例:TapData + 实时数仓BI 系统,船舶制造如何基于实时数据平台解决方案实现数字化应用升级和科学管理运营 ?使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量代替 OGG、DSG 等同步工具,「CDC + 流处理 + 数据集成」组合拳,加速仓…

数据治理之元数据管理

一、元数据管理概述什么是元数据元数据的3种类型业务元数据技术元数据操作元数据元数据的作用什么是元数据管理元数据管理的目标建立指标解释体系提高数据溯源能力数据质量稽核体系元数据管理的阶段二、元数据管理方法业务目标理解建立企业数据资产目录消除冗余加强数据复用降低…

AHB介绍

1. 关于AHB协议 AMBA AHB是一种适用于高性能可综合设计的总线接口。它定义了组件之间的接口&#xff0c;例如master、互连和slave。 AMBA AHB实现了高性能、高时钟频率系统所需的特性&#xff0c;包括&#xff1a; 突发传输&#xff08;Burst transfers&#xff09;。单时钟…

【pytorch学习】之线性神经网络-图像分类数据集

图像分类数据集 MNIST数据集 (LeCun et al., 1998) 是图像分类中广泛使用的数据集之一,但作为基准数据集过于简单。我们将使用类似但更复杂的Fashion‐MNIST数据集 (Xiao et al., 2017)。 %matplotlib inline import torch import torchvision from torch.utils import data f…

docker的基本命令

基础命令 https://yeasy.gitbook.io/docker_practice/data_management/volume// 容器命令 1. docker command --help 查看对应命令的用法 2. docker ps -a 查看所有docker进程(无论是否在运行) -l最后一次创建的容器 3. docker logs containerId 查看容器日志 4. docker start…

【数据结构】串(String)

文章目录 基本概念顺序存储结构比较当前串与串s的大小取子串插入删除其他构造函数拷贝构造函数扩大数组空间。重载重载重载重载[]重载>>重载<< 链式存储结构链式存储结构链块存储结构 模式匹配朴素的模式匹配算法(BF算法)KMP算法字符串的前缀、后缀和部分匹配值nex…

AI生成内容(AIGC)技术:革新创作与挑战未来

如何看待AIGC技术&#xff1f; 本文将深入探讨人工智能生成内容&#xff08;AIGC&#xff09;技术的发展现状、多领域应用、伦理与风险&#xff0c;以及未来的发展趋势。AIGC技术正在改变信息和创作的景观&#xff0c;本文旨在为读者提供一个全面的视角&#xff0c;了解这一技…