描述
LocalRecognitionModel.SenseVoice 在配置、模型下载、路径解析、启动检查、UI 各层均已完整支持,但 AudioPipelineFactory 中没有对应的识别服务实现分支。选择 SenseVoice + Local 模式后会静默回退到远程 FastApiRecognitionService,与用户预期不符。
复现步骤
- 设置
RecognitionBackendMode = Local(本地识别)
- 设置
LocalRecognitionModelType = 1(SenseVoice)
- 通过更新中心下载 SenseVoice 模型包(
sensevoice-small/model.onnx)
- 启动麦克风识别
- 观察实际行为
预期行为
使用本地 SenseVoice 模型进行离线识别。
实际行为
AudioPipelineFactory.CreateRecognitionService 只查 Sherpa 模型目录,找不到后回退到远程 FastApiRecognitionService,SenseVoice 模型被忽略。
代码证据
已实现的部分:
01.VRCLS.Core/Models/ConfigEnums.cs:49-53 — 枚举定义 SenseVoice = 1
01.VRCLS.Core/Models/AppConfig.cs:847 — SenseVoiceModelDir 配置字段
02.VRCLS.Services/Update/ModelUpdateService.cs:248 — 下载逻辑按枚举值区分 "sensevoice" / "sherpa"
02.VRCLS.Services/Update/ModelUpdateService.cs:271-289 — HasSenseVoiceModel() 检查 model.onnx 存在
03.VRCLS.UI/ViewModels/SettingsViewModel.cs:3300-3339 — ResolveSenseVoiceModelDir() 路径解析
03.VRCLS.UI/App.xaml.cs:920-944 — 启动时检查缺失模型并提示
缺失的部分:
02.VRCLS.Services/Audio/AudioPipelineFactory.cs:151-180 CreateRecognitionService:
if (mode == RecognitionBackendMode.Local)
{
var sherpaDir = _modelPathResolver.ResolveSherpaModelDir(); // 只查 Sherpa
if (!string.IsNullOrWhiteSpace(sherpaDir))
return new SherpaAsrService(sherpaDir, ...); // 只创建 Sherpa
_logger.Warning("Sherpa model directory not found; falling back to remote recognition.");
}
return new FastApiRecognitionService(...); // 回退远程
- 没有
SenseVoiceAsrService : IRecognitionService 实现类(02.VRCLS.Services/Recognition/ 下只有 SherpaAsrService.cs 和 FastApiRecognitionService.cs)
SherpaAsrService 使用 Sherpa-ONNX 的 OnlineRecognizer + OnlineTransducerModelConfig(encoder/decoder/joiner 三件套,流式),无法加载 SenseVoice 的单文件 model.onnx(离线模型,需要 OfflineRecognizer)
IModelPathResolver 接口也缺 ResolveSenseVoiceModelDir() 方法,目前只在 SettingsViewModel 里实现了路径解析
建议修复方向
- 新增
SenseVoiceAsrService : IRecognitionService,使用 Sherpa-ONNX 的 OfflineRecognizer(或 SenseVoice 专用 config)加载 model.onnx
- 在
IModelPathResolver 增加 ResolveSenseVoiceModelDir(),将 SettingsViewModel 里的逻辑下沉到服务层
- 在
AudioPipelineFactory.CreateRecognitionService 增加分支:
if (mode == RecognitionBackendMode.Local)
{
if (_config.LocalRecognitionModelValue == LocalRecognitionModel.SenseVoice)
{
var senseVoiceDir = _modelPathResolver.ResolveSenseVoiceModelDir();
if (!string.IsNullOrWhiteSpace(senseVoiceDir))
return new SenseVoiceAsrService(senseVoiceDir, source, useVad);
}
else
{
var sherpaDir = _modelPathResolver.ResolveSherpaModelDir();
if (!string.IsNullOrWhiteSpace(sherpaDir))
return new SherpaAsrService(sherpaDir, source, useVad, endpointSilence);
}
}
IsMicStreamingLocalMode 同步调整(SenseVoice 是离线模型,VAD 切段模式更合适,不一定走 streaming 路径)
环境信息
- 仓库:VRCLS-main(C#/.NET 8 + WPF 重制版)
- 本地识别模式相关代码路径:
02.VRCLS.Services/Audio/AudioPipelineFactory.cs、02.VRCLS.Services/Recognition/
描述
LocalRecognitionModel.SenseVoice在配置、模型下载、路径解析、启动检查、UI 各层均已完整支持,但AudioPipelineFactory中没有对应的识别服务实现分支。选择 SenseVoice + Local 模式后会静默回退到远程FastApiRecognitionService,与用户预期不符。复现步骤
RecognitionBackendMode = Local(本地识别)LocalRecognitionModelType = 1(SenseVoice)sensevoice-small/model.onnx)预期行为
使用本地 SenseVoice 模型进行离线识别。
实际行为
AudioPipelineFactory.CreateRecognitionService只查 Sherpa 模型目录,找不到后回退到远程FastApiRecognitionService,SenseVoice 模型被忽略。代码证据
已实现的部分:
01.VRCLS.Core/Models/ConfigEnums.cs:49-53— 枚举定义SenseVoice = 101.VRCLS.Core/Models/AppConfig.cs:847—SenseVoiceModelDir配置字段02.VRCLS.Services/Update/ModelUpdateService.cs:248— 下载逻辑按枚举值区分"sensevoice"/"sherpa"02.VRCLS.Services/Update/ModelUpdateService.cs:271-289—HasSenseVoiceModel()检查model.onnx存在03.VRCLS.UI/ViewModels/SettingsViewModel.cs:3300-3339—ResolveSenseVoiceModelDir()路径解析03.VRCLS.UI/App.xaml.cs:920-944— 启动时检查缺失模型并提示缺失的部分:
02.VRCLS.Services/Audio/AudioPipelineFactory.cs:151-180CreateRecognitionService:SenseVoiceAsrService : IRecognitionService实现类(02.VRCLS.Services/Recognition/下只有SherpaAsrService.cs和FastApiRecognitionService.cs)SherpaAsrService使用 Sherpa-ONNX 的OnlineRecognizer+OnlineTransducerModelConfig(encoder/decoder/joiner 三件套,流式),无法加载 SenseVoice 的单文件model.onnx(离线模型,需要OfflineRecognizer)IModelPathResolver接口也缺ResolveSenseVoiceModelDir()方法,目前只在SettingsViewModel里实现了路径解析建议修复方向
SenseVoiceAsrService : IRecognitionService,使用 Sherpa-ONNX 的OfflineRecognizer(或 SenseVoice 专用 config)加载model.onnxIModelPathResolver增加ResolveSenseVoiceModelDir(),将SettingsViewModel里的逻辑下沉到服务层AudioPipelineFactory.CreateRecognitionService增加分支:IsMicStreamingLocalMode同步调整(SenseVoice 是离线模型,VAD 切段模式更合适,不一定走 streaming 路径)环境信息
02.VRCLS.Services/Audio/AudioPipelineFactory.cs、02.VRCLS.Services/Recognition/