Unity C#如何过滤Wit AI部分翻译仅获取最终识别结果
Unity C# 过滤wit.ai部分识别结果、仅获取最终结果的实现方法
wit.ai 新版本的流式响应里已经给最终结果加了明确标识:所有部分识别(partial)的返回块都不带is_final字段,只有整段语音识别完成后的最终结果块,才会携带"is_final": true属性,直接用这个字段做过滤即可,不需要自己对比文本内容判断。
具体实现步骤
- 定义和wit.ai返回结构匹配的C#序列化类,新增
is_final字段,其余字段和旧代码保持一致即可 - 每次从流式连接里收到一个完整的JSON响应块时,先做反序列化
- 判断反序列化后的对象里
is_final是否为true:如果不是,直接丢弃该块,不进入后续业务逻辑;如果是,就是需要的最终完整结果,直接传给原有旧代码的处理逻辑即可。
参考实现代码
using System; using UnityEngine; // 对应wit.ai返回的JSON结构,字段名要和JSON里的key完全一致 [Serializable] public class WitResponse { public string text; // 核心过滤标记 public bool is_final; // 下面这些字段和你旧代码里的定义保持一致即可 public SpeechInfo speech; public WitEntity[] entities; public WitIntent[] intents; public WitTrait[] traits; } // 以下类根据你原有项目的结构补全字段即可 [Serializable] public class SpeechInfo { public float confidence; public SpeechToken[] tokens; } [Serializable] public class SpeechToken { public int start; public int end; public string token; } [Serializable] public class WitEntity {} [Serializable] public class WitIntent {} [Serializable] public class WitTrait {}
处理响应块的核心逻辑:
// 每次收到wit.ai推送的独立JSON块时调用该方法 void OnReceiveWitChunk(string jsonChunk) { // 反序列化响应 WitResponse response = JsonUtility.FromJson<WitResponse>(jsonChunk); // 过滤非最终结果 if (!response.is_final) { return; } // 此处往下都是最终结果的处理逻辑,直接复用你原来的旧代码即可 HandleFinalRecognitionResult(response); } // 你原来处理完整识别结果的业务逻辑 void HandleFinalRecognitionResult(WitResponse finalResult) { Debug.Log($"最终识别文本:{finalResult.text}"); // 原有业务逻辑... }
注意事项
- 不需要缓存、拼接前面返回的partial结果,最终
is_final:true的块里已经包含了完整的识别文本、意图、实体等所有信息,和旧代码预期拿到的完整响应结构完全一致。 - 因为wit.ai是流式逐块返回数据,接收时要做缓冲区处理,每匹配到一对完整的大括号
{}闭合的JSON对象,再送入解析逻辑,避免半包导致的JSON解析失败。
内容的提问来源于stack exchange,提问作者Deepansh Chellani
相关产品推荐
相关产品推荐

