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

需引入依赖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.mzph.cn/diannao/2879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 基本命令

目录 一、docker 镜像操作命令 1.1.查询软件镜像 1.2.docker pull&#xff1a;下载镜像 1.3.docker push&#xff1a;上传镜像 1.4.docker images&#xff1a;查看本地镜像 1.5.docker inspect &#xff1a;获取镜像详细信息 1.6.docker tag&#xff1a;添加镜像标签 …

tornado模板注入

这是我在做一道ctf题目当中遇到的&#xff0c;不太会&#xff0c;所以浅浅学习了一下&#xff0c;跟大家分享。 1.介绍 tornado是python当中的一个模板&#xff0c;因此这个漏洞是归属于SSTI(服务器模板漏洞&#xff09;&#xff0c;所谓的模板其实就是一种框架&#xff0c;p…

L2-052 吉利矩阵

所有元素为非负整数&#xff0c;且各行各列的元素和都等于 7 的 33 方阵称为“吉利矩阵”&#xff0c;因为这样的矩阵一共有 666 种。 本题就请你统计一下&#xff0c;把 7 换成任何一个 [2,9] 区间内的正整数 L&#xff0c;把矩阵阶数换成任何一个 [2,4] 区间内的正整数 N&…

Git:使用conda命令切换虚拟环境

1. 问题 在win10电脑的Git中&#xff0c;无法使用conda list命令&#xff0c;报错&#xff08;bash&#xff1a;conda&#xff1a;command not found&#xff09;。也无法使用conda activate base命令激活虚拟环境&#xff0c;报错&#xff08;bash&#xff1a;conda&#xff…

pollLast() 和poll啥区别

在 Java 中&#xff0c;pollLast() 和 poll() 是 Deque 接口的两个不同的方法&#xff0c;它们都用于从双端队列中移除并返回元素&#xff0c;但它们移除元素的位置不同&#xff1a; poll(): poll() 方法从双端队列的前端移除并返回第一个元素&#xff08;即队列的头部&#xf…

共享单车数据分析与需求预测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 自动自行车共享系统是传统自行车租赁的新一代&#xff0c;整个会员、租赁和归还过程都变得自动化。通过这些系统&#xff0c;用户可以…

C# ToString

你可以创建自定义数字格式字符串&#xff0c;这种字符串由一个或多个自定义数字说明符组成&#xff0c;用于定义设置数值数据格式的方式。 自定义数字格式字符串是任何不属于 标准数字格式字符串的格式字符串。 自定义数字格式字符串

【c++】cpp类和对象

&#xff08;1&#xff09;类的封装 封装的多层含义 把属性和⽅法进⾏封装对属性和⽅法进⾏访问控制类的内部和类的外部类的访问控制关键字 public: 修饰的成员变量和函数&#xff0c;可以在类的内部和类的外部访问private: 修饰的成员变量和函数&#xff0c;只能在类的内部…

L1-098 再进去几个人 - java

L1-098 再进去几个人 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 题目描述&#xff1a; 数学家、生物学家和物理学家坐在街头咖啡屋里&#xff0c;看着人们从街对面的一间房子走进走出。他们先看到两个人进去。时光流逝。他们又看到三个人出来。 物理…

锐捷网络闪耀高博会:智慧教育数字基座引领教育数字化新浪潮

4月15日,第61届中国高等教育博览会(简称“高博会”)在福州盛大开幕,在这次教育高端装备展示、教学改革成果交流、校企云集的行业盛会上,围绕构建智慧教育数字基座,锐捷网络携全场景智慧教育方案亮相,极简以太全光网、高校桌面云、5G多网融合等创新方案纷纷登场,吸引了众多观众驻…

【Python_PySide6学习笔记(三十六)】基于QGroupBox和QScrollArea实现带有滚动条的QGroupBox(分组框)

基于QGroupBox和QScrollArea实现带有滚动条的QGroupBox分组框 基于QGroupBox和QScrollArea实现带有滚动条的QGroupBox(分组框)前言正文1、创建QGroupBox并创建其内部布局2、创建QScrollArea并将QGroupBox设置为其内容3、将QScrollArea添加到主窗口的中心部件的布局中4、完整代码…

Linux实现文件共享

#nfs-utils、rpcbind 软件包来提供 NFS 共享服务 #客户端创建共享文件夹&#xff1a; nmcli c reload nmcli c up ens160 systemctl stop firewalld systemctl disable firewalld rpm -q nfs-utils rpcbind #查看是否安装 systemctl enable rpcbind systemctl enable nfs…

JavaEE初阶之IO流快速顿悟一(超详细)

目录 题外话 正题 IO流 Java.io.FileInputStream int read() int read(byte[] b) 关于异常 Java7的新特性: try-with-resources ( 资源自动关闭) Java.io.FileOutputStream void write(int b) void write(byte[] b) 小结 题外话 十年青铜无人问,一朝顿悟冲王者 前天…

C#控制台相关方法

控制台相关方法 文章目录 控制台输入1、清空2、设置控制台3、设置光标位置&#xff0c;1y 2x4、设置颜色相关5、光标显隐6、关闭控制台思考 移动方块 控制台输入 //如果ReadKey(true)不会把输入的内容显示再控制台上 char c Console.ReadKey(true).KeyChar;1、清空 ​ Cons…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 3 - 4节&#xff09; P3《开发准备-了解ArkTS》 鸿蒙开发主要是用来开发移动端应用的。 以前我们开发移动端应用的代码&#xff…

Linux 认识与学习Bash——2

1 read 从键盘读取变量的值 read 后面不带变量&#xff0c;那么默认会给REPLY变量赋值 #!/bin/bash echo -n "请输入你的名字&#xff1a;" read name echo "欢迎您 $name" echo "----------------"echo -n "请输入你的名字2&#xff1a;&q…

[MoeCTF-2022]Sqlmap_boy

title:[MoeCTF 2022]Sqlmap_boy 查看网页源代码&#xff0c;得到提示 <!-- $sql select username,password from users where username".$username." && password".$password.";; --> 用万能密码绕过&#xff0c;用’"闭合 爆数据库…

华锐双柜台系统超越快速通道!

很多朋友除了使用快速通道&#xff0c;但是一般资金量都不满足独立单元交易格&#xff0c;共享不够满足自己&#xff0c;那么是可以选择双柜台系统。我们一起来了解下&#xff01; 首先为什么我们使用华锐双柜台系统更快呢&#xff1f; 我们都知道&#xff1a;极速柜台的交易…

多模态模型和大型语言模型(LLM):概念解析与实例探究

在人工智能的世界中&#xff0c;我们经常遇到各种模型来解决不同类型的问题。最近&#xff0c;特别引人注意的是多模态模型和大型语言模型&#xff08;LLM&#xff09;。尽管这两种模型都是AI技术的当前前沿&#xff0c;但它们在功能和设计上有显著差异。本文旨在阐释这两种模型…

HOOPS Commuicator:基于Web的交互式2D/3D图形轻量化引擎

在当前数字化时代&#xff0c;Web基础的3D应用程序正在成为行业标准&#xff0c;尤其是在工程和制造领域。Tech Soft 3D公司旗下的HOOPS Communicator正是针对这一需求设计的高级解决方案&#xff0c;提供了一套全面的工具&#xff0c;旨在帮助开发者构建复杂的3D工程应用程序。…