我的Google Assistant动作出现问题,并在Google Assistant移动应用程序中使用它。
我正在尝试使用媒体响应和回调播放1-3分钟mp3的曲目列表,并且在模拟器和Google Home Mini上都能正常运行,但在手机上的Google Assistant应用上却无法正常运行。
我注意到发生的事情是在iPhone上测试时没有发送MediaResponse回调。第一个MediaResponse将播放,但随后该应用程序保持静音。但是,它并没有退出我的动作,而是使麦克风保持打开状态,当我尝试再次与之交谈时,无论我说的是什么,都会发送给我的动作。这部分与Starfish Mint's problem非常相似,尽管我的部分似乎可以在我的Google Home设备上运行。他们说是通过
修复的”等待6个月后,我们设法自行解决。 MEDIA_FINISHED,我们必须在您的媒体回复中返回音频文本 获取后续的MEDIA_FINISHED事件。我们用播放列表对此进行了测试 100个媒体文件中,它的魅力十足。”
尽管我不确定是什么意思。
这可能是我的问题的明显答案,但是它的位置是:Media responses are supported on Android phones and on Google Home,这是否意味着iPhone不支持它们,这就是问题所在吗?是否有任何变通办法,例如使用Podcast操作或其他方法?
我尝试了另一个音频播放应用,Music Player Sample应用,它是Google的Dialogflow示例应用之一,尽管在其他地方也不能在我的手机上使用。也许这只是iPhone的东西?
但是,令我感到困惑的是,当我查看手机上的操作功能时:conv.surface.capabilities.has("actions.capability.MEDIA_RESPONSE_AUDIO")
在其功能中包含actions.capability.MEDIA_RESPONSE_AUDIO。如果没有它,我会更倾向于认为它不包括iPhone,但似乎很奇怪它会具备功能,但无法正常工作。
这是我播放第一首曲目的代码:
app.intent('TreatmentResponse', (conv, context, params) => {
var treatmentTracks = [{url: 'url', name: 'name'},{url: 'url', name: 'name'}];
var result = playNext(treatmentTracks[0].url, treatmentTracks[0].name);
var response = result[0];
conv.data.currentTreatment = 'treatment';
conv.data.currentTreatmentName = 'treatmentName';
conv.data.treatmentPos = 1;
conv.data.treatmentTracks = treatmentTracks;
conv.ask("Excellent, I'll play some tracks in that category.");
conv.ask(response);
conv.ask(new Suggestions(['skip']));
});
这是我的回调函数:
app.intent('Media Status', (conv) => {
const mediaStatus = conv.arguments.get('MEDIA_STATUS');
var { treatmentPos, treatmentTracks, currentTreatment, currentTreatmentName } = conv.data;
if (mediaStatus && mediaStatus.status === 'FINISHED' && treatmentPos < treatmentTracks.length) {
playNextTrack(conv, treatmentPos, treatmentTracks);
} else {
endConversation(conv, currentTreatment);
}
});
这里是playNextTrack()
function playNextTrack(conv, pos, medias) {
conv.data.treatmentPos = pos+1;
var result = playNext(medias[pos].url, medias[pos].name);
var response = result[0];
var ssml = result[1];
conv.ask(ssml);
conv.ask(response);
conv.ask(new Suggestions(['skip']));
}
和playNext()
function playNext(url, name) {
const response = new MediaObject({
name: name,
url: url,
});
var ssml = new SimpleResponse({
text: 'Up next:',
speech: '<speak><break time="1" /></speak>'
});
return [response, ssml];
}
另一个问题是,如果我打断MediaResponse以说出“ Next”或“ Skip”,而不是像在模拟器和Google Home Mini中那样使用“ NextOrSkip”意图,则MediaResponse在我的iPhone上播放时,它只是说“确定”或“没问题” [我的代码中没有任何地方],然后保持沉默(并收听)。