“首次提交”
commit
ebc9c69f0a
@ -0,0 +1,38 @@
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
||||
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8 (2)" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
@ -0,0 +1,45 @@
|
||||
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.example</groupId>
|
||||
<artifactId>voice-to-text-demo</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<!-- 获取音频信息 -->
|
||||
<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.7.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alphacephei</groupId>
|
||||
<artifactId>vosk</artifactId>
|
||||
<version>0.3.32</version>
|
||||
</dependency>
|
||||
<!-- 文字转语音 -->
|
||||
<dependency>
|
||||
<groupId>com.hynnet</groupId>
|
||||
<artifactId>jacob</artifactId>
|
||||
<version>1.18</version>
|
||||
</dependency>
|
||||
<!-- openai -->
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@ -0,0 +1,41 @@
|
||||
package org.example;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import javax.sound.sampled.*;
|
||||
import org.vosk.LogLevel;
|
||||
import org.vosk.Recognizer;
|
||||
import org.vosk.LibVosk;
|
||||
import org.vosk.Model;
|
||||
|
||||
// 识别传入的音频
|
||||
public class Main {
|
||||
public static void main(String[] args) throws IOException, UnsupportedAudioFileException {
|
||||
LibVosk.setLogLevel(LogLevel.DEBUG);
|
||||
|
||||
long startTime = System.currentTimeMillis(); // 记录开始时间
|
||||
|
||||
try (Model model = new Model("src\\main\\resources\\model\\vosk-model-cn-0.22");
|
||||
// try (Model model = new Model("D:\\Chrome Downloads\\voiceToText\\model\\vosk-model-small-cn-0.22");
|
||||
InputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream("src\\main\\resources\\voice\\dhxy.wav")));
|
||||
Recognizer recognizer = new Recognizer(model, 16000)) {
|
||||
|
||||
int bytes;
|
||||
byte[] b = new byte[4096];
|
||||
while ((bytes = ais.read(b)) >= 0) {
|
||||
recognizer.acceptWaveForm(b, bytes);
|
||||
}
|
||||
|
||||
System.out.println(recognizer.getFinalResult() + System.lineSeparator());
|
||||
}catch (Exception e){
|
||||
System.out.println("文件读取错误"+e);
|
||||
}
|
||||
|
||||
long endTime = System.currentTimeMillis(); // 记录结束时间
|
||||
long durationMillis = endTime - startTime; // 计算耗时(毫秒)
|
||||
|
||||
System.out.println("处理总耗时: " + durationMillis + " 毫秒");
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
package org.example;
|
||||
|
||||
|
||||
import com.jacob.activeX.ActiveXComponent;
|
||||
import com.jacob.com.Dispatch;
|
||||
import com.jacob.com.Variant;
|
||||
|
||||
|
||||
public class TxtToSoundUtils {
|
||||
|
||||
public static void main(String[] args) {
|
||||
textToSpeech("曾经有一份真挚的爱情摆在我的面前 但是我没有珍惜 等到了失去的时候才后悔莫及 尘世间最痛苦的事莫过于此 如果上天可以给我一个机会再来一次的话 我会跟那个女孩子说三个字: 我爱你");
|
||||
System.out.println("生成成功!");
|
||||
}
|
||||
|
||||
/**
|
||||
* 语音转文字并播放
|
||||
*
|
||||
* @param text
|
||||
*/
|
||||
public static void textToSpeech(String text) {
|
||||
ActiveXComponent ax;
|
||||
try {
|
||||
ax = new ActiveXComponent("Sapi.SpVoice");
|
||||
// 运行时输出语音内容
|
||||
Dispatch spVoice = ax.getObject();
|
||||
// 音量 0-100
|
||||
ax.setProperty("Volume", new Variant(100));
|
||||
// 语音朗读速度 -10 到 +10
|
||||
ax.setProperty("Rate", new Variant(-2));
|
||||
// 执行朗读
|
||||
Dispatch.call(spVoice, "Speak", new Variant(text));
|
||||
|
||||
// 下面是构建文件流把生成语音文件
|
||||
ax = new ActiveXComponent("Sapi.SpFileStream");
|
||||
Dispatch spFileStream = ax.getObject();
|
||||
|
||||
ax = new ActiveXComponent("Sapi.SpAudioFormat");
|
||||
Dispatch spAudioFormat = ax.getObject();
|
||||
|
||||
// 设置音频流格式
|
||||
Dispatch.put(spAudioFormat, "Type", new Variant(22));
|
||||
// 设置文件输出流格式
|
||||
Dispatch.putRef(spFileStream, "Format", spAudioFormat);
|
||||
// 调用输出 文件流打开方法,创建一个.wav文件
|
||||
Dispatch.call(spFileStream, "Open", new Variant("D:\\Chrome Downloads\\TestFile.wav"), new Variant(3), new Variant(true));
|
||||
// 设置声音对象的音频输出流为输出文件对象
|
||||
Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream);
|
||||
// 设置音量 0到100
|
||||
Dispatch.put(spVoice, "Volume", new Variant(100));
|
||||
// 设置朗读速度
|
||||
Dispatch.put(spVoice, "Rate", new Variant(-2));
|
||||
// 开始朗读
|
||||
Dispatch.call(spVoice, "Speak", new Variant(text));
|
||||
|
||||
// 关闭输出文件
|
||||
Dispatch.call(spFileStream, "Close");
|
||||
Dispatch.putRef(spVoice, "AudioOutputStream", null);
|
||||
|
||||
spAudioFormat.safeRelease();
|
||||
spFileStream.safeRelease();
|
||||
spVoice.safeRelease();
|
||||
ax.safeRelease();
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,68 @@
|
||||
package org.example;
|
||||
|
||||
import org.vosk.LibVosk;
|
||||
import org.vosk.LogLevel;
|
||||
import org.vosk.Model;
|
||||
import org.vosk.Recognizer;
|
||||
import javax.sound.sampled.*;
|
||||
import java.io.IOException;
|
||||
|
||||
// 持续监听
|
||||
public class demo1 {
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
LibVosk.setLogLevel(LogLevel.DEBUG);
|
||||
|
||||
// 设置音频格式
|
||||
AudioFormat format = new AudioFormat(16000, 16, 1, true, false);
|
||||
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
|
||||
|
||||
// 检查是否支持该音频格式
|
||||
if (!AudioSystem.isLineSupported(info)) {
|
||||
System.out.println("不支持的音频格式");
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
// 获取并打开音频输入线
|
||||
TargetDataLine microphone;
|
||||
try {
|
||||
microphone = (TargetDataLine) AudioSystem.getLine(info);
|
||||
microphone.open(format);
|
||||
} catch (LineUnavailableException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
// 创建Vosk识别器
|
||||
try (Model model = new Model("src\\main\\resources\\model\\vosk-model-cn-0.22");
|
||||
Recognizer recognizer = new Recognizer(model, 16000)) {
|
||||
|
||||
// 开始录音
|
||||
microphone.start();
|
||||
System.out.println("语言识别模型载入完成...");
|
||||
System.out.println("开始录音...");
|
||||
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
|
||||
while (true) { // 持续读取麦克风输入
|
||||
bytesRead = microphone.read(buffer, 0, buffer.length);
|
||||
if (bytesRead > 0) {
|
||||
recognizer.acceptWaveForm(buffer, bytesRead);
|
||||
String result = recognizer.getPartialResult(); // 获取部分识别结果
|
||||
System.out.println(result);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
// 关闭麦克风
|
||||
if (microphone != null && microphone.isOpen()) {
|
||||
microphone.stop();
|
||||
microphone.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,102 @@
|
||||
package org.example;
|
||||
|
||||
import org.vosk.LibVosk;
|
||||
import org.vosk.LogLevel;
|
||||
import org.vosk.Model;
|
||||
import org.vosk.Recognizer;
|
||||
import javax.sound.sampled.*;
|
||||
import java.io.IOException;
|
||||
|
||||
public class demo2 {
|
||||
|
||||
private static volatile boolean recording = false; // 控制录音的标志
|
||||
private static final String START_KEYWORD = "开始"; // 启动录音的关键词
|
||||
private static final String STOP_KEYWORD = "关闭"; // 停止录音的关键词
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
LibVosk.setLogLevel(LogLevel.DEBUG);
|
||||
|
||||
// 设置音频格式
|
||||
AudioFormat format = new AudioFormat(16000, 16, 1, true, false);
|
||||
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
|
||||
|
||||
// 检查是否支持该音频格式
|
||||
if (!AudioSystem.isLineSupported(info)) {
|
||||
System.out.println("不支持的音频格式");
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
// 获取并打开音频输入线
|
||||
TargetDataLine microphone;
|
||||
try {
|
||||
microphone = (TargetDataLine) AudioSystem.getLine(info);
|
||||
microphone.open(format);
|
||||
} catch (LineUnavailableException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
// 创建Vosk识别器用于检测关键词
|
||||
try (Model model = new Model("src\\main\\resources\\model\\vosk-model-cn-0.22");
|
||||
Recognizer recognizer = new Recognizer(model, 16000)) {
|
||||
|
||||
microphone.start();
|
||||
System.out.println("语言识别模型载入完成...");
|
||||
System.out.println("开始监听...");
|
||||
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
|
||||
// 初步监听关键词“开始”
|
||||
while (true) {
|
||||
bytesRead = microphone.read(buffer, 0, buffer.length);
|
||||
if (bytesRead > 0) {
|
||||
recognizer.acceptWaveForm(buffer, bytesRead);
|
||||
String result = recognizer.getPartialResult(); // 获取部分识别结果
|
||||
|
||||
if (result.contains(START_KEYWORD)) {
|
||||
System.out.println("检测到开始字样,启动录音...");
|
||||
recording = true;
|
||||
startRecording(microphone, model);
|
||||
break; // 退出循环,开始录音
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
// 关闭麦克风
|
||||
if (microphone != null && microphone.isOpen()) {
|
||||
microphone.stop();
|
||||
microphone.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void startRecording(TargetDataLine microphone, Model model) {
|
||||
try (Recognizer recognizer = new Recognizer(model, 16000)) {
|
||||
System.out.println("开始录音...");
|
||||
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
|
||||
while (recording) { // 进行实际的语音识别
|
||||
bytesRead = microphone.read(buffer, 0, buffer.length);
|
||||
if (bytesRead > 0) {
|
||||
recognizer.acceptWaveForm(buffer, bytesRead);
|
||||
String result = recognizer.getPartialResult(); // 获取部分识别结果
|
||||
System.out.println(result);
|
||||
|
||||
if (result.contains(STOP_KEYWORD)) {
|
||||
System.out.println("检测到关闭字样,停止录音...");
|
||||
recording = false; // 设置标志,停止录音
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,66 @@
|
||||
package org.example;
|
||||
|
||||
import org.vosk.LibVosk;
|
||||
import org.vosk.LogLevel;
|
||||
import org.vosk.Model;
|
||||
import org.vosk.Recognizer;
|
||||
import javax.sound.sampled.*;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
// 语音识别示例 停顿后不输出识别内容
|
||||
public class demo4 {
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
|
||||
LibVosk.setLogLevel(LogLevel.DEBUG);
|
||||
|
||||
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 60000, 16, 2, 4, 44100, false);
|
||||
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
|
||||
TargetDataLine microphone;
|
||||
SourceDataLine speakers;
|
||||
|
||||
try (Model model = new Model("src\\main\\resources\\model\\vosk-model-cn-0.22");
|
||||
Recognizer recognizer = new Recognizer(model, 120000)) {
|
||||
System.out.println("语言识别模型载入完成...");
|
||||
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) {
|
||||
numBytesRead = microphone.read(b, 0, CHUNK_SIZE);
|
||||
bytesRead += numBytesRead;
|
||||
|
||||
out.write(b, 0, numBytesRead);
|
||||
|
||||
speakers.write(b, 0, numBytesRead);
|
||||
|
||||
if (recognizer.acceptWaveForm(b, numBytesRead)) {
|
||||
System.out.println(recognizer.getResult());
|
||||
} else {
|
||||
System.out.println(recognizer.getPartialResult());
|
||||
}
|
||||
}
|
||||
System.out.println(recognizer.getFinalResult());
|
||||
speakers.drain();
|
||||
speakers.close();
|
||||
microphone.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,84 @@
|
||||
package org.example;
|
||||
|
||||
import org.vosk.LibVosk;
|
||||
import org.vosk.LogLevel;
|
||||
import org.vosk.Model;
|
||||
import org.vosk.Recognizer;
|
||||
import javax.sound.sampled.*;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
// 语音识别示例 对话
|
||||
public class demo5 {
|
||||
|
||||
private static final String WAKE_WORD = "小爱同学"; // 唤醒词
|
||||
|
||||
public static void main(String[] args) {
|
||||
// 设置日志级别
|
||||
LibVosk.setLogLevel(LogLevel.DEBUG);
|
||||
|
||||
// 配置音频格式
|
||||
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 16000, 16, 1, 2, 16000, true);
|
||||
DataLine.Info inputInfo = new DataLine.Info(TargetDataLine.class, format);
|
||||
DataLine.Info outputInfo = new DataLine.Info(SourceDataLine.class, format);
|
||||
|
||||
try (Model model = new Model("src/main/resources/model/vosk-model-cn-0.22");
|
||||
Recognizer recognizer = new Recognizer(model, 16000)) {
|
||||
|
||||
// 打开并启动麦克风
|
||||
try (TargetDataLine microphone = (TargetDataLine) AudioSystem.getLine(inputInfo)) {
|
||||
microphone.open(format);
|
||||
microphone.start();
|
||||
|
||||
// 准备音频输出(用于测试)
|
||||
try (SourceDataLine speakers = (SourceDataLine) AudioSystem.getLine(outputInfo)) {
|
||||
speakers.open(format);
|
||||
speakers.start();
|
||||
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
boolean wakeWordDetected = false;
|
||||
|
||||
System.out.println("等待唤醒词...");
|
||||
|
||||
while (true) {
|
||||
bytesRead = microphone.read(buffer, 0, buffer.length);
|
||||
if (bytesRead == -1) break; // 检测到流结束
|
||||
|
||||
// 写入扬声器用于播放(可选)
|
||||
speakers.write(buffer, 0, bytesRead);
|
||||
|
||||
// 简单的唤醒词检测
|
||||
if (!wakeWordDetected) {
|
||||
String partialResult = recognizer.getPartialResult();
|
||||
if (partialResult.replaceAll("\\s+", "").contains(WAKE_WORD)) {
|
||||
System.out.println("唤醒词检测到,开始语音识别...");
|
||||
wakeWordDetected = true;
|
||||
}
|
||||
}
|
||||
|
||||
// 启动语音识别
|
||||
if (wakeWordDetected) {
|
||||
if (recognizer.acceptWaveForm(buffer, bytesRead)) {
|
||||
System.out.println("识别结果: " + recognizer.getResult());
|
||||
} else {
|
||||
System.out.println("部分结果: " + recognizer.getPartialResult());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("最终结果: " + recognizer.getFinalResult());
|
||||
speakers.drain();
|
||||
} catch (Exception e) {
|
||||
System.err.println("音频播放错误: " + e.getMessage());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("音频输入错误: " + e.getMessage());
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
System.err.println("模型加载错误: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,4 @@
|
||||
package org.example;
|
||||
|
||||
public class openAiDemo {
|
||||
}
|
||||
Binary file not shown.
Loading…
Reference in New Issue