我正在创建一个谷歌助理应用程序来告诉引号,我目前正在使用Api.ai与ApiAi NodeJs网络钩子。我希望我的反应应该是这样的:
Innovation is the only way to win.
By Steve Jobs
Want one more?
注意,这三行都是不同的行。我知道,如果我只使用api.ai的ux没有web钩子(使用多个简单的响应),这是可能的,但我不知道如何与web钩子相结合。
我试过:
assistant.ask("Innovation is the only way to win.");
assistant.ask("By Steve Jobs");
assistant.ask("Want one more?");
但它似乎只说了第一句话。我还试着用以下文字取代它:
assistant.tell("Innovation is the only way to win.");
assistant.tell("By Steve Jobs");
assistant.ask("Want one more?");
但它在第一条语句之后就退出了。该怎么做呢?
发布于 2017-08-05 18:58:17
ask()
和tell()
都接受它们的参数并返回一个响应。唯一的区别是ask()
使对话继续进行,期望用户回话,而tell()
则表示对话已经结束。如果从web服务器的角度来考虑这一点,ask()
和tell()
都会发回相当于一个页面的页面,然后关闭连接,但是ask()
在页面上包含了一个表单,而tell()
没有。
它们都可以接受一个RichResponse对象,该对象可能包括一个或两个字符串或SimpleResponse对象,这些对象将作为聊天气泡呈现。然而,你不能做三次,至少根据文档的说法是这样的。因此,听起来您最好的选择是包含一个带有引号和属性的SimpleResponse
,另一个包含提示另一个。
这听起来也像一种情况,您希望音频不同于显示的文本。在本例中,您希望构建SimpleResponse
,以便它同时具有speech
字段和displayText
字段。
这可能是这样的(我还没有测试代码):
var simpleResponse = {
speech: 'Steve Jobs said "Innovation is the only way to win."',
displayText: '"Innovation is the only way to win." -- Steve Jobs'
};
var richResponse = assistant.buildRichResponse();
richResponse.addSimpleResponse(simpleResponse);
richResponse.addSimpleResponse('Do you want another?');
assistant.ask( richResponse );
这也会让你做一些事情,比如在这两条信息的中间添加卡片,比如,包含相关人物的图片。要做到这一点,您可以使用一个richResponse.addBasicCard()
对象调用BasicCard
方法。这甚至可能比在第二行中包含引号属性更直观。
至于设计--请记住,您正在为各种各样的设备设计。当您有不同的显示模式(有时是不存在的)时,尝试关注行格式是有问题的设计。不要把注意力集中在对话会是什么样子,相反,你应该关注对话感觉有多像你的用户和另一个人之间的对话。记住,声音是这种对话的主要手段,用视觉来补充这种对话,而不是支配它。
发布于 2017-08-05 16:26:49
根据我从文档中可以收集到的信息,.tell
和.ask
都关闭了麦克风。尝试将所有语句放入一个字符串中。据我所知,.ask
实际上并不影响演讲的语气,它只是告诉助手等待输入。
assistant.ask("Innovation is the only way to win. By Steve Jobs. Want one more?");
https://stackoverflow.com/questions/45523479
复制相似问题