万分感谢原创作者

最近研究vosk  官网提供的gradle  gradle没用过,研究了好久 没搞定

本文采用的是springboot+maven,这样看起来就轻松多了

核心代码

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>voice</artifactId><version>0.0.1-SNAPSHOT</version><name>voice-ai</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><repositories><repository><id>com.alphacephei</id><name>vosk</name><url>https://alphacephei.com/maven/</url></repository></repositories><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.7.0</version></dependency><dependency><groupId>com.alphacephei</groupId><artifactId>vosk</artifactId><version>0.3.30</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.8</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
VoiceUtil
package com.vosk.voskai;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sun.media.sound.WaveFileReader;
import com.sun.media.sound.WaveFileWriter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.vosk.LibVosk;
import org.vosk.LogLevel;
import org.vosk.Model;
import org.vosk.Recognizer;import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;@Component
public class VoiceUtil {@Value("${voskmodel}")private String VOSKMODELPATH;public String getWord(String filePath) throws Exception {Assert.isTrue(StringUtils.hasLength(VOSKMODELPATH), "无效的VOS模块!");byte[] bytes = Files.readAllBytes(Paths.get(filePath));// 转换为16KHZreSamplingAndSave(bytes, filePath);File f = new File(filePath);RandomAccessFile rdf = null;rdf = new RandomAccessFile(f, "r");
//        log.info("声音尺寸:{}", toInt(read(rdf, 4, 4)));
//        log.info("音频格式:{}", toShort(read(rdf, 20, 2)));short track = toShort(read(rdf, 22, 2));
//        log.info("1 单声道 2 双声道: {}", track);
//        log.info("采样率、音频采样级别 16000 = 16KHz: {}", toInt(read(rdf, 24, 4)));
//        log.info("每秒波形的数据量:{}", toShort(read(rdf, 22, 2)));
//        log.info("采样帧的大小:{}", toShort(read(rdf, 32, 2)));
//        log.info("采样位数:{}", toShort(read(rdf, 34, 2)));rdf.close();LibVosk.setLogLevel(LogLevel.WARNINGS);try (Model model = new Model(VOSKMODELPATH);InputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(filePath)));// 采样率为音频采样率的声道倍数Recognizer recognizer = new Recognizer(model, 16000 * track)) {int nbytes;byte[] b = new byte[4096];int i = 0;while ((nbytes = ais.read(b)) >= 0) {i += 1;if (recognizer.acceptWaveForm(b, nbytes)) {
//                    System.out.println(recognizer.getResult());} else {
//                    System.out.println(recognizer.getPartialResult());}}String result = recognizer.getFinalResult();
//            log.info("识别结果:{}", result);System.out.println("识别结果:{}" + result);if (StringUtils.hasLength(result)) {JSONObject jsonObject = JSON.parseObject(result);return jsonObject.getString("text").replace(" ", "");}return "";}}public static int toInt(byte[] b) {return (((b[3] & 0xff) << 24) + ((b[2] & 0xff) << 16) + ((b[1] & 0xff) << 8) + ((b[0] & 0xff) << 0));}public static short toShort(byte[] b) {return (short) ((b[1] << 8) + (b[0] << 0));}public static byte[] read(RandomAccessFile rdf, int pos, int length) throws IOException {rdf.seek(pos);byte result[] = new byte[length];for (int i = 0; i < length; i++) {result[i] = rdf.readByte();}return result;}public static void reSamplingAndSave(byte[] data, String path) throws Exception {WaveFileReader reader = new WaveFileReader();AudioInputStream audioIn = reader.getAudioInputStream(new ByteArrayInputStream(data));AudioFormat srcFormat = audioIn.getFormat();int targetSampleRate = 16000;AudioFormat dstFormat = new AudioFormat(srcFormat.getEncoding(),targetSampleRate,srcFormat.getSampleSizeInBits(),srcFormat.getChannels(),srcFormat.getFrameSize(),srcFormat.getFrameRate(),srcFormat.isBigEndian());AudioInputStream convertedIn = AudioSystem.getAudioInputStream(dstFormat, audioIn);File file = new File(path);WaveFileWriter writer = new WaveFileWriter();writer.write(convertedIn, AudioFileFormat.Type.WAVE, file);}
}

Controller

