现象
开启「多模态识别管线」且切换到「多模态模式」后,使用选区语音编辑(选中文字 → 热键口述指令 → 提问 / 编辑选区):
- 期望(按设置文案):语音也走 Omni,一步完成「音频 + 提示词 → 文本」
- 实际:仍走 传统 ASR 转写指令 → LLM 润色 / 意图分类 / EditPlan
- 多模态开关对这条路径无效;主听写 / QA 语音在同一偏好下会走 Omni
影响
- 产品文案与行为不一致(「各语音管线」改用 Omni,但选区语音编辑未覆盖)。
- 多模态模式下若未配置 ASR,选区语音编辑会在捕获阶段失败,尽管 Omni 已验证通过。
- 历史里
pipeline_mode 为 None / 写死 traditional,无法归因。
环境
- 平台:桌面(Selection Voice;Less Computer 语音同源闸门)
- 调研:仓库内
docs/omni-pipeline-mobile-and-voice-edit-research.md §4
根因分析(调研结论)
不是偏好读写 bug,是代码硬编码。
start_selection_voice_capture(及 Less Computer 语音)传入 DictationContextPurpose::AsrOnly(api.rs)。
capture_dictation_context 注释写明 Less/Selection audio always uses ASR,对 AsrOnly 强制 PipelineMode::Traditional,无视 effective_pipeline_mode。
- 捕获走
start_voice_capture(ASR),而非 QA 的 start_audio_capture + PCM → Omni。
- 后处理
selection_voice_service::model_text 解析真实 LLM,占位 "selection-voice-unused-omni";Host 将 selection_polisher 接到传统 LLM,不是 SharedAuxiliaryTextPolisher。
- 对照:
start_qa_voice_capture(QaVoice)已按 multimodal 正确分支。
行为矩阵(multimodal ON)
| 场景 |
实际管线 |
| 主听写 |
Omni |
| QA 语音 |
Omni |
| 选区语音编辑 |
ASR → LLM(传统) |
| Less Computer 语音 |
ASR(传统) |
接受标准(产品二选一,需先定)
A. 文档化例外(最小)
B. 对齐 QA(完整)
相关代码
现象
开启「多模态识别管线」且切换到「多模态模式」后,使用选区语音编辑(选中文字 → 热键口述指令 → 提问 / 编辑选区):
影响
pipeline_mode为None/ 写死 traditional,无法归因。环境
docs/omni-pipeline-mobile-and-voice-edit-research.md§4根因分析(调研结论)
不是偏好读写 bug,是代码硬编码。
start_selection_voice_capture(及 Less Computer 语音)传入DictationContextPurpose::AsrOnly(api.rs)。capture_dictation_context注释写明Less/Selection audio always uses ASR,对AsrOnly强制PipelineMode::Traditional,无视effective_pipeline_mode。start_voice_capture(ASR),而非 QA 的start_audio_capture+ PCM → Omni。selection_voice_service::model_text解析真实 LLM,占位"selection-voice-unused-omni";Host 将selection_polisher接到传统 LLM,不是SharedAuxiliaryTextPolisher。start_qa_voice_capture(QaVoice)已按 multimodal 正确分支。行为矩阵(multimodal ON)
接受标准(产品二选一,需先定)
A. 文档化例外(最小)
B. 对齐 QA(完整)
AsrOnly强制 Traditional;尊重effective_pipeline_modestart_audio_capture+ Omni 产出指令文本,再走既有意图 / EditPlanpipeline_mode相关代码
openless-all/app/crates/openless-core/src/api.rs(AsrOnly、start_selection_voice_capture、start_qa_voice_capture)openless-all/app/crates/openless-core/src/selection_voice_service.rsopenless-all/app/src-tauri/src/coordinator/selection_voice_session.rsopenless-all/app/src-tauri/src/core_adapters.rs(selection_polisher)