如何解决使用java中的麦克风通过VOSK
我正在尝试将实时语音识别添加到我的 Java 项目中(最好是离线的)。通过一些谷歌搜索和尝试其他解决方案,我决定使用 VOSK 进行语音识别。然而,我遇到的主要问题是 VOSK 的文档很少,并且只有一个用于从预先录制的 wav 文件中提取文本的 java 示例文件,如下所示。
public static void main(String[] argv) throws IOException,UnsupportedAudioFileException {
LibVosk.setLogLevel(LogLevel.DEBUG);
try (Model model = new Model("src\\main\\resources\\model");
InputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream("src\\main\\resources\\python_example_test.wav")));
Recognizer recognizer = new Recognizer(model,16000)) {
int nbytes;
byte[] b = new byte[4096];
while ((nbytes = ais.read(b)) >= 0) {
System.out.println(nbytes);
if (recognizer.acceptWaveForm(b,nbytes)) {
System.out.println(recognizer.getResult());
} else {
System.out.println(recognizer.getPartialResult());
}
}
System.out.println(recognizer.getFinalResult());
}
}
我尝试将其转换为可以接受麦克风音频的内容,如下所示:
public static void main(String[] args) {
LibVosk.setLogLevel(LogLevel.DEBUG);
AudioFormat format = new AudioFormat(8000.0f,16,1,true,true);
TargetDataLine microphone;
SourceDataLine speakers;
try (Model model = new Model("src\\main\\resources\\model");
Recognizer recognizer = new Recognizer(model,16000)) {
try {
microphone = AudioSystem.getTargetDataLine(format);
DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);
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 <= 100000) {
numBytesRead = microphone.read(b,CHUNK_SIZE);
bytesRead += numBytesRead;
out.write(b,numBytesRead);
speakers.write(b,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();
}
}
}
这似乎正确地捕获了麦克风数据(因为它也输出到扬声器),但 VOSK 显示没有输入,不断将结果打印为空字符串。我究竟做错了什么?我正在尝试的甚至可能吗?我应该尝试寻找不同的语音识别库吗?
解决方法
这段代码对我来说工作正常,你可以使用这个:
public static void main(String[] args) {
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("model");
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) {
numBytesRead = microphone.read(b,CHUNK_SIZE);
bytesRead += numBytesRead;
out.write(b,numBytesRead);
speakers.write(b,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();
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。