RxJS запускает операцию между каждой подпиской
Я реализовал угловую трубу, которая произносит переданный текст.
Я в основном делаю текст в речь на нескольких предложениях. Пользователь должен иметь возможность видеть предложение во время воспроизведения звука... Не после того, как аудио закончилось (у меня оно сейчас так).
Учитывая Observable строк, как я могу сразу подписаться на каждую из них, а затем воспроизвести аудио до завершения, прежде чем продолжить с остальными строками?
transform(input: Observable<string>, ...args) {
if (input) {
return input.concatMap(text => {
if (!text)
return Observable.empty()
let promise = Promise.resolve()
.then(() =>
this.service.textToSpeech(text)
)
.then((audio) =>
new Promise<string>((resolve) => {
player.play(audio)
player.addEventListener("ended", () => {
resolve(text) // The user sees the text when the audio stops..
})
})
)
return Observable.fromPromise(promise)
})
}
}
1 ответ
Я решил свою проблему, сжав со смещением, как это (где f(a)
это аудио для текста a
):
a, null
b, f(a)
c, f(b)
null, f(c)
Код не очень красивый, но он работает... С другой стороны, теперь запросы API к преобразованию текста в речь не блокируются при воспроизведении аудио.