首页 > 解决方案 > 如何将音频 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);

任何人都可以帮助我,好吗?

标签: servletsaudiobase64ibm-watsonspeech-to-text

解决方案


推荐阅读