У меня есть решение для чат-ботов, и я пытаюсь реализовать функцию преобразования текста в речь.После того, как чат-бот возвращает ответ на вопрос, я вызываю пружинный API, который обрабатывает текст, преобразуя его в файл «audio / wav», возвращаемый службой преобразования текста в речь Watson.
Аудиоданные, возвращаемые Уотсоном, в порядке, когда я сохраняю данные на своем компьютере, я могу играть без проблем, но у меня возникают проблемы с возвратом этих данных клиенту javascript.В конце всего процесса я могу воспроизвести звуковой файл, полный шумов, но я не знаю почему.У меня нет опыта работы с аудиоданными, и, возможно, для более опытного разработчика, это может быть распространенной ошибкой.
весенняя загрузка webservice
@PostMapping("/text-to-speech")
@Produces(MediaType.APPLICATION_OCTET_STREAM_VALUE)
@Consumes(value = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<byte[]> textToSpeech(@RequestBody ConversationBean bean, HttpServletRequest request) {
try {
SpeechModel speechModel = new SpeechModelFactory().create(EPlataforma.IBM_BLUEMIX.getCodigo());
InputStream audio = speechModel.textToSpeech(bean.getInput());
byte[] arraySaida = IOUtils.toByteArray(audio);
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("charset", "utf-8");
responseHeaders.setContentType(MediaType.valueOf("audio/wav"));
responseHeaders.set("Content-disposition", "attachment; filename=filename.wav");
return new ResponseEntity<byte[]>(arraySaida, responseHeaders, HttpStatus.OK);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
вызов javascript для службы весенней загрузки
function textToSpeech(text) {
console.log("textToSpeech: " + text);
var data = {
input: text
};
$.ajax({
url: urlTextToSpeech,
beforeSend: function (request) {
request.setRequestHeader("Authorization", tokenAuth);
},
cache: false,
timeout: 600000,
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(data),
success: function (data, textStatus, request) {
console.log("textToSpeech return: ", data);
playByteArray(data);
},
error: function (request, error) {
console.log("error: " + JSON.stringify(request));
}
});
}
JavaScript получает и воспроизводит аудио
function playByteArray(bytes) {
var array = getByteArray(bytes);
var isWAV = array[0] === 82 && array[1] === 73 && array[2] === 70 && array[3] === 70 &&
array[8] === 87 && array[9] === 65 && array[10] === 86 && array[11] === 69;
console.log("Is a valid WAV File? : " + isWAV);
/* TODO: replace the blob content with your byte[] */
var blob = new Blob(array, {type: "application/octet-stream"});
var fileName = "c:\\temp\\boomcake3.wav";
saveAs(blob, fileName);
var arrayBuffer = new ArrayBuffer(array.length);
var bufferView = new Uint8Array(arrayBuffer);
for (i = 0; i < array.length; i++) {
bufferView[i] = array[i];
}
context.decodeAudioData(arrayBuffer, function(buffer) {
buf = buffer;
play();
});
}
// Play the loaded file
function play() {
console.log("audio decodificado, playing audio ...");
// Create a source node from the buffer
var source = context.createBufferSource();
console.log("step 2: ", source);
source.buffer = buf;
console.log("step 3: ", source.buffer);
// Connect to the final output node (the speakers)
source.connect(context.destination);
console.log("step 4 ", context.destination);
// Play immediately
source.start(0);
console.log("step 5 ", context.destination);
}
function getByteArray(dataStr) {
var array = new Uint8Array(dataStr.length);
for (var i = 0; i < dataStr.length; i++) {
array[i] = dataStr.charCodeAt(i);
}
return array;
}