【技能开发分享】大自然的声音


(shuangwei.ma) #1

#大自然的声音
###技能玩法
打开语音设备,然后设备说“若琪,我想听流水的声音”,此时语音设备便会放出流水的声音,如果你不想听了,你可以说“若其,我不想听了”,此时
若其会关闭正在播放的自然之音。你也可以喊“若琪,随机播放”,语音设备会随机播放出自然之音。

当然我还会不断丰富自然之音的内容,也欢迎大家在回帖中说出你想要听到的声音(最好能提供url啦),我预感这大自然的声音将会是Rokid爆款技能。

###流程图

###如何设计语音交互:
首先定义意图,意图包含:

  • 播放
  • 随机播放
  • 停止播放
  • 暂停

其次定义声音slot

  • 定义一个自然之音slot,比如流水、雷电、下雨、鸟叫等
    最后定义pattern
  • 播放pattern包含,我想听XXX声音,来一首XXX声音,我要听XXXX声音等
  • 停止pattern包含:我不想听了、停止、停掉等
  • 随机播放pattern包含:随机播放
  • 暂停播放pattern:暂停播放,暂停一会,休息一下等

语音交互意图定义:

			{
"intents": [
	{
	"intent": "BrocasTvoice",
	"slots": [
	{
	"name": "sounds",
	"type": "soundslist"
	}
	],
	"user_says": [
	"我要听$sounds的声音",
	"放一下$sounds的声音",
	"来一个$sounds的声音",
	"我想听$sounds的声音",
	"打开$sounds的声音"
	]
	},
	{
	"intent": "RandomBrocast",
	"slots": [],
	"user_says": [
	"换个声音",
	"换一首",
	"随机播放",
	"换个",
	"换一个",
	"来个其它的"
	]
	},
	{
	"intent": "StopBrocast",
	"slots": [],
	"user_says": [
	"我想安静",
	"结束",
	"停掉",
	"我不想听了",
	"关掉",
	"你可以休息了",
	"退出",
	"停止播放",
	"没事了",
	"关闭",
	"你去死吧",
	"停止",
	"闭嘴",
	"关了"
	]
	}
	]
	}

###js-engine设计:
1)var handlers = {} 方法中添加四个意图的函数,记得函数名字一定要意图的名字完全一样

2)播放和随机播放函数中itemType一定要为AUDIO,url一定要为声音的url地址 ,完整js-engine代码如下:

	exports.handler = function(event, context, callback) {
	var rokid = Rokid.handler(event, context,callback);
	rokid.registerHandlers(handlers);
	rokid.execute();
	};		
var WELCOME_TTS = '欢迎来到自然之音的世界,说出你想听的自然之音。你可以选择听打雷、狼叫、树木燃烧、流水、滴答、门铃、百灵鸟的声音';
var voiceArray = [
{name:'打雷', url:'http://fjdx.sc.chinaz.com/Files/DownLoad/sound1/201611/7981.wav'},
{name:'狼叫', url:'http://fjdx.sc.chinaz.com/Files/DownLoad/sound1/201602/6931.wav'},
{name:'树木燃烧', url:'http://fjdx.sc.chinaz.com/files/download/sound1/201202/935.wav'},
{name:'流水', url:'http://fjdx.sc.chinaz.com/files/download/sound1/201209/1993.wav'},
{name:'滴答', url:'http://fjdx.sc.chinaz.com/Files/DownLoad/sound1/201501/5373.wav'},
{name:'铃铛', url:'http://fjdx.sc.chinaz.com/Files/DownLoad/sound1/201607/7524.mp3'},
{name:'门铃', url:'http://fjdx.sc.chinaz.com/Files/DownLoad/sound1/201509/6307.wav'},
{name:'百灵鸟', url:'http://fjdx.sc.chinaz.com/files/download/sound1/201402/4142.wav'}
];


var handlers = {
'ROKID.INTENT.WELCOME':function() {
this.emit(':tts',{tts: WELCOME_TTS});
this.callback(null);
},
'BrocasTvoice':function() {
	var voice = Rokid.param.request.content.slots.sounds;
var errorMessage = '我这里暂时还没有你想听的声音,你可以试试其他声音,比如流水的声音';
var flag = false;
for(var i = 0; i < voiceArray.length;i++){
if(voiceArray[i].name == voice){
flag = true
this.emit(':media', { itemType: 'AUDIO', url:voiceArray[i].url });
this.callback(null)
break;
} 
}
if(!flag){
this.emit(':tts',{tts: errorMessage});
}
this.callback(null)
},
'RandomBrocast':function() {
var index = Math.floor(Math.random() * voiceArray.length);
this.emit(':media', { itemType: 'AUDIO', url:voiceArray[index].url });
this.callback(null)
},
'StopBrocast':function() {
this.emit(':tts',{tts:'',action:'PAUSE'});
this.callback(null)
},
};

###开发技能遇到的问题:

  • 首次编写的时候要注意,意图名字一定要和handler方法对应起来
  • 没有demo可以参考时编写比较困难,不过现在开发者讨论区的分享内容逐渐丰富起来了
  • this.emit(’:tts’,{tts:’’,action:‘PAUSE’}); tts字段有文字时不生效,后来得知这个本来就没意义

Rokid开发者大赛第一季
开发者社区Pebble(月石)开发测试固件发布
(chao.xuc) #2

:thumbsup::thumbsup:


(478914121) #3

谢谢分享奥,很好的想法