Ну вот и я добрался до Шаблонов, и как обычно куча вопросов. Для начала я сделал простенькую схему
Общий контекст (9000)
забудь (0)
помощь (0)
(включи|выключи) (8000)
- свет (0)
- в холле (0)
у подъезда (0)
И добавил немного кода:
Общий контекст (9000)
использовать как контекст - ДА
- забудь (0)
помощь (0)
Код: Выделить всё
$actions=$this->getAvailableActions();
$total=count($actions);
for($i=0;$i<$total;$i++) {
say($actions[$i]);
}
(включи|выключи) (8000)
использовать как контекст - ДА
Выполнять при совпадении:
По истечении времени выполнить:
- свет (0) использовать как контекст - ДА
Выполнять при совпадении:
По истечении времени выполнить:
- в холле (0)
Выполнять при совпадении:Код: Выделить всё
switch ($matches[??????]) {
case "включи":
say('Включаю свет у подъезда');
break;
case "выключи":
say('Выключаю свет у подъезда');
break;
}
у подъезда (0)
Выполнять при совпадении:Код: Выделить всё
switch ($matches[?????]) {
case "включи":
say('Включаю свет у подъезда');
break;
case "выключи":
say('Выключаю свет у подъезда');
break;
}
Получилось немного громоздкое оформление, но без него трудно понять смысл дальнейших слов. Во первых, почему у меня первый пункт (включи|выключи)? Мне не хочется делать одинаковые пункты на включение и отключение. Вместо этого хочу попробовать принимать решение на основе $matches[] сравнивая его со словами
включи или
выключи.
Дальше вот такой диалог тоже будет успешный:
00:15 User1: у подъезда
00:15 Alice: Где?
00:14 User1: свет
00:14 Alice: Что именно включить?
00:14 User1: включи
А вот команда "включи свет", или сразу все "включи свет у подъезда" не работает. При этом Алиса входит только в первый контекст (включи|выключи). После команды "включи", Алиса спросит "Что именно?", а после команды "свет", спросит "Где?". Очень бы хотелось при этом, чтобы команда "включи свет" задействовала сразу два контекста, но Алиса при этом спросила только "Где", т.к. ответ на первый вопрос "Что именно?" уже дан в продолжении команды.
Ну а после полной команды "включи свет у подъезда" вообще не прозвучало вопросов "Что именно?" и "Где".
То есть нужно иметь возможность отменять код при совпадении шаблона, если после этого шаблона сразу сработал следующий шаблон, который входит в его контекст.
Еще одна тема - команда "забудь" в общем контексте. Добавил ее, чтобы вывести Алису из темы разговора. В Set context when matched: ничего не выбрано, однако Алиса все равно продолжает оставаться в контексте. Тут наверное что то не так. Есть вариант
Код: Выделить всё
SQLExec("UPDATE users SET ACTIVE_CONTEXT_ID=0 WHERE 1");
но наверное Алиса и так должна забыть контекст.
Вопрос по $matches[]. Можно ли в этом массиве видеть всю историю слов? По моему примеру обязательно нужно помнить первое совпадение (включи|выключи), когда мы доберемся непосредственно до действия.
И напоследок, подскажите, как передать команду в чат с Алисой из программы распознавания речи, чтобы она была напечатала в истории сообщений от
имени нужного нам
пользователя
_http://localhost/command.php?qry=Привет
По имени пользователя я хочу понимать из какой комнаты мы разговариваем с Алисой. В имени пользователя в этом случае будет имя комнаты. Соответственно туда, и только туда, нужно направлять звуковые сообщения. Я читал, и вижу в таблице `users`, что Шаблоны поведения различают разных пользователей и могут вести разные контексты у разных пользователей одновременно. Следовательно в коде контекстов нам нужно видеть имя текущего пользователя, с которым она разговаривает, чтобы именно в эту комнату отправить звук. Кто подскажет, как получить это имя текущего пользователя?