帖子

从讯飞语音交互demo定制个性化的回答

[复制链接]

该用户从未签到

4360 157****0615 发表于 2019-6-7 22:02:17 1#
这篇文章将对讯飞SDK附带的demo进行简单的分析.

截图中special文件夹就是关于讯飞语音合成的文字素材的相关类.
其中,Answer是语音内容的bean类,含有以下属性:
String mAnswer;//显示在对话气泡里的文本
String mTTSContent;//用于合成语音的文本
Runnable mAnswerCallback;//回调
HintHandler继承于抽象类 IntentHandler, 我们将继承HintHandler来满足我们个性化需求的定制.
我们打开 WeatherHandler,看到getFormatContent方法:@Override
public Answer getFormatContent(SemanticResult result) {
    if(notified) {
        Log.d("tag","return new Answer(result.answer);");
       return new Answer(result.answer);

    } else {
        StringBuilder answer = new StringBuilder(result.answer);
        JSONArray slots = result.semantic.optJSONArray("slots");
        for(int index = 0; index < slots.length(); index++) {
            JSONObject item = slots.optJSONObject(index);
            if(item.optString("name").contains("location")){
                // 问法意图中不包含具体的城市名,提示可使用定位让城市信息更准确
                if(item.optString("value").contains("CURRENT_CITY")) {
                    answer.append(NEWLINE);
                    answer.append(NEWLINE);
                    answer.append("<a href=\"use_loc\">使用定位让天气信息更准确</a>");
                    notified = true;
                    break;
                }
            }
        }
        return new Answer(answer.toString(), result.answer);//返回一个Answer对象让讯飞能够生成气泡和语音
    }
}

仿照以上的天气查询的类,我们可以设计一个自己的类: //定制一个查询当前车辆相关数据的类public class carMsgHandler extends IntentHandler{   
    private final String SPEED="speed";
    private final String TMEPERATURE ="temperature";
    private final String DRUNK ="drunk";
    private final String TIRED ="tired";
    private final String HEARTRATE="heartRate";
    private final String WEIGHT="weight";
    private final String BLOOD="blood";
    private final String BODY_TEMP="body_temp";


    public carMsgHandler(ChatViewModel model, PlayerViewModel player, PermissionChecker checker) {
        super(model, player, checker);
    }

    @Override
    public Answer getFormatContent(SemanticResult result) {

        String answer=null;

        JSONArray slots = result.semantic.optJSONArray("slots");
        JSONObject item = slots.optJSONObject(0);
        String askItem=item.optString("normValue");
        Log.d("test",askItem);
        switch (askItem){//对返回的json的
askItem进行检测,以匹配相关的查询
            case SPEED:{
                answer=new String("当前车速是"+NowData.getSpeed()+"公里每小时");//构建回复给用户的字符串
            }break;
            case TMEPERATURE:{
                answer=new String("车内温度为"+NowData.getTemperature()+"度");
            }break;
            case DRUNK:{
                answer=new String(NowData.drunk.compareTo("900")>0?"你可能酒驾":"未检测到酒驾,放心开车");
            }break;
            case TIRED:{
                answer=new String(TIRED.compareTo(NowData.tired)==0?"你可能已经疲劳驾驶,休息一下吧":"未疲劳驾驶,放心");
            }break;
            case HEARTRATE:{
                answer=new String("您的心率是"+ NowData.getHeartRate());
            }break;
            case WEIGHT:{
                answer=new String("您的体重是"+NowData.getWeight()+"公斤");
            }break;
            case BLOOD:{
                answer=new String("您的血压为 高压"+NowData.hBlood+" ,低压"+NowData.lBlood);
            }break;
            case BODY_TEMP:{
                answer="您的体温为 "+NowData.body_temp+"度";
            }break;
            default:answer="你想知道哪些数据呢";
        }
        return new Answer(answer);//使用
Answer(String)构造函数构造 气泡内容和语音内容都为answer的Answer对象
    }
}

最后,我们需要找到ChatMessageHandler类,可以看到静态块里便是对自定义技能的注册,我们在讯飞的技能平台上配置好,将我们的类添加到里面便完成了个性化定制.
QQ截图20190607212001.png
2.png

评分

参与人数 1语点 +5 收起 理由
讯飞2017hj + 5 赞一个!

查看全部评分