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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:18:27