You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:27:37