servlets - 如何将音频 base64 字符串发送到服务器并在 java servlet 上进行转换?
问题描述
我有一个 Web 应用程序,它是一个带语音的聊天机器人。我正在使用 IBM Watson 和 HTML5/JavaScript 客户端和 Java Servlet API 服务器端。但是,当我在 Java 上将 base64 转换为 wav 音频文件时,只有噪音。
function generateBlob(blob) {
var url = URL.createObjectURL(blob);
var au = document.createElement("audio");
var li = document.createElement("li");
au.controls = true;
au.src = url;
li.appendChild(au);
document.querySelector("#recordingsList").appendChild(li);
var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
var base64data = reader.result;
sendData(base64data);
}
}
function sendData(data) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "speech", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.addEventListener("load", function() {
if (xhr.status == 200) {
console.log(xhr.responseText);
} else {
console.log(xhr.status);
console.log(xhr.responseText);
}
});
parameter = "audio=" + data;
xhr.send(parameter);
}
JavaScript blob 生成没问题!我可以在 HTML 上播放。但是当我向 Java Servlet 发送帖子时,它不起作用。将其从 Base64 转换为 File 后,它只是噪音。
String audio = req.getParameter("audio");
System.out.println(audio);
byte[] byteArray = Base64.getMimeDecoder().decode(audio.split("base64,")[1]);
File tempFile = File.createTempFile("speech-", ".wav", null);
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(byteArray);
fos.close();
try {
AudioInputStream ais = AudioSystem.getAudioInputStream(tempFile.getAbsoluteFile());
Clip clip = AudioSystem.getClip();
clip.open(ais);
clip.start();
} catch (UnsupportedAudioFileException | LineUnavailableException e) {
e.printStackTrace();
}
IamOptions options = new IamOptions.Builder()
.apiKey("<api_key>")
.build();
SpeechToText service = new SpeechToText(options);
RecognizeOptions recOptions = new RecognizeOptions.Builder()
.audio(tempFile)
.contentType(HttpMediaType.AUDIO_WAV)
.build();
SpeechRecognitionResults transcript = service.recognize(recOptions).execute().getResult();
System.out.println(transcript);
任何人都可以帮助我,好吗?
解决方案
推荐阅读
- javascript - 如何在 React 中强制重新渲染表单中的输入字段?
- django - 如何以 django 方式交换 Postgresql 的主节点?
- tidymodels - usemodels 包中的 xgboost 代码片段将 one_hot 设置为 TRUE 是否有原因?
- xamarin - Xamarin VideoView 图像源
- c# - WinExe 的 VSCode tasks.json 和 launch.json 依赖于 dll
- python - 根据另一个数据框的值向数据框添加新列
- node.js - 为什么 NodeJS 不支持 String.prototype.replaceAll?
- amazon-web-services - 为 ECS 服务中的所有任务定义唯一的环境变量
- javascript - Dialogflow 未检测到“退出对话”意图
- android - 为 Flutter 设置 android 初始屏幕默认系统导航和状态栏颜色