Alexa是否有可能在没有直接等待用户输入的情况下等待技能?

时间:2017-10-30 15:50:00

标签: node.js alexa alexa-skills-kit

我意识到问题的措辞可能很糟糕,但这是我能想到的最好的。

我的问题是我在一个偶尔给出Alexa技能命令的场景中使用Alexa(比如说每隔几分钟),而且我不想每次都重新调用该技能。

目前,在我发出命令后,Alexa回复说她正在执行该操作,但最后她希望通过以下方式输入新用户:

this.emit(':responseReady');

然而,这并不是我想要的,因为大部分时间我都不想立即给出另一个命令。相反,几分钟后,我将再次想要与该技能互动。

如果我完全退出技能,下次我将不得不重新调用它,并再次获得整个技能欢迎信息("欢迎使用技能名称。你可以说...")。我也不认为这是最佳的。

有没有办法保持这种技能&#34;开放/活跃&#34;所以我给出的下一个命令在该技能的上下文中解释,而不必发出:responseReady(需要立即响应)并且不必重新启动技能(&#34; Alexa,打开技能名称< / EM>&#34;?)

3 个答案:

答案 0 :(得分:4)

我想出了等待用户响应的最简单方法。在您的回复中,您可以添加一些无声音频。用户可以通过说“Alexa,[intent]”来中断此操作,这将触发您应用的特定意图。

您需要知道音频应少于90秒。我用了80秒的mp3。在一个回复中对多个音频进行分组无济于事。你能做的最好就是发出两个回复,这将给你160秒的等待时间。

以下是我在我的技能中使用的示例代码:

    // Get silence to wait for a user input.
    var silence = '<audio src="' + PATHS.SILENCE_80_SEC + '" />';
    var reply = 'Please go to <emphasis level="moderate">www.plumhead.xyz/pair</emphasis> and tell me your unique pairing code. Again, go to <emphasis level="moderate">www.plumhead.xyz/pair</emphasis> to get a pairing code. When you are ready say: "Alexa, and your pairing code".' + silence;
    alexa.emit(':ask', reply, reply);

要为Alexa生成静音mp3,您可以使用ffmpeg。下一个命令生成80秒mp3,然后将其转换为Alexa可以接受的格式:

ffmpeg -f lavfi -i anullsrc=r=44100:cl=mono -t 80 -q:a 9 -acodec libmp3lame out.mp3
ffmpeg -y -i out.mp3 -ar 16000 -ab 48k -codec:a libmp3lame -ac 1  silence-80-sec.mp3

答案 1 :(得分:2)

您可以通过在您的技能中启用流媒体音频,以一种黑客的方式执行此操作。从本质上讲,你会给出你的回应,然后在静音(或非静音)音频轨道上进行操作,以保持你的技能开放。

用户需要提供唤醒字以中断音频,您需要在音频耗尽前说下一件事,否则您需要再次打开该技能。

启用音频会带来一些警告,特别是您需要处理所有相关的内置意图。看到  https://developer.amazon.com/blogs/post/Tx1DSINBM8LUNHY/New-Alexa-Skills-Kit-ASK-Feature-Audio-Streaming-in-Alexa-Skills

答案 2 :(得分:2)

现在不支持让您的技能无限开放,我认为将来不会支持它,因为允许技能始终倾听用户的安全问题。

但是,如果您的问题是“用户在返回技能时再次获得整个欢迎消息”,则可以通过维护用户在数据库中的最后执行操作来构建更好的体验。您可以使用作为请求的一部分发送的用户标识来标识每个用户。因此,下次用户返回技能时,您可以使用数据库来识别上下文并提供适当的响应。当然,为了完成这项工作,您需要为用户执行的每个操作更新数据库。

在nodejs中,您将获得this.event.session.user.userId中的用户ID值。

以下是展示欢迎消息逻辑的示例代码段

"LaunchRequest": function () {
        var userId = this.event.session.user.userId;
        dbHelper.getUser(userId, function (response) {
            if (response && response.lastPerformedAction) {
                //respond based on context
            }
            else {
                //respond with usual welcome message
            }
        });
    }