Ошибки синтеза и воспроизведения
On-Premise
В разговоре бот может воспроизводить реплики:
-
С помощью синтеза речи. Например:
a: Привет!
-
С помощью предзаписанного аудиофайла. Например:
audio: https://example.com/hello.wav
Если возникла ошибка синтеза или ошибка воспроизведения файла, то по умолчанию бот пропускает такую реплику и переходит к следующей реакции.
Вы можете включить обработку таких ошибок. Обработка позволяет:
- Воспроизводить запасной аудиофайл, если возникла ошибка.
- Получать событие
speechInvalid
- Останавливать воспроизведение следующих реплик бота.
Обработка ошибок синтеза и воспроизведения доступна, только если платформа JAICP установлена к вам в контур.
Запасной аудиофайл
Включите обработку ошибок и добавьте запасной аудиофайл. Смотрите инструкцию в документации On-Premise.
Если обработка включена, бот использует запасной аудиофайл каждый раз при ошибке синтеза или воспроизведения.
Рассмотрим такой сценарий:
state: Promo
q!: Расскажите про акции
a: У нас появилась новая акция!
audio: https://example.com/audio.wav
a: Хотите поучаствовать?
Предположим, что аудиофайл по ссылке https://example.com/audio.wav
недоступен.
Если бот перейдет в стейт Promo
, то он:
- Произнесет:
У нас появилась новая акция!
. - Попробует воспроизвести аудиофайл
https://example.com/audio.wav
. Возникнет ошибка, и бот воспроизведет вместо этой реплики запасной аудиофайл. - Произнесет:
Хотите поучаствовать?
.
Событие speechInvalid
Событие speechInvalid
срабатывает, когда возникла ошибка синтеза или воспроизведения.
В стейте с событием speechInvalid
:
- Реакции начинают выполняться сразу после появления ошибки. Они выполняются асинхронно по отношению к реакциям текущего стейта.
- Если вы укажете реплики бота, они не будут воспроизведены.
- Используйте параметр
noContext = true
, чтобы контекст бота не переходил в этот стейт.
state: Promo
q!: Расскажите про акции
a: У нас появилась новая акция!
audio: https://example.com/audio.wav
a: Хотите поучаствовать?
state: Error || noContext = true
event!: speechInvalid
script:
$analytics.setComment("Проблема с синтезом или аудио");
Предположим, что аудиофайл по ссылке https://example.com/audio.wav
недоступен.
Если бот перейдет в стейт Promo
, то он:
- Произнесет:
У нас появилась новая акция!
. - Попробует воспроизвести аудиофайл
https://example.com/audio.wav
. Возникнет ошибка, и бот воспроизведет вместо этой реплики запасной аудиофайл. - Начнет выполнять реакции из стейта
Error
. Бот запишет в аналитику комментарий:Проблема с синтезом или аудио
. - Произнесет:
Хотите поучаствовать?
. - Будет ожидать следующий запрос пользователя или новое событие в стейте
Promo
, так как у стейтаError
включен параметрnoContext
.
Остановка следующих реплик
Если возникла ошибка, вы можете остановить все последующие реплики с помощью метода $dialer.continueSpeech
.
Бот не будет воспроизводить реплики с помощью синтеза или из аудиофайлов, пока не получит новый запрос пользователя или событие.
Используйте этот метод только в стейте с событием speechInvalid
.
Передайте false
в качестве аргумента:
state: Promo
q!: Расскажите про акции
a: У нас появилась новая акция!
audio: https://example.com/audio.wav
a: Хотите поучаствовать?
state: Error || noContext = true
event!: speechInvalid
script:
$dialer.continueSpeech(false);
$analytics.setComment("Проблема с синтезом или аудио")
Предположим, что аудиофайл по ссылке https://example.com/audio.wav
недоступен.
Если бот перейдет в стейт Promo
, то он:
-
Произнесет:
У нас появилась новая акция!
. -
Попробует воспроизвести аудиофайл
https://example.com/audio.wav
. Возникнет ошибка, и бот воспроизведет вместо этой реплики запасной аудиофайл. -
Начнет выполнять реакции из стейта
Error
:- Получит значение, которое установил метод
$dialer.continueSpeech
—false
. - Запишет в аналитику комментарий:
Проблема с синтезом или аудио
.
- Получит значение, которое установил метод
-
Не произнесет:
Хотите поучаствовать?
. -
Будет ожидать следующий запрос пользователя или новое событие в стейте
Promo
, так как у стейтаError
включен параметрnoContext
.
Если вы хотите, чтобы бот продолжал воспроизводить реплики, не указывайте $dialer.continueSpeech
в стейте с событием speechInvalid
.
Или укажите в этом стейте $dialer.continueSpeech(true)
— в обоих случаях поведение будет одинаковым.