【新技能】民谣歌曲 有好听的歌曲可以推荐给我哦


(咪酱酱) #1

【技能名称】

民谣歌曲

【技能描述】

为大家推荐了几首好听的民谣歌曲,对我说,“若琪,打开民谣歌曲”就可以立即开始民谣之旅。

【示例语句】

“若琪,打开民谣歌曲”

“若琪,下一首”

“若琪,上一首”

“若琪,暂停”

“若琪,继续”


Rokid All in One | 做技能送智能语音
技能开发本周常见问题 18-03-19
技能版块的常见问题
(咪酱酱) #2

插楼广告一下自己的第一个技能


(咪酱酱) #3

越听越聪明技能开发流程分享

1、登陆Rokid开放平台

登陆 Rokid 开放平台:登陆平台

点击“开始创建”的按钮。


(咪酱酱) #4

2、填写技能信息

入口词:写用来唤起这个技能的关键词,需要和技能名称一致!

技能名称:技能的名称会在技能商店中向终端用户展示,名字要简单易读哦!

场景化展示:选择非场景化。


(咪酱酱) #5

3、语音交互

用JSON格式定义“民谣歌曲”的意图,模板如下:

{
	"intents": [
		{
			"intent": "pause",
			"slots": [],
			"user_says": [
				"暂停播放",
				"暂停",
				"暂停一下"
			]
		},
		{
			"intent": "resume",
			"slots": [],
			"user_says": [
				"继续",
				"继续播放"
			]
		},
		{
			"intent": "pre",
			"slots": [],
			"user_says": [
				"上一首",
				"上一曲",
				"上一个"
			]
		},
		{
			"intent": "play",
			"slots": [],
			"user_says": [
				"切歌",
				"下一曲",
				"下一首",
				"下一个",
				"开始播放"
			]
		}
	]
}

别忘了加上自定义词表哦!!!

加了之后别忘了点击开始编译,编译完成 NLP 才生效哦!


(咪酱酱) #6

4、配置

需选择后端服务方式,选择是否需要用户授权(建议选否,这样可以拥有更多用户哦)。

exports.handler = function (event, context, callback) {
    var rokid = Rokid.handler(event, context, callback);
    rokid.registerHandlers(handlers);
    rokid.execute();
};

/**=======================用户须编辑区域====================================

//播放模式,0:顺序播放,1:随机播放。
var play_mode = 0;
//播放音频的索引。
var play_count = 0;
//tts欢迎词
var WELCOME_TTS = '谢谢您进入民谣歌曲,为你准备了一些音乐!';
//播放列表,顺序播放会按照列表顺序播放。
var play_list = [
    'http://****我是马赛克***.mp3',
    'http://****我是马赛克***.mp3'
];

/**=======================用户不需要编辑区===============================================================*/

const dbGet = Rokid.promisify(Rokid.dbServer.get);
const dbSet = Rokid.promisify(Rokid.dbServer.set);

var userId = Rokid.param.context.user.userId || 'test_user_id';
var handlers = {
    'ROKID.INTENT.WELCOME': function () {
        try {
            this.setTts({ tts: WELCOME_TTS, itemId: 'welcome' });
            this.emit(':done');
        } catch (e) {
            this.emit(':error', e);
        }
    },
    /**
     * 开始播放,切换下一首
     */
    'play': function () {
        //查询播放模式
        dbGet(userId + '_mode').then(mode => {
            console.log('mode:' + mode);
            if (mode !== '未查询到相关数据') {
                //查询到有播放模式
                play_mode = mode;
            }
            return mode;
        }).then(mode => {
            dbGet(userId + '_count').then(count => {
                console.log('count:' + count);
                let media_url = '';
                if (count !== '未查询到相关数据') {
                    //查询到有播放记录
                    play_count = count;
                    if (play_count > play_list.length - 1) {
                        play_count = 0;
                    }
                }
                media_url = play_list[play_count];
                if (mode == 1) {
                    //随机播放
                    play_count = Math.floor(Math.random() * play_list.length);
                    media_url = play_list[play_count];
                }
                return media_url;
            }).then(media_url => {
                console.log('media:' + media_url);
                dbSet(userId + '_count', play_count + 1).then(res => {
                    //异步存储不管失败与否
                });
                this.setMedia({ type: 'AUDIO', url: media_url });
                this.emit(':done');
            }).catch(e => {
                this.emit(':error', e);
            })
        }).catch(e => {
            this.emit(':error', e);
        })
    },
    /**
     * 上一首
     */
    'pre': function () {
        dbGet(userId + '_count').then(count => {
            console.log('count:' + count);
            let media_url = '';
            if (count !== '未查询到相关数据') {
                //查询到有播放记录
                play_count = count - 2;
                if (play_count > play_list.length - 1) {
                    play_count = 0;
                } else if (play_count < 0) {
                    play_count = play_list.length - 1;
                }
            }
            media_url = play_list[play_count];
            return media_url;
        }).then(media_url => {
            console.log('media:' + media_url);
            dbSet(userId + '_count', play_count + 1).then(res => {
                //异步存储不管失败与否
            });
            this.setMedia({ type: 'AUDIO', url: media_url });
            this.emit(':done');
        }).catch(e => {
            this.emit(':error', e);
        })
    },
    /**
     * 暂停播放
     */
    'pause': function() {
        this.setMedia({action: 'PAUSE', url: 'xxx'});
        this.emit(':done');
    },
    /**
     * 继续播放
     */
    'resume': function() {
        this.setMedia({action: 'RESUME', url: 'xxx'});
        this.emit(':done');
    },
    /**
     * 循环播放
     */
    'Media.FINISHED': function () {
        this.emit('play');
    },
    /**
     * 为第一个tts接上media
     */
    'Voice.FINISHED': function () {
        if (Rokid.param.request.content.extra.voice.itemId === 'welcome') {
            this.emit('play');
        } else {
            this.emit(':done');
        }
    },
    'ROKID.INTENT.EXIT': function () {
        try {
            console.log('技能退出成功');
            this.emit(':done');
        } catch (e) {
            this.emit(':error', e);
        }
    }
};

(咪酱酱) #7

5、测试设备

选择测试设备,通过输入设备TypeID(device_type_id)、设备ID(device_id)添加测试设备或关联您手机账号下绑定的若琪设备(推荐!!),之后就可以在这些设备上测试这个技能。


(咪酱酱) #8

6、发布

选择技能商店分类,填写技能摘要、示例语句等,接着点击同意隐私合规条款后,就可以正式提交审核啦。


(咪酱酱) #9

40

上线成功,撒花🎉


(大发) #10

撒花🎉 扩散~~


(sudogod) #11

请问,你那个slots 语义定义中是空,为什么还要定义词表,词表的具体作用是什么,刚刚开始做这个一头雾水。请不吝教,还有那个配置我想用 后天java的方式但是是必须要用https吗,你这个我只会用jqeury但发现看的一头雾水,是Node.js?