Ошибки синтеза и воспроизведения
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(false).
Бот не будет воспроизводить реплики с помощью синтеза или из аудиофайлов, пока не получит новый запрос пользователя или событие.
Используйте этот метод только в стейте с событием 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) — в обоих случаях поведение будет одинаковым.