如何在Dialogflow中实现Google Home语音验证码验证?
实现Dialogflow语音验证码验证(适配Google Home)
嘿,我帮你一步步搞定这个语音验证码验证的需求,完全贴合你要的交互流程:Google Home提示输入验证码,你说出数字序列后返回验证结果。
1. 先搞定预设验证码的存储
首先得把你预设的验证码存起来,让Dialogflow能在会话里拿到它对比。最简单的方式是用上下文(Contexts)——毕竟验证码是会话内临时用的,不需要永久存储。
- 去Dialogflow的「上下文」页面,创建一个名为
verification_active的上下文,有效期设个5分钟足够用。 - 给这个上下文加个参数
expected_code,值就填你预设的验证码(比如1234)。
2. 创建启动验证的触发意图
接下来要做一个能触发验证流程的意图:
- 新建意图,命名成
StartVerification就行。触发短语可以设成你需要的(比如“开始验证”,如果是应用启动自动触发,也可以把这个逻辑加到默认欢迎意图里)。 - 在「响应」模块里输入:“请输入验证码以继续”——这就是Google Home会说的提示语。
- 最后在「输出上下文」里添加刚才创建的
verification_active,这样会话就进入验证状态了,Dialogflow也能记住预设的验证码。
3. 做一个捕获验证码输入的意图
现在需要处理用户说出的数字序列,得让Dialogflow能识别并捕获这些输入:
- 新建意图,命名为
VerifyCode。 - 在「训练短语」里加各种可能的输入示例,比如:
- "1 2 3 4"
- "一二三四"(如果是中文交互的话)
- "1234"
- "幺 二 三 四"(毕竟语音里常把1读成幺,得覆盖这种场景)
多加点示例能让Dialogflow的语音识别更准确。
- 把「输入上下文」设为
verification_active,这样只有在验证状态下,这个意图才会被触发,不会干扰其他交互。 - 添加一个参数
user_code,类型选@sys.any就行——这样能直接捕获用户说的整段内容,后面再处理掉空格。如果你想更精准,也可以用@sys.number并允许重复提取,把多个数字拼接成字符串。
4. 加验证逻辑(两种方案任选)
方案一:用Dialogflow内置编辑器(零外部服务器)
如果你的验证码是固定的,用内置编辑器最方便:
- 回到
VerifyCode意图,开启「Fulfillment」里的“启用Webhook调用用于意图”。 - 去「Fulfillment」页面,切换到「内联编辑器」,用Node.js写一段简单的逻辑:
function verifyCode(agent) { // 从上下文里取出预设的验证码 const expectedCode = agent.context.get('verification_active').parameters.expected_code; // 把用户输入的内容去掉空格,统一格式 let userCode = agent.parameters.user_code.replace(/\s+/g, ''); // 对比验证 if (userCode === expectedCode) { agent.add('验证通过'); // 验证通过就清除上下文,结束验证状态 agent.context.delete('verification_active'); } else { agent.add('验证失败,请重新输入'); // 失败的话保持上下文,让用户可以重试 } } // 把意图和处理函数绑定 let intentMap = new Map(); intentMap.set('VerifyCode', verifyCode); agent.handleRequest(intentMap); - 点「部署」按钮,等代码部署完成就生效了。
方案二:用自定义Webhook(适合动态验证码场景)
如果你需要动态生成验证码,或者有更复杂的逻辑(比如和后端数据库联动),可以自己搭个Webhook服务器:
- 服务器里写和上面类似的逻辑:接收Dialogflow的请求,从请求里拿到用户输入的验证码和上下文里的预设值,对比后返回对应的响应。
- 回到Dialogflow的「Fulfillment」页面,关掉内联编辑器,填上你的Webhook URL,保存就行。
5. 测试走一遍流程
- 先在Dialogflow的测试控制台里试:触发
StartVerification,会收到“请输入验证码以继续”的提示;然后输入“1 2 3 4”,如果预设验证码是1234,就会返回“验证通过”,输错了就返回“验证失败,请重新输入”。 - 再用Google Home设备测试,确保语音交互正常——毕竟语音识别可能有小误差,要是发现某些输入识别不准,就回到「训练短语」里补充对应的示例。
小提示
- 语音里常把1说成“幺”,把0说成“洞”,可以在代码里加个转换逻辑,比如把“幺”替换成“1”,“洞”替换成“0”,这样验证准确率会更高。
- 如果要限制重试次数,可以在
verification_active上下文里加个retry_count参数,每次验证失败就递增,达到次数后就返回“重试次数过多,请稍后再试”,并清除上下文。
内容的提问来源于stack exchange,提问作者Victor Attila Breelle
相关产品推荐
相关产品推荐

