随着语音交互技术的发展,如何高效地处理用户的语音输入成为许多应用的重要课题。本文将详细介绍如何在一个Java项目中同时实现:
.wav
或 .pcm
音频文件<dependencies>
<dependency>
<groupId>org.voskgroupId>
<artifactId>vosk-javaartifactId>
<version>0.3.34version>
dependency>
<dependency>
<groupId>com.alibaba.nlsgroupId>
<artifactId>nls-sdk-javaartifactId>
<version>3.0.5version>
dependency>
dependencies>
import java.util.HashSet;
import java.util.Set;
public class HotSpotWords {
public static final Set<String> HOT_WORDS = new HashSet<>(Set.of(
"你好", "退出", "播放音乐", "打开设置", "天气怎么样", "帮我查一下"
));
}
import org.vosk.Model;
import org.vosk.Recognizer;
import org.vosk.LibVosk;
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
public class LocalASRWithHotSpot {
// 检测是否为热点语音
private static boolean isHotSpot(String text) {
return HotSpotWords.HOT_WORDS.stream().anyMatch(text::contains);
}
public static void main(String[] args) throws Exception {
// 初始化 Vosk 库
LibVosk.setLogLevel(0); // 设置日志级别
// 加载本地模型(路径根据实际修改)
Model model = new Model("models/cn-small");
// 打开音频文件
File audioFile = new File("samples/audio.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(audioFile);
// 转换音频格式为 PCM 16bit 单声道 16kHz
AudioFormat targetFormat = new AudioFormat(16000, 16, 1, true, false);
AudioInputStream convertedStream = AudioSystem.getAudioInputStream(targetFormat, ais);
// 创建识别器
Recognizer recognizer = new Recognizer(model, 16000);
byte[] buffer = new byte[4096];
int bytesRead;
System.out.println("开始本地语音识别...");
while ((bytesRead = convertedStream.read(buffer)) >= 0) {
if (bytesRead > 0) {
recognizer.acceptWaveForm(buffer, bytesRead);
}
}
String result = recognizer.finalResult();
System.out.println("最终识别结果: " + result);
// 热点检测
if (isHotSpot(result)) {
System.out.println("发现热点语音内容: " + result);
} else {
System.out.println("非热点语音内容");
}
// 关闭资源
recognizer.close();
convertedStream.close();
ais.close();
}
}
为了增强语音识别能力或使用更多高级功能,我们可以结合阿里云智能语音服务。以下是一个简单的示例:
import com.alibaba.nls.client.protocol.asr.AsrPidCallBack;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriber;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriberResponse;
import java.io.File;
import java.util.concurrent.CountDownLatch;
public class AliyunASRIntegration {
public static void main(String[] args) throws Exception {
String accessKeyId = "" ;
String accessKeySecret = "" ;
String appKey = "" ;
String audioFilePath = "path/to/audio.wav"; // 支持 wav/pcm/amr
CountDownLatch latch = new CountDownLatch(1);
SpeechTranscriber asrClient = new SpeechTranscriber(accessKeyId, accessKeySecret, appKey, new AsrPidCallBack() {
@Override
public void onRecognitionResultChange(SpeechTranscriberResponse response) {
String result = response.getTranscript();
System.out.println("实时识别结果:" + result);
}
@Override
public void onRecognitionCompleted(SpeechTranscriberResponse response) {
String finalResult = response.getTranscript();
System.out.println("最终识别结果:" + finalResult);
latch.countDown();
}
@Override
public void onTaskFailed(SpeechTranscriberResponse response) {
System.err.println("识别失败: " + response.getErrorMsg());
latch.countDown();
}
});
// 设置语言模型、采样率等参数(根据音频格式调整)
asrClient.setFormat("pcm"); // 可改为 wav/amr
asrClient.setSampleRate(16000); // 根据音频采样率调整
// 启动识别任务
File audioFile = new File(audioFilePath);
asrClient.start(audioFile);
latch.await(); // 等待识别完成
asrClient.stop(); // 停止客户端
}
}
通过本文,你现在可以在一个Java项目中实现:
这种方法不仅提高了系统的灵活性和隐私保护水平,还能根据具体需求灵活调整策略。希望这篇博客能为你提供有价值的信息,帮助你更好地理解和应用这项技术。如果有任何疑问或建议,欢迎留言交流!
GitHub 示例推荐: