我正在尝试在Pepper机器人平板电脑上创建一个输入字段,该字段允许用户通过语音输入电子邮件地址。我使用语音识别框获取用户所说的字母并引发一个事件,以便Javascript可以捕获它并修改文本。但是似乎“ document.getElementById(” abc“)。value”只能获取默认值,而不能获取当前屏幕上的内容。
示例: 我说“ 1”,它显示“ hello1”(非常好)。 然后我说“ 2”,它显示“ hello2”(可能是“ hello12”)
这是我的JS代码:
var session = new QiSession(function(session) {
// "Connection esterblished!";
}, function() {
// "Could not connect to the robot";
});
// Subscribe to ALMemory Service
session.service("ALMemory").then(function(ALMemory) {
// "ALMemory proxy subscription successful!";
ALMemory.getData('voice_input').then(function(voice_input){
document.getElementById("abc").value += voice_input;
});
});
HTML代码:
<input type="text" name="email" id="abc" value="hello">
“会话”有什么关系吗?因为即使我使用全局变量来存储语音输入,我也只能修改此变量的值,而不能在函数内部获取此变量的当前值(我可以得到的是初始化值)。
答案 0 :(得分:0)
不幸的是,我无法在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循环。
答案 1 :(得分:0)
document.getElementById()没有任何问题。 问题是您必须反应进行语音输入,而不仅要获取当前的语音输入。这是由subscribing to the ALMemory event完成的。 这是本教程的片段,大致适合您的情况(但未经测试):
session.service("ALMemory").then(function (ALMemory) {
ALMemory.subscriber("voice_input").then(function (subscriber) {
subscriber.signal.connect(function (state) {
document.getElementById("abc").value += voice_input;
});
});
});
请注意,要正常工作,必须使用ALMemory.raiseEvent在"voice_input"
键上发布事件。