IBM Watson Text to Speech - Spring Boot WEBSERVICE возвращает аудио в HTML5 - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть решение для чат-ботов, и я пытаюсь реализовать функцию преобразования текста в речь.После того, как чат-бот возвращает ответ на вопрос, я вызываю пружинный 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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...