Google Actions MediaResponse回调不适用于iPhone Google Assistant应用,在模拟器和Google Home Mini上均可使用

时间:2019-01-25 03:05:57

标签: node.js callback dialogflow actions-on-google google-home

我的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上播放时,它只是说“确定”或“没问题” [我的代码中没有任何地方],然后保持沉默(并收听)。

0 个答案:

没有答案