  @GetMapping("/getWordG")public String getWordG() {String path = "D:\\mp3\\11.wav";try {// 上传成功,开始解析String text = voiceUtil.getWord(path);return text;} catch (Exception e) {e.printStackTrace();return "上传失败";}}

最后,项目我上传了 大家可以直接下载 vosk的model也下载好了(中文的,需要英文的自己去vosk的网站下载)。vosk-ai.rar-Java文档类资源-CSDN文库https://download.csdn.net/download/gb617305413/34847847

java 离线语音识别相关推荐

  1. java离线语音识别_你家的油烟机,可以语音控制了吗?

    如果, 做饭时也能看球赛, 会不会更多男生也爱上厨房? 如果, 烧菜时手上不沾油, 会不会更多女生也爱上厨房? 如果, 你突然想吃糖醋里脊, 可以直接"问"家里的油烟机: &quo ...

  2. 手把手的操作——用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(二)

    上一篇的地址手把手的操作--用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(一) 上一篇讲到了最难的地方,参数的转换,这里单独写出来 ** 三.参数的转换(难点) ** 注:本文 ...

  3. 【项目管理】Java离线版语音识别-语音转文字

    Java离线版语音识别-语音转文字 1.项目前言 2.Vosk介绍 3.项目开发 3.1 项目准备 3.2 model 准备 3.3 测试音频准备 3.4 代码实现 4.效果演示 4.1 界面效果 4 ...

  4. JAVA开发离线语音识别

    可以离线识别,但是暂时只有一个小的语音库,识别准确率特别低. 如果谁有训练语音库的方法希望可以分享一下.谢谢! springboot框架搭的一个小demo. 原文地址还有前端页面html和js,有录音 ...

  5. 纯java离线版语音转文字

    前言 当前主流的语音识别大厂有科大讯飞.百度.谷歌等,但在他们官网中发现,支持java离线版的并不多,科大讯飞离线包仅基于安卓,而百度官方并没有离线版的,所以在资源查找中筛选出VOSK.CMU Sph ...

  6. Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率

    为什么80%的码农都做不了架构师?>>>    最近语音识别很火,但是都是用的在线语音识别,研究了一下离线语音识别,小范围内的语音识别率还不错,在此记录一下 首先本文要说的两个前提1 ...

  7. Ubuntu16.04实现Sphinx离线语音识别

    Ubuntu16.04实现Sphinx离线语音识别 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/boke14122621/article/deta ...

  8. 离线语音识别软件_6.语音板使用科大讯飞离线命令词识别

    0x00 离线命令词识别简介 语音识别技术(Auto Speech Recognize,简称ASR),就是把人的自然语言音频数据转换成文本数据的技术.理论上在线ASR是可以把所有的语音转换成对应的文本 ...

  9. 离线语音识别_离线语音识别库_离线语音识别sdk - 云+社区 - 腾讯云

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 是的,录音文件识别服务就是离线语音识别服务... 录音文件识别(即:离线 ...

最新文章

  1. HTTP POST慢速DOS攻击初探
  2. 只看到了别人28岁退休,背后的期权知识你知道吗?
  3. Design Pattern Template Method C
  4. linux的rhce考试题,【干货】RHCE考题和详细答案详攻略(一)
  5. [转]只让指定的机器连接SQLServer服务器
  6. python tcp服务器_Python 创建TCP服务器的方法
  7. 免费下载!《九年双11:互联网技术超级工程》,300页干货精华
  8. POJ4449(三维凸包+空间坐标旋转+二维凸包)
  9. JAVA数组Java StringBuffer 和 StringBuilder 类
  10. mysql书写规则_每天10分钟带你学会MySQL(二)SQL语句的基本书写规则
  11. 【ElasticSearch】es 面试题 视频 笔记
  12. 在有的公司,高手遍地走,天才不如狗
  13. Caliburn.Micro框架学习资料积累
  14. 联想计算机M.2固态银盘,联想ThinkPad T14拆机加装内存和M.2固态硬盘
  15. 订单可视化2实战-生产交付流程(流程再造核心区)
  16. 简单xss接收cookie平台的搭建以及xss拿cookie的一些总结
  17. GitHub好玩的项目之你想要的样子 我都有
  18. MySql 中 PK、NN、UQ、BIN、UN、ZF、AI、G分别代表什么意思
  19. [附源码]计算机毕业设计JAVA病历管理系统设计
  20. 深圳软件测试培训:DOM中元素节点、属性节点、文本节点的理解

热门文章

  1. rabbitmq java 重连_RabbitMQ Java客户端自动重新连接
  2. cplex小白感悟—前言
  3. http请求头中的host是什么意思
  4. 印欧语系及文化(Indo-European and Culture)英汉双语本(中译本,中文版)
  5. 分支定界算法在中学排课问题中的应用
  6. 8086/8088 寻址方式补充篇
  7. [PAT A1044]Shopping in Mars
  8. CentOS7安装json格式化工具jq
  9. 回复整理 080307
  10. 用户同步管理及集群初始配置-集群搭建步骤7