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

Is it possible for Alexa to wait in a skill without directly awaiting user input?

我意识到这个问题可能措辞不当,但这是我能想到的最好的办法了。

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

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

this.emit(':responseReady');

然而,这并不是我想要的,因为大多数时候我不想立即下达另一个命令。相反,几分钟后,我会想再次与该技能互动。

不过,如果我完全退出该技能,下次我将不得不重新调用它,并再次收到整个技能的欢迎消息("Welcome to skill name. You can say...")。我也不认为这是最佳的。

有没有办法保留该技能 "open/active" 以便在该技能的上下文中解释我给出的下一个命令,而不必发出 :responseReady (期望立即响应)并且没有重新启动技能 ("Alexa, open skill name")?

您可以通过在您的技能中启用流式音频来以一种 hacky 的方式做到这一点。从本质上讲,你会给出你的回应,然后加入一个无声(或非无声)音轨以保持你的技能开放。

用户需要发出唤醒词才能打断音频,您需要在音频结束前说出接下来的话,否则需要重新开启技能。

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

现在不支持让你的技能无限打开,我认为将来也不会支持它,因为允许技能一直监听用户会涉及安全问题。

但是,如果您的问题是 "user getting the whole welcome message again on coming back to the skill",您可以通过在数据库中维护用户最后执行的操作来构建更好的体验。您可以使用作为请求的一部分发送的用户 ID 来识别每个用户。因此,下次用户返回技能时,您可以使用数据库来识别上下文并提供适当的响应。当然,要完成这项工作,您需要为用户执行的每个操作更新数据库。

在 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
            }
        });
    }

我找到了等待用户响应的最简单方法。在您的回复中,您可以添加一些无声音频。用户可以随时通过说 "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