Skip to content

[Feature] 支持 Xiaomi MiMo Token Plan 的 ASR 语音识别服务 #152

@endlessovo99

Description

@endlessovo99

[Feature] 支持 Xiaomi MiMo Token Plan 的 ASR 语音识别服务

背景现状

#151 已经完成针对小米 API 的 ASR 接入,实现了 XiaomiMiMoASRProvider,并将 Xiaomi MiMo 加入现有云端 ASR 平台链路。当前已具备:

  • ASRPlatform / ASRConfig 统一配置入口;
  • ASRProviderFactory 按所选平台分发 Provider;
  • XiaomiMiMoASRProvider 通过 OpenAI Chat Completions 兼容接口提交 WAV 音频;
  • 模型固定为 mimo-v2.5-asr
  • 通过 Authorization: Bearer <apiKey> 鉴权;
  • asr_options.language 支持 auto / zh / en
  • choices[0].message.content 解析识别文本;
  • 配置验证、分段串行 ASR、错误映射和设置页状态展示已接入。

现在需要新增针对小米 token plan 的 ASR 接入实现。它与 #151 的小米 API ASR 接入只有一个差异:token plan 需要使用的 Base URL 为:

https://token-plan-cn.xiaomimimo.com/v1

因此最终 Chat Completions 请求地址应为:

https://token-plan-cn.xiaomimimo.com/v1/chat/completions

除 Base URL 外,请求协议、模型、鉴权方式、音频编码、语言参数、响应解析和错误策略均应复用现有 Xiaomi MiMo ASR 实现。

价值意义

  1. 支持小米 token plan 用户

已有 Xiaomi MiMo ASR 接入默认使用普通 API 地址。新增 token plan 入口后,使用 token plan 服务的用户也可以在 Typoless 中完成云端语音识别配置与验证。

  1. 最大化复用现有实现

token plan 与已实现的小米 API ASR 仅 Base URL 不同,不应重复实现一套请求体、解析逻辑或错误映射。理想实现是将 XiaomiMiMoASRProvider 的 Base URL 参数化,并用独立 ASRPlatform 变体复用同一个 Provider。

  1. 不改变主链路行为

该需求不涉及录音、分段、LLM 润色、翻译模式、文本注入、权限引导等主流程调整。选中 token plan 后,仍应保持现有“分段串行识别、失败不注入部分文本”的策略。

实现路径

1. Provider Base URL 参数化

app/Typoless/Providers/XiaomiMiMoASRProvider.swift 中,将当前固定地址:

https://api.xiaomimimo.com/v1/chat/completions

调整为可注入 Base URL 或 recognize URL。

建议保留普通 Xiaomi MiMo 默认值,同时新增 token plan 默认值:

普通 API Base URL: https://api.xiaomimimo.com/v1
Token Plan Base URL: https://token-plan-cn.xiaomimimo.com/v1

Provider 内部统一拼接或持有最终 Chat Completions URL:

<baseURL>/chat/completions

实现时注意处理 Base URL 末尾是否带 /,避免生成重复斜杠或缺少路径。

2. 配置模型与平台入口

新增独立 ASRPlatform,例如:

xiaomiMiMoTokenPlanASR

UI 展示名固定为:

小米 MiMo(Token Plan)

配置可以复用现有 XiaomiMiMoASRConfig 的字段结构,或新增独立 token plan 配置对象;但用户侧应表现为 ASR 选择列表中的一个独立选项,而不是 MiMo 面板里的 plan 下拉框。

配置完整性仍只要求 API Key 非空;Language 仍沿用 auto / zh / en。该需求只支持固定 token plan 地址,不开放任意 Base URL 输入框。

3. 设置页

app/Typoless/UI/Settings/ASRSettingsView.swift 中补充 token plan 独立入口:

  • 语音引擎 / ASR Picker 中新增 小米 MiMo(Token Plan)
  • 选中后展示与现有小米 MiMo 相同的配置面板;
  • API Key 仍使用 secure input;
  • Language 仍使用现有 Picker;
  • 修改 API Key 或 Language 后,应使 token plan 对应验证状态失效,并触发新的真实请求验证。

4. 验证服务与工厂

CloudASRValidationInputCloudASRValidationServiceASRProviderFactory 中接入 token plan 独立平台:

  • validation fingerprint 应包含 xiaomiMiMoTokenPlanASR 平台信息,避免与普通小米 MiMo 验证状态混用;
  • validatorFactory 创建 Provider 时传入 token plan Base URL;
  • 主链路 ProviderFactory 创建 Provider 时也传入同一 Base URL;
  • token plan 验证失败、鉴权失败、网络失败、空响应、非法响应等仍沿用现有小米 MiMo 错误映射。

5. 文档同步

根据独立 ASR 选项同步更新:

  • docs/PRD.md:ASR 平台列表补充 小米 MiMo(Token Plan)
  • docs/TDD.md:小米 MiMo 普通 API 与 Token Plan 的 Base URL 差异;
  • docs/EPICS_AND_STORIES.md:云端 ASR 平台 / Provider 说明;
  • README.md:用户可见 ASR 平台列表补充 小米 MiMo(Token Plan)

6. 测试覆盖

建议补充:

  • XiaomiMiMoASRProviderTests:token plan 请求 URL 为 https://token-plan-cn.xiaomimimo.com/v1/chat/completions
  • Base URL 末尾带 / 与不带 / 时均能生成正确请求地址;
  • ASRConfigTestsxiaomiMiMoTokenPlanASR 的 displayName 为 小米 MiMo(Token Plan),ready / notReadyReason 正确;
  • ASRProviderFactory:选中 token plan 平台时创建使用 token plan URL 的 Provider;
  • CloudASRValidationServiceTests:token plan fingerprint 与 validatorFactory 覆盖;
  • ConfigStoreTests:修改 token plan API Key / Language 后验证状态失效。

验收标准

  • ASR 选择列表中新增 小米 MiMo(Token Plan)
  • 选中 小米 MiMo(Token Plan) 后,可以填写 API Key,并选择识别语言 auto / zh / en
  • token plan 请求实际发送到 https://token-plan-cn.xiaomimimo.com/v1/chat/completions
  • 除 Base URL 外,请求模型、Header、JSON body、语言参数、响应解析与 feat(asr): add Xiaomi MiMo provider #151 的 Xiaomi MiMo ASR 保持一致;
  • token plan 支持真实请求验证,并展示未就绪 / 已就绪 / 验证失败状态;
  • 长录音多分段仍按现有逻辑串行识别并按顺序拼接;
  • token plan 请求失败时不回退其他平台,不注入部分文本;
  • API Key 不出现在日志、错误提示或诊断输出中;
  • 相关 README / PRD / TDD / EPICS_AND_STORIES 说明已同步更新。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions