2 回答
TA贡献1829条经验 获得超9个赞
document.getElementById()没有任何问题。问题是你必须对语音输入做出反应,而不仅仅是获取当前的语音输入。这是通过订阅 ALMemory 事件来完成的。以下是大致适用于您的情况的教程片段(但未经测试):
session.service("ALMemory").then(function (ALMemory) {
ALMemory.subscriber("voice_input").then(function (subscriber) {
subscriber.signal.connect(function (state) {
document.getElementById("abc").value += voice_input;
});
});
});
请注意,要工作,您必须"voice_input"使用ALMemory.raiseEvent在键上发布事件。
TA贡献2065条经验 获得超14个赞
不幸的是,我无法找到有关 JavaScript API 的适当公共文档。然而,这是我能找到的。
看来您正在使用承诺作为事件侦听器。Promise 触发一次,而事件侦听器重复触发。您正在使用他们所说的调用(承诺)而不是信号(事件)。如果您有关于信号的文档,我会改用它们,因为它们更类似于您要执行的操作。否则,您可以执行以下操作:
var session = new QiSession(function(session) {
// "Connection esterblished!";
// Subscribe to ALMemory Service
session.service("ALMemory").then(function(ALMemory) {
// "ALMemory proxy subscription successful!";
function getVoice() {
ALMemory.getData('voice_input').then(function(voice_input){
document.getElementById("abc").value += voice_input;
getVoice();
});
}
getVoice();
});
}, function() {
// "Could not connect to the robot";
});
首先,我将服务订阅者移动到 QiSession 成功连接的回调中,因为这通常是在异步函数调用中定义会话的地方。当 ALMemory 被订阅时,它定义并调用 getVoice,它检索用户的语音,附加到该字段,然后再次运行 getVoice 以将另一个收听排队。您可能希望添加一个条件以最终停止它。如果 Pepper 支持这一点,也可能值得研究 async/await,因为这样您就可以使用 while 循环轻松地做到这一点。
添加回答
举报