Android语音象棋开发:语音识别白名单过滤方案咨询
针对Android语音控制象棋应用的白名单过滤方案
嘿,这个问题我之前做语音控制类应用时也碰到过!针对你的象棋语音指令场景,这里有几个实用的方案可以帮你过滤非预期词汇,实现类似白名单的效果:
1. 利用语音识别引擎的语法约束(最推荐)
Android的SpeechRecognizer支持通过**JSGF(Java Speech Grammar Format)**来定义识别的语法规则,相当于给识别引擎设置“只能识别这些内容”,从源头减少误识别。
举个例子,你可以创建一个象棋指令的语法文件(比如chess_grammar.jsgf):
#JSGF V1.0; grammar chessCommands; public <command> = <piece> "to" <position>; <piece> = "King" | "Queen" | "Rook" | "Bishop" | "Knight" | "Pawn"; <position> = <file> <rank>; <file> = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H"; <rank> = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8";
然后在代码里加载这个语法并设置给SpeechRecognizer:
// 加载语法文件 InputStream is = getAssets().open("chess_grammar.jsgf"); String grammar = new String(is.readAllBytes(), StandardCharsets.UTF_8); is.close(); // 创建识别意图 Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 1000); // 设置语法约束 intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 500); intent.putExtra(RecognizerIntent.EXTRA_GRAMMAR, grammar); // 启动识别 SpeechRecognizer recognizer = SpeechRecognizer.createSpeechRecognizer(this); recognizer.setRecognitionListener(yourRecognitionListener); recognizer.startListening(intent);
这种方式能让识别引擎优先匹配你定义的词汇,从根源降低误识别概率。
2. 识别结果后做文本过滤与校正
如果无法使用语法约束(比如某些第三方识别引擎不支持),可以在拿到识别结果后,手动和预设的白名单词汇做匹配校正:
- 第一步:预设白名单集合
Set<String> validPieces = new HashSet<>(Arrays.asList("King", "Queen", "Rook", "Bishop", "Knight", "Pawn")); Set<String> validFiles = new HashSet<>(Arrays.asList("A", "B", "C", "D", "E", "F", "G", "H")); Set<String> validRanks = new HashSet<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8")); - 第二步:拆分识别结果为token,替换相似误识别
比如针对你遇到的"Pink"→"King"、"See"→"C"这种情况,可以做一个常见误映射表:Map<String, String> correctionMap = new HashMap<>(); correctionMap.put("Pink", "King"); correctionMap.put("See", "C"); correctionMap.put("Too", "to"); // 可以根据测试补充更多误识别映射 - 第三步:用字符串相似度算法(比如Levenshtein距离)匹配最接近的白名单词汇,比如如果识别出"KIng",自动校正为"King"。
3. 自定义语音模型/短语集
如果使用云语音识别服务(比如Google Cloud Speech-to-Text),可以创建自定义短语集,把所有象棋相关的指令、词汇都添加进去,让识别引擎优先学习这些内容,提升准确率。
如果是本地识别,也可以用开源库比如Vosk,导入自定义的词汇表(.txt格式),让模型更专注于你的场景词汇。
额外小贴士
- 尽量让用户的指令格式固定(比如统一用“棋子名 + to + 位置”),这样后续过滤和校正逻辑更简单;
- 多收集测试中的误识别案例,针对性补充校正映射表或语法规则;
- 优先使用语法约束,比事后校正更高效,也能减少不必要的识别结果处理。
内容的提问来源于stack exchange,提问作者ZaOndra
相关产品推荐
相关产品推荐

