Skip to content

本地 SenseVoice 识别模式缺失识别服务实现,选中后静默回退到远程 #51

Description

@aiguoliuguo

描述

LocalRecognitionModel.SenseVoice 在配置、模型下载、路径解析、启动检查、UI 各层均已完整支持,但 AudioPipelineFactory 中没有对应的识别服务实现分支。选择 SenseVoice + Local 模式后会静默回退到远程 FastApiRecognitionService,与用户预期不符。

复现步骤

  1. 设置 RecognitionBackendMode = Local(本地识别)
  2. 设置 LocalRecognitionModelType = 1(SenseVoice)
  3. 通过更新中心下载 SenseVoice 模型包(sensevoice-small/model.onnx
  4. 启动麦克风识别
  5. 观察实际行为

预期行为

使用本地 SenseVoice 模型进行离线识别。

实际行为

AudioPipelineFactory.CreateRecognitionService 只查 Sherpa 模型目录,找不到后回退到远程 FastApiRecognitionService,SenseVoice 模型被忽略。

代码证据

已实现的部分:

  • 01.VRCLS.Core/Models/ConfigEnums.cs:49-53 — 枚举定义 SenseVoice = 1
  • 01.VRCLS.Core/Models/AppConfig.cs:847SenseVoiceModelDir 配置字段
  • 02.VRCLS.Services/Update/ModelUpdateService.cs:248 — 下载逻辑按枚举值区分 "sensevoice" / "sherpa"
  • 02.VRCLS.Services/Update/ModelUpdateService.cs:271-289HasSenseVoiceModel() 检查 model.onnx 存在
  • 03.VRCLS.UI/ViewModels/SettingsViewModel.cs:3300-3339ResolveSenseVoiceModelDir() 路径解析
  • 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.csFastApiRecognitionService.cs
  • SherpaAsrService 使用 Sherpa-ONNX 的 OnlineRecognizer + OnlineTransducerModelConfig(encoder/decoder/joiner 三件套,流式),无法加载 SenseVoice 的单文件 model.onnx(离线模型,需要 OfflineRecognizer
  • IModelPathResolver 接口也缺 ResolveSenseVoiceModelDir() 方法,目前只在 SettingsViewModel 里实现了路径解析

建议修复方向

  1. 新增 SenseVoiceAsrService : IRecognitionService,使用 Sherpa-ONNX 的 OfflineRecognizer(或 SenseVoice 专用 config)加载 model.onnx
  2. IModelPathResolver 增加 ResolveSenseVoiceModelDir(),将 SettingsViewModel 里的逻辑下沉到服务层
  3. 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);
    }
}
  1. IsMicStreamingLocalMode 同步调整(SenseVoice 是离线模型,VAD 切段模式更合适,不一定走 streaming 路径)

环境信息

  • 仓库:VRCLS-main(C#/.NET 8 + WPF 重制版)
  • 本地识别模式相关代码路径:02.VRCLS.Services/Audio/AudioPipelineFactory.cs02.VRCLS.Services/Recognition/

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions