简介

语音识别(Automatic Speech Recognition, ASR)是将人类的语音信号自动转换为对应文字的技术,它使计算机能够“听懂”人说的话,是人机语音交互的核心技术,广泛应用于智能助手、语音输入、客服系统等场景。

现在我们已经可以借助 SmartJavaAI 项目,通过 Java 快速接入语音识别能力。本文将手把手教你如何使用 SmartJavaAI 来实现语音识别功能,即使你没有深度学习基础,也能轻松上手!

SmartJavaAI是什么?

SmartJavaAI是专为JAVA 开发者打造的一个功能丰富、开箱即用的 JAVA AI算法工具包,致力于帮助JAVA开发者零门槛使用各种AI算法模型,开发者无需深入了解底层实现,即可轻松在 Java 代码中调用人脸识别、目标检测、OCR 等功能。底层支持包括基于 DJL (Deep Java Library) 封装的深度学习模型,以及通过 JNI 接入的 C++/Python 算法,兼容多种主流深度学习框架如 PyTorch、TensorFlow、ONNX、Paddle 等,屏蔽复杂的模型部署与调用细节,开发者无需了解 AI 底层实现即可直接在 Java 项目中集成使用,后续将持续扩展更多算法,目标是构建一个“像 Hutool 一样简单易用”的 JAVA AI 通用工具箱


快速开始

借助 SmartJavaAI 开源项目,你可以直接在 Java 中集成语音识别模型,无需自己处理复杂的深度学习框架。

Maven引入

在项目的 pom.xml 中添加以下依赖,详细引入方式参考 Maven 引入。

如需引入全部功能,请使用 【不推荐 ❌】 all 模块。

基础依赖
<dependency><groupId>cn.smartjavaai</groupId><artifactId>speech</artifactId><version>1.0.24</version>
</dependency>
FFmpeg 依赖

语音模块依赖 FFmpeg,可引入 jave-all-deps 或按平台引入对应原生库(推荐按平台选择,减小包体积)。

<dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>3.5.0</version>
</dependency>

模型简介及下载

这里仅介绍模型的开源项目,每个开源项目通常包含多个具体模型,本文不逐一列出。

模型下载-百度网盘地址

网盘仅包含部分常用模型,如需获取更多模型,请点击下方链接自行下载。

模型名称模型简介模型官网下载地址
WhisperOpenAI 开源的通用语音识别(ASR)模型,支持多语言转写和翻译,具有较高的识别精度,尤其在嘈杂环境中表现良好,适合离线和批量音频处理。Github官方下载
Vosk一个轻量级离线语音识别工具包,支持多种语言和平台(包括移动端与嵌入式设备),可在低资源环境中运行,适合实时语音识别场景。Github官方下载

Whisper语音识别

1、获取语音识别模型

public SpeechRecognizer getWhisperRecognizer() {AsrModelConfig config = new AsrModelConfig();config.setModelEnum(AsrModelEnum.WHISPER);//模型下载地址:https://huggingface.co/ggerganov/whisper.cpp/tree/mainconfig.setModelPath("/Users/xxx/Documents/develop/model/speech/ggml-medium.bin");return SpeechRecognizerFactory.getInstance().getModel(config);}

2、语音识别

public void testWhisper() {try {SpeechRecognizer recognizer = getWhisperRecognizer();WhisperParams params = new WhisperParams();//语言:中文params.setLanguage(Language.ZH);R<AsrResult> result = recognizer.recognize("src/main/resources/speech_zh.mp3", params);if (result.isSuccess()){log.info("识别成功:{}", JsonUtils.toJson(result.getData()));}else{log.info("识别失败:{}", result.getMessage());}} catch (Exception e) {e.printStackTrace();}
}

3、语音识别(个性化配置)

public void testWhisperWithCustomConfig() {try {SpeechRecognizer recognizer = getWhisperRecognizer();WhisperParams params = new WhisperParams();//语言:中文params.setLanguage(Language.ZH);/*** 解码搜索策略类型:* GREEDY - 贪婪解码,逐步选择概率最高的结果;* BEAN_SEARCH - Beam 搜索,保留多个候选路径以提高准确性。*/WhisperFullParams fullParams = new WhisperFullParams(WhisperSamplingStrategy.BEAN_SEARCH);//语言fullParams.language = Language.ZH.getCode();//线程数,设为 0 表示使用最大核心数。fullParams.nThreads = 0;//解码器使用的历史文本作为提示的最大 token 数。fullParams.nMaxTextCtx = 16384;//解码起始偏移(毫秒)fullParams.offsetMs = 0;//解码持续时长(毫秒),超过此长度的音频将被截断fullParams.durationMs = 0;//是否翻译为英文fullParams.translate = false;// 初始提示,用于提供上下文或样例,帮助模型更准确地理解语音内容fullParams.initialPrompt = "简体中文";//禁用上下文链接,不使用前一段解码结果作为上下文fullParams.noContext = true;//是否强制仅输出一个段落(适用于短语音)fullParams.singleSegment = false;//是否打印特殊标记fullParams.printSpecial = false;//是否直接从 whisper.cpp 中打印结果(不推荐,建议使用回调方式替代)fullParams.printRealtime = false;//抑制非语音 token输出fullParams.suppressNonSpeechTokens = false;//更多参数请查看官网:https://github.com/GiviMAD/whisper-jni/blob/33854520b1f0b3697106a7932a2fd64e8191bca9/src/main/java/io/github/givimad/whisperjni/WhisperFullParams.javaparams.setParams(fullParams);//建议上传 WAV 格式音频。其他格式将自动转换为 WAV,可能影响处理速度R<AsrResult> result = recognizer.recognize("src/main/resources/speech_zh.mp3", params);if (result.isSuccess()){log.info("识别成功:{}", JsonUtils.toJson(result.getData()));}else{log.info("识别失败:{}", result.getMessage());}} catch (Exception e) {e.printStackTrace();}
}

4、语音识别(使用Grammar语法规则)

 public void testWhisperWithGrammar() {try {WhisperRecognizer whisperRecognizer = (WhisperRecognizer)getWhisperRecognizer();//语法规则String grammarText = "root ::= \" And so, my fellow American, ask not what your country can do for you, ask what you can do for your country.\"";try (WhisperGrammar grammar = whisperRecognizer.parseGrammar(grammarText)){WhisperParams params = new WhisperParams();WhisperFullParams fullParams = new WhisperFullParams(WhisperSamplingStrategy.BEAN_SEARCH);//语言:英文fullParams.language = Language.EN.getCode();fullParams.grammar = grammar;params.setParams(fullParams);//建议上传 WAV 格式音频。其他格式将自动转换为 WAV,可能影响处理速度R<AsrResult> result = whisperRecognizer.recognize("src/main/resources/jfk_en.wav", params);if (result.isSuccess()){log.info("识别成功:{}", JsonUtils.toJson(result.getData()));}else{log.info("识别失败:{}", result.getMessage());}} catch (Exception e) {throw new RuntimeException(e);}} catch (Exception e) {e.printStackTrace();}
}

Vosk语音识别

1、获取Vosk中文语音模型

public SpeechRecognizer geVoskRecognizer() {AsrModelConfig config = new AsrModelConfig();config.setModelEnum(AsrModelEnum.VOSK);/*** 每个模型只支持一种语言,请下载对应语音的模型,模型下载地址:https://alphacephei.com/vosk/models* 将模型解压后,将模型目录位置填写到此处*/config.setModelPath("/Users/wenjie/Documents/develop/model/speech/vosk-model-cn-0.22");/*** macos m系列芯片需要手动下载依赖库,并指定位置,其他平台不需要* 下载地址:https://pan.baidu.com/s/1LZ_EX1XdTTp_f5ruud82MA?pwd=1234 提取码: 1234*/config.setLibPath(Paths.get("/Users/wenjie/Downloads/vosk-arrch64-dylib-main/libvosk.dylib"));return SpeechRecognizerFactory.getInstance().getModel(config);
}

2、Vosk语音识别

 public void testVosk() {try {SpeechRecognizer recognizer = geVoskRecognizer();//建议上传 WAV 格式音频。其他格式将自动转换为 WAV,可能影响处理速度R<AsrResult> result = recognizer.recognize("src/main/resources/lff_zh.mp3");if (result.isSuccess()){log.info("识别成功:{}", JsonUtils.toJson(result.getData()));}else{log.info("识别失败:{}", result.getMessage());}} catch (Exception e) {e.printStackTrace();}}

3、Vosk 语音识别(使用Grammar语法规则)

public void testVoskWithGrammar() {try {//获取英文模型SpeechRecognizer recognizer = geEnVoskRecognizer();VoskParams voskParams = new VoskParams();//英文voskParams.setLanguage(Language.EN);voskParams.setGrammar("[\"one two three four five six seven eight nine zero oh\"]");//建议上传 WAV 格式音频。其他格式将自动转换为 WAV,可能影响处理速度R<AsrResult> result = recognizer.recognize("src/main/resources/test_en.wav",voskParams);if (result.isSuccess()){log.info("识别成功:{}", JsonUtils.toJson(result.getData()));}else{log.info("识别失败:{}", result.getMessage());}} catch (Exception e) {e.printStackTrace();}
}

4、Vosk 语音识别(使用Vosk内部识别器)

public void testVoskAdvanced() {try {VoskRecognizer recognizer = (VoskRecognizer)geVoskRecognizer();//使用vosk内部接口,需要指定识别音频的采样率Recognizer voskRecognizer = recognizer.createAdvancedRecognizer(16000);voskRecognizer.setWords(true);voskRecognizer.setPartialWords(true);// 使用vosk内部接口,只支持wav格式String audioPath = "src/main/resources/lff_zh.wav";InputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(audioPath)));int nbytes;byte[] b = new byte[4096];while ((nbytes = ais.read(b)) >= 0) {if (voskRecognizer.acceptWaveForm(b, nbytes)) {log.info(voskRecognizer.getResult());} else {log.info(voskRecognizer.getPartialResult());}}log.info(voskRecognizer.getFinalResult());} catch (Exception e) {e.printStackTrace();}
}

5、Vosk 实时语音识别(麦克风)

public void testVoskRealTime() {try {VoskRecognizer recognizer = (VoskRecognizer)geVoskRecognizer();//使用vosk内部接口,需要指定识别音频的采样率Recognizer voskRecognizer = recognizer.createAdvancedRecognizer(16000);voskRecognizer.setWords(true);voskRecognizer.setPartialWords(true);// 设置音频格式: 16kHz, 16bit, 单声道, PCMAudioFormat format = new AudioFormat(16000, 16, 1, true, false);// 获取可用的 TargetDataLineDataLine.Info info = new DataLine.Info(TargetDataLine.class, format);if (!AudioSystem.isLineSupported(info)) {System.out.println("麦克风不支持该格式");System.exit(0);}TargetDataLine microphone = (TargetDataLine) AudioSystem.getLine(info);microphone.open(format);microphone.start();int nbytes;byte[] b = new byte[4096];while ((nbytes = microphone.read(b,0,b.length)) >= 0) {if (voskRecognizer.acceptWaveForm(b, nbytes)) {log.info(voskRecognizer.getResult());} else {log.info(voskRecognizer.getPartialResult());}}log.info(voskRecognizer.getFinalResult());} catch (Exception e) {e.printStackTrace();}
}

完整示例项目

项目地址:https://gitee.com/dengwenjie/SmartJavaAI/tree/master/examples


开源项目地址

🔗 Gitee 项目地址:https://gitee.com/dengwenjie/SmartJavaAI

🔗 GitHub 项目地址:https://github.com/geekwenjie/SmartJavaAI

🔗 GitCode 项目地址:https://gitcode.com/geekwenjie/SmartJavaAI

📖 在线文档地址:http://doc.smartjavaai.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96270.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96270.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96270.shtml

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

相关文章

第3周 机器学习课堂记录

1.学习问题的分类有监督的学习分类回归无监督学习聚类密度估计&#xff1a;确定输入空间中的数据的分布可视化&#xff1a;把高位空间中的数据投影到二维或三维空间强化学习不给定最优输出的示例&#xff0c;而是通过试错发现最优输出2.泛化versus过度拟合背景引入&#xff1a;…

消息队列(MQ)高级特性深度剖析:详解RabbitMQ与Kafka

一、引言&#xff1a;为什么需要关注高级特性&#xff1f; 在现代分布式系统架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;已成为不可或缺的核心组件。初级使用消息队列可能只需几行代码就能实现基本功能&#xff0c;但要真正发挥其在大规模生产环境中的威…

【GPT入门】第65课 vllm指定其他卡运行的方法,解决单卡CUDA不足的问题

【GPT入门】第65课 vllm指定其他卡运行的方法&#xff0c;解决单卡CUDA不足的问题&#xff11;.原理说明&#xff1a;&#xff12;.实践&#xff11;.原理 要将 vllm 部署在第二张 GPU 卡上&#xff08;设备编号为 1&#xff09;&#xff0c;只需在命令前添加 CUDA_VISIBLE_DE…

Spring Boot Actuator自定义指标与监控实践指南

Spring Boot Actuator自定义指标与监控实践指南 本篇文章以生产环境实战经验为主线&#xff0c;结合某电商系统的业务场景&#xff0c;讲解如何在Spring Boot Actuator中添加并暴露自定义指标&#xff0c;并使用Prometheus和Grafana进行完整的监控与告警配置。 一、业务场景描述…

Vue报错<template v-for=“option in cardOptions“ :key=“option.value“>

在Vue项目中遇到报错&#xff0c;原因是模板中使用了<template>标签内的v-for指令&#xff0c;而当前Vue版本不支持此用法。解决方案是移除<template>标签&#xff0c;直接在<el-option>上使用v-for。同时优化计算属性cardOptions&#xff0c;使其能够兼容历…

人工智能学习:Transformer结构中的规范化层(层归一化)

Transformer结构中的规范化层(层归一化) 一、规范化层(层归一化)介绍 概念 层归一化(Layer Normalization) 是一种用于提高深度神经网络训练稳定性和加速收敛的技术,广泛应用于现代深度学习模型中,尤其是在Transformer等序列建模网络中。它通过对每一层的输出进行归一化…

盼之代售 最新版 decode__1174

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 部分python代码 cp1 execj…

Transformer系列 | Pytorch复现Transformer

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、Transformer和Seq2Seq 在之前的博客中我们学习了Seq2Seq(深度学习系列 | Seq2Seq端到端翻译模型)&#xff0c;知晓了Attention为RNN带来的优点。那么有没有…

【MySQL】常用SQL语句

介绍常用的DDL语句、DML语句基本语法分号结尾使用空格和缩进不区分大小写--或#注释单行内容 /*注释多行内容*/DDL数据定义语句&#xff1a;定义数据库、表、字段一、操作库-- 创建库create database db1;-- 创建库是否存在&#xff0c;不存在则创建create database if not exi…

云手机就是虚拟机吗?

云手机并非等同于虚拟机&#xff0c;尽管二者存在一定相似性&#xff0c;但有着诸多区别&#xff0c;以下从多个方面来分析&#xff1a;云手机是一种基于云计算技术&#xff0c;将云端服务器虚拟化为手机设备&#xff0c;用户能通过网络远程操控的虚拟手机服务&#xff0c;它从…

准确--Nginx 1.28.0 安装与配置流程

Nginx 1.28.0 安装与配置流程 1. 下载与解压 cd ~ wget http://nginx.org/download/nginx-1.28.0.tar.gz tar -zxvf nginx-1.28.0.tar.gz cd nginx-1.28.02. 配置编译参数 ./configure \--prefix/home/ynnewweb/nginx \--with-http_ssl_module \--with-http_gzip_static_module…

无标记点动捕新范式:Xsens系统助力人形机器人实现毫米级动作复刻

Xsen搭载Manus数据手套在机器人操作与机器学习中的应用当前&#xff0c;人形机器人正加速向工业装配、家庭陪护、仓储物流等场景渗透&#xff0c;而 “如何让机器人的动作既符合人类运动规律&#xff0c;又能实现高精度执行” 成为制约其落地的核心瓶颈。Xsens 高精度全身动捕系…

mysql57超管root忘记密码怎么办

目录 背景 1.首先停止数据库 2.使用免密模式启动 3.修改密码 3.1刷新权限配置 3.2修改密码 4.杀掉mysql 5.重新正常启动mysql 6.查看mysql状态 7.验证 7.1首先服务器本地验证 7.2远程验证 背景 数据库密码忘记了,急的抓耳挠腮,怎么也想不起来,于是就开始重置吧 1.…

RESTful API:@RequestParam与@PathVariable实战对比

RequestParam vs PathVariable 在删除和查找操作中的使用差异 在项目实战中&#xff0c;选择使用 RequestParam 还是 PathVariable 来接收ID参数&#xff0c;通常基于以下几个考虑因素&#xff1a; 1. RESTful API 设计原则 查找操作使用 PathVariable GetMapping("/depts…

剧本杀小程序系统开发:开启沉浸式社交娱乐新纪元

在当今数字化浪潮席卷的时代&#xff0c;社交娱乐方式正经历着前所未有的变革。剧本杀&#xff0c;这一融合了角色扮演、推理悬疑与社交互动的线下娱乐项目&#xff0c;近年来迅速风靡全国&#xff0c;成为年轻人热衷的社交新宠。而随着移动互联网的蓬勃发展&#xff0c;剧本杀…

中线安防保护器,也叫终端电气综合治理保护设备为现代生活筑起安全防线

中线安防保护器&#xff08;Neutral Line Protection Device&#xff0c;简称NLPD&#xff09;是一种专门用于监测和保护电力系统中性线的安全装置。中线安防保护器的基本原理为:通过电流检测环节采集系统中性线上过电流信息&#xff0c; 经控制器快速计算并提取各次谐波电流的…

Spring Cloud Alibaba快速入门02-Nacos配置中心(下)

文章目录前言配置中心 - 数据隔离示例1.先创建命名空间2.创建配置3.克隆配置4.动态切换环境5.yml多文档模式spring.profiles.activedevspring.profiles.activetest总结前言 上一章简单了解了Nacos配置中心的基本用法&#xff0c;这一章将开始Nacos配置中心的实战案例。 配置中…

基于结构光相移法的三维重建

基于结构光相移法的三维重建程序 1. 介绍 结构光相移法是一种常用的三维重建技术&#xff0c;通过投射条纹图案并捕捉其变形来计算物体的三维形状。相移法通过多次投射不同相位的条纹图案&#xff0c;利用相位信息来提取物体表面的深度信息。 2. MATLAB实现 2.1 生成条纹图案 首…

机器学习10——降维与度量学习(K近邻、多维缩放、主成分分析)

上一章&#xff1a;机器学习09——聚类 下一章&#xff1a;机器学习11——特征选择与稀疏学习 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、k近邻学习&#xff08;kNN&#…

Js 图片加载完成 与 图片缓存加载的区别

这两个有什么区别// 图片加载完成后淡入$img.on(load, function () {$img.css(opacity, 1);});// 处理图片缓存情况if ($img[0].complete) {$img.css(opacity, 1);}要理解这两段代码的区别&#xff0c;需要先明确它们的核心作用场景和执行时机差异—— 本质是解决 “图片加载完…