У меня есть следующая функция, которая возвращает список, который будет содержать имена аудиофайлов, как только они будут загружены: < /p>
List getAudios(List text)
Внутри его я использую метод разговора класса службы в простом для lop:
for (String s: text) {
futures.add(this.talkService.talk(s));
}
Метод разговора отправляет запрос на API Azure и делает две вещи:
[*] Получает SpeechSynthesEresult аудиодатики как Br/ol>
. Получение звука возвращает только Future , а не overseablefuture :
Future SpeakSsmlAsync(final String var1)
Поэтому мне нужно вызвать метод блокировки .get () , чтобы получить аудио. Чтобы компенсировать эту проблему, я раскручиваю новую параллельную нить, чтобы сделать это: < /p>
CompletableFuture talk(String text) {
CompletableFuture completableFuture = new CompletableFuture();
SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(config, null);
...
taskExecutor.execute(() -> {
...
Future result = speechSynthesizer.SpeakSsmlAsync(ssmlText);
SpeechSynthesisResult audioResult = result.get();
if (audioResult.getReason() == ResultReason.SynthesizingAudioCompleted) {
byte[] data = audioResult.getAudioData();
String filename = this.fileService.writeToFile(data, "mp3");
completableFuture.complete(filename);
}
});
return completableFuture;
}
Метод writetofile -это метод синхронизации, который использует файл fileOutputStream для записи данных Byte [] в файл.
мой контроллер вызывает действие , который объединяет все аудио файлы:
Подробнее здесь: https://stackoverflow.com/questions/794 ... erformance