Разработка голоса Tmall Genie — второй день

робот

предисловие

  • Учебник в первый день«Разработка голоса Tmall Elf — день первый»Здесь мы попытались разработатьhello world
  • В сегодняшнем уроке мы собираемся создать намерение для запроса погоды и реализовать «Сяо Мо» -> «Я здесь, я могу помочь вам узнать погоду».

Процесс

  • Процесс настройки внешнего интерфейса
    • Создание намерений и сущностей погоды
    • Настройте односторонний диалог и последующие действия
    • Настройка многооборотных разговоров
  • Фоновый процесс разработки
    • Проанализируйте намерение запроса и верните ожидаемое значение
    • Отправьте код и разверните его онлайн
  • голосовой тест
  • Проект оффлайн

Процесс настройки внешнего интерфейса

Создание намерений и сущностей погоды

image.png

image.png

image.png

image.png

Настройте однократный диалог и теги корпуса

image.png

Меры предосторожности:

  • Погодные условия для всех городов можно создать с помощью шаблонов:@{city}@{sys.date(公共实体)}天气怎么样
  • Когда пользователь напрямую спрашивает "как погода", т.е. ни название города, ни дату запрашиваемой погоды, мы можем сделать следующее:
    • Если вы не знаете, погоду в каком городе запрашивать, вы можете добавить запрос в параметры, например, «Погода в каком городе сейчас?»;
    • Если вы не знаете дату запрашиваемой погоды, вы можете отключить «Genie Quest» и установить «Системное значение объекта по умолчанию» на «Сегодня».

Настройка многооборотных разговоров

image.png

Бэкенд разработка

Войдите на платформу разработки Alibaba Cloud (веб-сайт: workbench.aliyun.com) для разработки исходного кода.Подробности см. в учебном пособии первого дня.

Проанализируйте намерение запроса и верните ожидаемое значение

image.png

Полный код выглядит следующим образом:

package com.alibaba.ailabs;

import com.alibaba.ailabs.common.AbstractEntry;
import com.alibaba.da.coin.ide.spi.meta.AskedInfoMsg;
import com.alibaba.da.coin.ide.spi.meta.ExecuteCode;
import com.alibaba.da.coin.ide.spi.meta.ResultType;
import com.alibaba.da.coin.ide.spi.standard.ResultModel;
import com.alibaba.da.coin.ide.spi.standard.TaskQuery;
import com.alibaba.da.coin.ide.spi.standard.TaskResult;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.fc.runtime.Context;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Description 天猫精灵技能函数入口,FC
 * handler:com.alibaba.ailabs.GenieEntry::handleRequest
 * @Version 1.0
 **/
public class GenieEntry extends AbstractEntry {
    @Override
    public ResultModel<TaskResult> execute(TaskQuery taskQuery, Context context) {
        context.getLogger().info("taskQuery: " + JSON.toJSONString(taskQuery));
        ResultModel<TaskResult> res = new ResultModel<>();
        TaskResult taskResult = new TaskResult();
        // 从请求中获取意图参数以及参数值
        Map<String, String> paramMap = taskQuery.getSlotEntities().stream().collect(Collectors.toMap(slotItem -> slotItem.getIntentParameterName(), slotItem -> slotItem.getStandardValue()));
        
        String intentName = taskQuery.getIntentName();

        if("gclm-hi".equals(intentName)){
            taskResult.setReply("主人我在,我可以帮你查询天气");
        } else if("wether".equals(intentName)){
             String city = paramMap.get("city");
             //意图中 date 参数勾选了必选,请求数据中一定会携带 date 参数,因此只需要判断 city 参数有没有
             if(StringUtils.isBlank(city)) {
                   taskResult.setReply("主人,你要查询那个城市的天气啊!!!");
             }
            // 这是使用假数据
            taskResult.setReply("主人,"+city + paramMap.get("sys.date(公共实体)") + "天气 晴");
        } else {
            taskResult.setReply("主人,我无法识别你的意图,等我重新学习后再来更好的服务主人");
        }

        
       return reply(taskResult);
    }

    /**
     * 结束对话的回复,回复后音箱闭麦
     */
    private ResultModel<TaskResult> reply(TaskResult taskResult) {
        ResultModel<TaskResult> res = new ResultModel<>();
        taskResult.setExecuteCode(ExecuteCode.SUCCESS);
        taskResult.setResultType(ResultType.RESULT);
        res.setReturnCode("0");
        res.setReturnValue(taskResult);
        return res;
    }

    /**
     * 指定追问参数,音箱自动开麦,用户的回答优先匹配追问的参数
     */
    private ResultModel<TaskResult> askReply(TaskResult taskResult, String parameterName, Long intentId) {
        ResultModel<TaskResult> res = new ResultModel<>();
        taskResult.setExecuteCode(ExecuteCode.SUCCESS);
        taskResult.setResultType(ResultType.ASK_INF);
        AskedInfoMsg askedInfoMsg = new AskedInfoMsg();
        askedInfoMsg.setIntentId(intentId);
        askedInfoMsg.setParameterName(parameterName);
        List<AskedInfoMsg> askedInfos = new ArrayList<>();
        askedInfos.add(askedInfoMsg);
        taskResult.setAskedInfos(askedInfos);
        res.setReturnValue(taskResult);
        return res;
    }
}

Отправьте код и разверните его онлайн

  • Коммит кода с Git
  • Выберите предварительную среду для развертывания в Интернете. Подробности см. в учебном пособии первого дня.

голосовой тест

Войдите в онлайн-тест, чтобы проверить

image.png

Проект оффлайн

После завершения онлайн-тестирования мне необходимо своевременно перевести развернутое приложение в автономный режим на платформе облачной разработки.Поскольку бесплатная квота ограничена, если приложение не будет переведено в автономный режим вовремя, будут понесены ненужные расходы.

Я забыл выйти из системы вчера. Запустить определенное количество трафика

image.png

image.png