1. AI语音识别模型中的Tokens参数异常问题解析
在开发基于ONNX Runtime的AI语音识别系统时,我们经常会遇到模型输入输出参数不匹配的问题,特别是当处理动态维度输入时。最近在"东方仙盟"项目的语音识别模块开发中,就遇到了一个典型的tokens参数异常问题。
这个问题的核心在于:当语音识别模型输出整数token序列而非文本字符串时,系统会直接将token数字拼接成字符串,导致识别结果异常。比如正确的输出应该是"你好",但系统却返回了"123456789"这样的数字序列。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题重现与核心代码分析
2.1 异常现象描述
在我们的语音识别系统中,当调用Recognize方法进行推理时,偶尔会出现以下异常现象:
- 预期输出:正常的中文文本(如"打开灯光")
- 实际输出:一串数字组合(如"284756291")
- 错误类型:无报错,但输出内容明显不符合预期
2.2 关键代码段分析
问题出在SenseVoiceOnnxModelv4类的Recognize方法中,特别是处理模型输出的部分:
csharp复制// 执行推理
using (var results = _voiceSession.Run(inputs))
{
// 兼容字符串/整数输出
string text = string.Empty;
try
{
var outputTensor = results.First().AsTensor<string>();
text = outputTensor.FirstOrDefault() ?? string.Empty;
}
catch
{
var outputTensor = results.First().AsTensor<int>();
int[] tokens = outputTensor.ToArray();
text = string.Join("", tokens.Select(t => t.ToString()));
}
return FormatText(text);
}
这段代码的逻辑是:
- 首先尝试将输出解析为字符串张量
- 如果失败,则尝试解析为整数张量
- 将整数token直接拼接成字符串返回
2.3 问题根源
问题的根本原因在于:
- 模型输出不一致:同一个模型在不同情况下可能输出字符串或整数token序列
- 错误处理方式:当输出是token序列时,直接拼接数字会导致无意义的数字串
- 缺乏token转换:没有将数字token映射回实际文本字符
3. 解决方案设计与实现
3.1 解决方案概述
针对这个问题,我们需要:
- 明确区分字符串输出和token序列输出
- 对于token序列输出,需要提供token到文本的映射
- 改进错误处理逻辑,避免简单拼接数字
3.2 改进后的Recognize方法
csharp复制public string Recognize(float[] audioData, bool isFinal = false)
{
if (!IsAudioValid(audioData))
return string.Empty;
lock (_lockObj)
{
try
{
var inputTensor = CreateInputTensor(audioData, _voiceInputShape);
var inputs = new List<NamedOnnxValue>
{
NamedOnnxValue.CreateFromTensor(_voiceInputName, inputTensor)
};
