0

我有一个单场景动作,它在调用时调用我的 webhook ' randomSpeech '(如下所述),它播放 MP3。我添加了一个“跳过”意图以跳到下一个 MP3。当我说“跳过”时,Action 应该转换(循环)回到 webhook ' randomSpeech ',并且由于有一个计数器x,Action 应该开始播放switch语句中的第二个 MP3。

但是,我必须说两次“跳过”这个词才能使它起作用。

  1. 我第一次说“跳过”,系统意图,MEDIA_STATUS_FINISHED 自动调用' mediaStatus '处理程序和文本'媒体已完成'。被添加到对话中。即使我已经配置了“跳过”意图来调用处理程序'randomSpeech',它似乎并没有发生,因为对话中没有添加新媒体。这几乎就像' randomSpeech ',完全被忽略了!
  2. 我第二次说“跳过”,第二个 MP3 终于开始播放了。

我的主要问题是,我怎样才能做到让用户只需要说“跳过”一次?


let x = 1;

app.handle('randomSpeech', (conv) => {

  switch(x) {
    case(1):
      conv.add(new Media({
      mediaObjects: [
        {
          name: 'NEVER GIVE UP',
          description: 'some athlete',
          url: 'http://zetapad.com/speeches/nevergiveup.mp3',
          image: {
            large: {
              url: 'https://www.keepinspiring.me/wp-content/uploads/2020/02/motivation-gets-you-started-jim-ryun-quote-min.jpg'
            }
          }
        }
      ],
      mediaType: 'AUDIO',
      optionalMediaControls: ['PAUSED', 'STOPPED'],
      startOffset: '5s'   
      }));
    x++;
    break;

    case(2):
      conv.add(new Media({
        mediaObjects: [
          {
            name: 'SPEECHLESS',
            description: 'Denzel Washington (feat Will Smith)',
            url: 'http://zetapad.com/speeches/denzel.mp3',
            image: {
              large: {
              url: 'https://www.keepinspiring.me/wp-content/uploads/2020/02/motivational-quotes-2-min.jpg'
              }
            }
          }
        ],
        mediaType: 'AUDIO',
        optionalMediaControls: ['PAUSED', 'STOPPED']
      }));   
    break;
  }
});


app.handle('media_status', (conv) => {
  const mediaStatus = conv.intent.params.MEDIA_STATUS.resolved;
  switch(mediaStatus) {
    case 'FINISHED':
      conv.add('Media has finished.');
      break;
    case 'FAILED':
      conv.add('Media has failed.');
      break;
    case 'PAUSED' || 'STOPPED':
      if (conv.request.context) {
        // Persist the media progress value
        const progress = conv.request.context.media.progress;
      }
      conv.add(new Media({
        mediaType: 'MEDIA_STATUS_ACK'
        }));
      break;
    default:
      conv.add('Unknown media status received.');
  }
});


来自唯一场景“动机”的图像:

场景

进入时

意图处理


进一步说明:

  • MEDIA_STATUS_PAUSED / MEDIA_STATUS_FINISHED / MEDIA_STATUS_STOPPED都只调用' media_status '微博
4

1 回答 1

0

您问题的核心问题是“跳过”是一个内置的媒体播放器命令(尽管没有明确记录),所以当用户说“跳过”时,播放器会将其视为正在完成的音频,所以它发送MEDIA_STATUS_FINISHEDIntent,就像用户一直在听它一样。

好消息是 - 您实际上希望以相同的方式处理这两种情况!因此,如果用户跳到下一个音频,或者完成第一个音频并且它应该前进到下一个音频 - 您想要播放下一个音频。

在您的代码中,“播放下一个音频”都是作为 switch 语句的一部分完成的。因此,您可能应该将其单独放入常规 JavaScript 函数中。然后,您可以从您设置的不同处理程序中调用该函数。

它可能看起来像这样(没有一些代码细节):


function nextAudio( conv ){
  // Code goes here to figure out the next audio to play and send it back
}

app.handle('randomSpeech', (conv) => {
  nextAudio( conv );
}

app.handle('media_status', (conv) => {
  const mediaStatus = conv.intent.params.MEDIA_STATUS.resolved;
  switch(mediaStatus) {
    case 'FINISHED':
      nextAudio( conv );
      break;
    // Other media status cases can go here
  }
});
于 2021-03-10T13:02:32.323 回答