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 к преобразованию текста в речь не блокируются при воспроизведении аудио.

Другие вопросы по тегам