百度自定义技能真机测试
再有2天就过年了,终于在过年前调通了百度DuerOs自定义技能接口,可以初步实现语音交互功能.
调试的过程非常坎坷.
- 开始根据文档和自己的判断,不知道在线调试的代码语音调用的事件需要自己编写.所以对于测试结果不知道怎么处理,群里问,回复说是要修改这个事件的代码.官网下载的代码粘贴过来,始终不能出现目标结果
- 官方群却不能给与具体的指导
- 因为是node.js,语言不熟悉
- 没有其他办法,今天在年前倒数第三天,终于2位前端熟悉js的同事帮助调整了js代码
在线编辑代码方式的接口对接终于跑通了.充分验证了一句话,远亲不如近邻,2位js开发的同事很好,在以前的公司,很多同事是事不关己,不会伸出援手的.这是猪年一件很幸运的事情.也是我在年会感谢大家的一次回应.
感悟是:
- 看似贫瘠的地方也有温暖,看似繁荣的地方也有荒芜.
- 多会一些知识,自信就多一些,尤其其他语言的代码,读懂,简单改写
- 不必再一个地方纠结时间太久,及早改变处理问题的策略,这次转变不算晚,很多意外,多种解决问题的方案.
开始调试不同的原因:
1.目前的自定义字典和百度官方文档不一样,开始以为是自定义词典配置的问题,调试不通,
后来经过学文和小乔调试node.js代码,而不是直接采用官方sdk的例子代码,测试才能跑通,注意事项参见下文红色标识。
下载的代码中没有这个分支:
if (this.request.isDialogStateCompleted())
每个分支的判断代码做了修改,目前都改成了card
2.一些坑,例如:表达式中不要使用“查个税”、“查询个税”等网络通用词汇
参考文档:
https://developer.dueros.baidu.c ... loy-sample_markdown
测试步骤:
1.创建自定义技能
选择入门模式,填写技能名称等信息
2.创建意图
其中包含了创建字典,创建表达式,创建槽位,测试意图,注意:表达式中不要使用“查个税”、“查询个税”等网络通用词汇,这个环节花费时间多,因为创建的自定义槽位和官网资料中的不一样,调试不通以为是这里的问题.后来放弃纠结这里,请同事帮忙测试.熟悉js的同事帮忙调试了代码
.
3.配置服务
选择在线调试模式,本案例采用node.js作为开发语言,注意:槽位标识不要使用location ,mothsalary,原因目前未知,换成其他测试通过。另外官网下载的源代码缺少结果返回的内容,根据说明文档做了代码修改.
“退出”指令能执行
//目前的输入表达式是写死的,音响只认识表达式中的内容,之外的不认识.后续需要写成活的.
代码:
const Bot = require('bot-sdk');
const privateKey = require("./rsaKeys.js").privateKey;
class DuerOSBot extends Bot {
constructor(postData) {
super(postData);
this.addLaunchHandler(() => {
this.waitAnswer();
let card = new Bot.Card.TextCard('欢迎使用技能');
return {
card: card,
outputSpeech: '欢迎使用技能'
};
});
this.addSessionEndedHandler(() => {
this.endSession();
return {
outputSpeech: '感谢您的使用'
};
});
this.addIntentHandler('tax', () => {
let loc = this.getSlot('city');
let monthlySalary = this.getSlot('number');
if (!monthlySalary) {
this.nlu.ask('number');
let card = new Bot.Card.TextCard('你工资多少呢');
// 如果有异步操作,可以返回一个promise
return new Promise(function (resolve, reject) {
resolve({
card: card,
outputSpeech: '你工资多少呢'
});
});
}
if (!loc) {
this.nlu.ask('city');
let card = new Bot.Card.TextCard('你在哪呢');
return {
card: card,
outputSpeech: '你在哪呢'
};
}
if (this.request.isDialogStateCompleted()) {
let card = new Bot.Card.TextCard('你需要缴纳税款167.40元,缴纳社保及公积金1776元,税后工资是6056.60元');
return {
card: card,
outputSpeech: '<speak>你需要缴纳税款<say-as type="number">167.40</say-as>元,缴纳社保及公积金<say-as type="number">1776</say-as>元,税后工资是<say-as type="number">6056.60</say-as>元</speak>'
};
}
});
}
}
exports.handler = function(event, context, callback) {
try {
let b = new DuerOSBot(event);
// 0: debug 1: online
b.botMonitor.setEnvironmentInfo(privateKey, 0);
b.run().then(function(result) {
callback(null, result);
}).catch(callback);
} catch (e) {
callback(e);
}
}
4.模拟测试
5真机测试
注意:数字的语音输入如果是0,需要读“零”,例如:6000,应该读:“六零零零”,“退出”指令发出后,无语音回复