如何使用双LiveSpeechRecognizer或切换LM/DIC?遇线路不可用异常
问题解决思路
- 根本原因是同一时间只能有一个音频输入线被占用,创建两个
LiveSpeechRecognizer实例会同时尝试抢占麦克风资源,直接触发LineUnavailableException。 - 正确的做法是复用单个识别器实例,动态切换词典与语言模型,具体步骤:
- 停止当前识别进程:
recognizer.stopRecognition(); - 更新配置中的词典和语言模型路径
- 重新加载识别器配置(若版本支持
reloadRecognizer方法) - 重启识别进程
- 停止当前识别进程:
修改后的代码示例
// 初始化首个配置并启动识别 Configuration configuration = new Configuration(); configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us"); configuration.setDictionaryPath("src/main/resources/words.dic"); configuration.setLanguageModelPath("src/main/resources/words.lm"); LiveSpeechRecognizer recognizer = new LiveSpeechRecognizer(configuration); recognizer.startRecognition(true); // 切换配置的操作流程 recognizer.stopRecognition(); // 更新词典与语言模型路径 configuration.setDictionaryPath("src/main/resources/words2.dic"); configuration.setLanguageModelPath("src/main/resources/words2.lm"); // 重新加载识别器配置 recognizer.reloadRecognizer(configuration); // 重启识别 recognizer.startRecognition(true);
额外注意事项
- 若使用的Sphinx4版本无
reloadRecognizer方法,需先确保调用stopRecognition()释放资源后,再销毁旧实例并创建新实例,避免资源泄漏。 - 音频输入设备属于独占性资源,永远不要同时运行多个
LiveSpeechRecognizer实例。
内容的提问来源于stack exchange,提问作者Arda
相关产品推荐
相关产品推荐

