Java集成Vosk实现离线语音识别 (Java 免费语音转文字)

本项目主要分享如何在 Java 环境中集成 Vosk,实现免费且纯离线的语音转文字功能。针对商业 API 收费高、依赖网络且存在隐私风险的痛点,Vosk 提供了一个极佳的开源解决方案。
Vosk 官方支持中文等 20 多种语言,其轻量级模型仅约 50MB,非常适合在移动端、树莓派或内网服务器中脱机运行。本教程将引导大家完成从环境搭建到代码实现的完整闭环,避免由于配置导致的“踩坑”。
1
介绍vosk

Vosk是言语识别工具包。Vosk最好的事情是:
- 支持二十+种语言 - 中文,英语,印度英语,德语,法语,西班牙语,葡萄牙语,俄语,土耳其语,越南语,意大利语,荷兰人,加泰罗尼亚语,阿拉伯, 希腊语, 波斯语, 菲律宾语,乌克兰语, 哈萨克语, 瑞典语, 日语, 世界语, 印地语, 捷克语, 波兰语, 乌兹别克语, 韩国语, 塔吉克语, 吉尔吉斯语
- 移动设备上脱机工作-Raspberry Pi,Android,iOS
- 使用简单的 pip3 install vosk 安装
- 每种语言的手提式模型只有是50Mb, 但还有更大的服务器模型可用
- 提供流媒体API,以提供最佳用户体验(与流行的语音识别python包不同)
- 还有用于不同编程语言的包装器-java / csharp / javascript等
- 可以快速重新配置词汇以实现最佳准确性
- 支持说话人识别
2
导入依赖

添加 Maven 依赖
<!-- Vosk 核心依赖 -->
<dependency>
<groupId>com.alphacephei</groupId>
<artifactId>vosk</artifactId>
<version>0.3.38</version>
</dependency>
<!-- JNA 依赖(Vosk 底层使用) -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.13.0</version>
</dependency>
3
下载模型




12
- 我们进入他的官网点击models
- 然后向下翻 翻到chinese这里 如图2 这里有两个模型 大家根据情况来判断下载哪个 都能用就一个轻量级一个普通的 轻量级准确率会偏低
- 由于下载比较慢 我把轻量级的放在
vosk-model-small-cn-0.22.zip
41.87MB
4
demo测试





123
- 下载完之后是个压缩包 然后把压缩包解压
- 解压之后目录是如图1所示的这样
- 大家要是测试的话可以用 https://www.freeconvert.com/zh
代码如下 效果如图3所示
package com.demo.voskdemo;
import org.vosk.Model;
import org.vosk.Recognizer;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.File;
class VoskDemoApplicationTests {
// 采样率
private static final int SAMPLE_RATE = 16000;
// 音频文件路径
private static final String audioPath = "/Users/gjq/Downloads/demo.wav";
public static void main(String[] args) {
try (Model model = new Model("/Users/gjq/Downloads/vosk-model-small-cn-0.22");
Recognizer recognizer = new Recognizer(model, SAMPLE_RATE);
AudioInputStream ais = AudioSystem.getAudioInputStream(new File(audioPath))) {
// 转换音频格式为 Vosk 要求的格式:16kHz, 16bit, 单声道
AudioFormat targetFormat = new AudioFormat(16000, 16, 1, true, false);
AudioInputStream convertedAis = AudioSystem.getAudioInputStream(targetFormat, ais);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = convertedAis.read(buffer)) != -1) {
recognizer.acceptWaveForm(buffer, bytesRead);
}
String result = recognizer.getFinalResult();
System.out.println("识别结果:" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
0
0
0
qq空间
微博
复制链接
分享 更多相关项目
猜你喜欢
评论/提问(已发布 0 条)
0