谷歌语音识别说'crimson'误触发'on'的Python智能灯语音控制问题问询
问题根因
你当前使用in做子串匹配,只要查询文本中包含对应字符序列就会触发逻辑,不会区分是否为独立的指令单词,因此crimson末尾的on字符序列会被误判为开灯指令。
可行解决方案
方法1:拆分独立单词匹配(最推荐)
先把用户查询拆分为独立的单词列表,再判断指令是否作为独立单词存在,从根源避免子串误匹配:
import re elif ('light' in query) or ('lights' in query): # 家庭自动化 # 预处理:提取查询中所有独立单词,统一转小写,自动过滤标点 words = re.findall(r'\b\w+\b', query.lower()) if 'on' in words: control_lights("light on") speak("okay, turning on light") if 'off' in words: control_lights("light off") speak("okay, turning off light") if 'crimson' in words: control_lights("light crimson") speak("okay, turning light to crimson")
方法2:正则单词边界匹配
如果不想改动太多原有逻辑,可以用正则的\b单词边界符做匹配,只有当on作为独立单词出现时才触发:
import re elif ('light' in query) or ('lights' in query): # 家庭自动化 if re.search(r'\bon\b', query, re.IGNORECASE): control_lights("light on") speak("okay, turning on light") if re.search(r'\boff\b', query, re.IGNORECASE): control_lights("light off") speak("okay, turning off light") if 'crimson' in query: control_lights("light crimson") speak("okay, turning light to crimson")
方法3:调整判断优先级(临时兼容方案)
如果暂时不想引入正则,可以把更长的、可能包含短指令的判断放在最前面,匹配后直接跳过后续通用指令判断:
elif ('light' in query) or ('lights' in query): # 家庭自动化 has_color_command = False if 'crimson' in query: control_lights("light crimson") speak("okay, turning light to crimson") has_color_command = True # 只有没匹配到颜色指令时,才判断开关指令 if not has_color_command: if 'on' in query: control_lights("light on") speak("okay, turning on light") if 'off' in query: control_lights("light off") speak("okay, turning off light")
内容的提问来源于stack exchange,提问作者Snipey
相关产品推荐
相关产品推荐

