Pepper机器人setVocabulary报错:modifiable_grammar已存在
解决Pepper机器人ASR动态设置词汇时的"modifiable_grammar already exists"错误
这个问题的核心是:每次调用setVocabulary时,系统会自动创建名为modifiable_grammar的语法规则,但如果之前的语法实例未被正确清理,再次调用就会触发重复创建的冲突,尤其是动态更新词汇时,旧语法没有被移除。
直接解决方案:先移除旧语法,再设置新词汇
每次更新词汇前,主动尝试移除已存在的modifiable_grammar,即使它不存在也没关系(捕获异常即可),然后再调用setVocabulary。示例代码:
# 假设asr是已初始化的ALSpeechRecognition实例 try: # 尝试移除已存在的语法 asr.removeGrammar("modifiable_grammar") except RuntimeError: # 语法不存在时忽略异常 pass # 设置新的识别词汇,第二个参数为False表示词汇是普通文本(非正则) asr.setVocabulary(["你好", "再见", "播放音乐"], False)
进阶优化:配合ASR状态控制避免并发问题
如果你的脚本包含异步逻辑,可能出现ASR在工作时被修改词汇的情况,建议先暂停识别,完成词汇更新后再恢复:
# 暂停语音识别 asr.pause(True) # 清理旧语法并设置新词汇 try: asr.removeGrammar("modifiable_grammar") except RuntimeError: pass asr.setVocabulary(["暂停播放", "调高音量", "下一首"], False) # 恢复语音识别 asr.pause(False)
额外注意事项
- 彻底放弃“跳过重复设置”的逻辑,动态修改词汇必须每次清理旧语法,否则冲突会持续出现。
- 检查脚本中是否存在重复初始化ASR实例或重复订阅识别事件的情况,这类操作也可能导致语法资源未释放。
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

