Сохранить потоковую передачу, предоставляемую AWS Polly, в файл wav
Я пытаюсь создать веб-страницу, где пользователь сможет прослушивать текст, который он вводит. Я также хочу предоставить функциональность для загрузки медиа в .wav
формат.
Я могу получить AudioStream
от AmazonPollyClient
но не в состоянии сохранить поток в .wav
файл.
Вот что я пытаюсь...
public void convertToWav(SynthesizeSpeechResult result, File convertedFile) throws IOException {
try (AudioInputStream sias = AudioSystem.getAudioInputStream(result.getAudioStream())){
AudioFormat newFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 8000f, 16, 1, 2, 8000f, false);
AudioInputStream convert1AIS = AudioSystem.getAudioInputStream(newFormat, sias);
AudioSystem.write(convert1AIS, AudioFileFormat.Type.WAVE, convertedFile);
convert1AIS.close();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.gc();
}
но каждый раз звоню getAudioInputStream()
это бросает IOException
java.io.IOException: mark/reset not supported
at java.io.InputStream.reset(InputStream.java:348)
at com.amazonaws.internal.SdkFilterInputStream.reset(SdkFilterInputStream.java:112)
at com.amazonaws.event.ProgressInputStream.reset(ProgressInputStream.java:168)
at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(SoftMidiAudioFileReader.java:139)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1113)
PS: я пробовал оборачивать result.getAudioStream()
в BufferedInputStream()
, Не показывать!
Любая помощь будет оценена.
1 ответ
Наконец-то я придумала способ сэкономить InputStream
предоставлено polly-aws-sdk
public static boolean getWavFile(String filePath, InputStream audioStream) throws IOException {
boolean result = false;
try {
byte[] decodedData = IOUtils.toByteArray(audioStream);
System.out.println(">>Decoded Data" + Arrays.toString(decodedData));
File outFile = new File(filePath);
AudioFormat format = new AudioFormat(8000, 16, 1, true, false);
AudioSystem.write(new AudioInputStream(new ByteArrayInputStream(
decodedData), format, decodedData.length), AudioFileFormat.Type.WAVE, outFile);
result = true;
return result;
} catch (IOException ex) {
System.out.println("<<getWavFile - impl" + ex);
return result;
}
}