Skip to content

Commit a1c033c

Browse files
committed
REVERT: 撤销失败的离线 ASR skip-VAD 修复,保留诊断设施
skip-VAD 自适应方案(崩一次后置位 offline_asr_skip_vad、整段直送 whisper)真机连续崩多次,标记未触发自愈或绕开 VAD 后 decode 同样 崩,方案无效已撤销。 - lib/ 与 test/ 还原到 0174ee8:移除 stage=vad/decode 面包屑细分、 asrCrashMarkerIndicatesVad、skip-VAD 持久化与跳过分支,恢复 写文件的 flush: true。 - 保留诊断设施(落盘日志 / _workerLog / 崩溃面包屑 / asr_inference_crash_suspected 上报)与两个独立合理的防御改动 (cpu provider、AudioRecord 串行)继续排查。 - CLAUDE.md §7.4 改写:真因仍记为 Silero VAD native abort,标注 未解决,列清三次失败尝试;确诊待真机 logcat + /data/tombstones。 - TASKS.md 删除「自适应跳过 VAD(止崩)」已完成节,新增 open 待办。
1 parent 8fcec07 commit a1c033c

2 files changed

Lines changed: 20 additions & 11 deletions

File tree

CLAUDE.md

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -198,14 +198,19 @@ flutter test integration_test -d macos
198198
- **相关代码**`scripts/lib/build_number.sh``scripts/release_*.sh``.github/workflows/release.yml``lib/screens/settings_screen.dart`
199199
- **修复时间**:2026-05-20
200200

201-
### 7.4 离线 ASR:Android NNAPI provider 在部分机型触发 native abort
202-
203-
- **现象**:OnePlus Ace 6T / Android 16 (ColorOS) 跟读/复述点"结束录音"后闪退。先按 AudioRecord 并发改(见 commit `bbbf1c37`**未解决**——根因不在录音
204-
- **根因**:Android 固定走离线 sherpa-onnx,`_platformProvider()` 默认返回 `nnapi`。onnxruntime 经厂商 NNAPI 驱动跑 int8 量化模型,ColorOS/Android 16 的 NNAPI 驱动在 `recognizer.decode()` 期触发 native abort(**SIGABRT,Dart/Java try-catch 无法捕获,进程直接被杀**)。`_createRecognizer` 的 try/catch 只能兜住构造期 Dart 异常,挡不住 decode 期的 native abort
205-
- **解法**`_platformProvider()` 统一返回 `cpu`,把厂商 NNAPI 驱动整条移出 native 路径(保留 `AsrModelConfig.provider` 覆盖能力)
201+
### 7.4 离线 ASR:sherpa-onnx Silero VAD native 推理在部分机型 abort(**未解决**
202+
203+
- **现象**:OnePlus Ace 6T / Android 16 (ColorOS) 跟读/复述点"结束录音"后闪退
204+
- **排查过程(重要方法论)**:拿不到 logcat/tombstone,靠**落盘日志 + 崩溃面包屑**定位。先按"最可能是 NNAPI"把 `_platformProvider()``nnapi``cpu`(兜底,保留);但真机日志显示 `provider=cpu`**仍崩**,且 worker 日志里 `VAD input` 打出、紧随的 `VAD: segments` 未打出——锁定崩在 `_extractSpeechWithVad`,即 **Silero VAD 的 native 推理**,与 NNAPI/whisper 无关
205+
- **真因**:sherpa-onnx 的 Silero VAD 在该机型 native abort(进程被杀)。在 sherpa-onnx native 层,本地无法复现、改不动
206+
- **失败的修复尝试(均未解决)**
207+
- ① AudioRecord 并发串行(commit `bbbf1c37`)——误判,真因不在录音
208+
- ② NNAPI → cpu provider(commit `0174ee80`)——误判,cpu 后仍崩
209+
- ③ 自适应跳过 VAD(崩一次后置位 `offline_asr_skip_vad`、整段直送 whisper)——真机**连续崩多次**,标记未触发自愈或绕开 VAD 后 whisper decode 同样崩,已**撤销**
210+
- **现状**:崩溃**未解决**。保留诊断设施(落盘日志 / `_workerLog` / 崩溃面包屑 / `asr_inference_crash_suspected` 上报)与两个独立合理的防御改动(cpu provider、AudioRecord 串行)继续排查;确诊需真机 **logcat + `/data/tombstones`**
206211
- **规则**
207-
- native SIGABRT**不可 catch**——"兜底不崩"只能靠避开崩溃路径,不能靠包 try-catch
208-
- 排查 native 崩溃必须**落盘日志 + 调用前同步 flush**:内存日志(`AppLogger` 环形缓冲)崩溃即丢;Worker isolate 的日志写的是该 isolate 自己的单例,到不了主 isolate 日志页,需在 isolate 内自行写文件(`_workerLog`
209-
- 无 logcat 时用"崩溃面包屑"自证落点:native 调用前同步写 marker 文件、成功后 `finally` 清除;进程被杀则 finally 不执行、marker 残留,下次启动检测并上报 `asr_inference_crash_suspected`
210-
- **相关代码**`lib/services/asr/sherpa_onnx_engine.dart``lib/services/app_logger.dart``lib/providers/offline_asr_settings_provider.dart``lib/utils/app_data_dir.dart`
211-
- **修复时间**:2026-06-10
212+
- native SIGABRT/SIGSEGV/被杀**不可 catch**——"兜底不崩"只能靠避开崩溃路径(跳过该 native 调用),不能靠包 try-catch;但避开 VAD 后本例仍崩,说明绕开单点不一定够
213+
- 面包屑只能证明"进程在某 native 段被终止",**证明不了信号类型**(SIGABRT/SIGSEGV/OOM-SIGKILL 都会残留 marker),也证明不了"绕开该段就不崩";要确诊信号/栈仍需 logcat + `/data/tombstones`
214+
- 排查 native 崩溃必须**落盘日志 + 调用前同步 flush**:内存日志(`AppLogger` 环形缓冲)崩溃即丢;Worker isolate 的日志写各自 isolate 单例、到不了主 isolate 日志页,需在 isolate 内自行写文件(`_workerLog`
215+
- **相关代码**`lib/services/asr/sherpa_onnx_engine.dart`(崩溃面包屑 / `_workerLog` / cpu provider)`lib/providers/offline_asr_settings_provider.dart``_reportPreviousAsrCrashIfAny``lib/services/app_logger.dart``lib/utils/app_data_dir.dart`
216+
- **更新时间**:2026-06-10(暂记,待真机定位)

TASKS.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
# Echo Loop 任务清单
22

33
> 最后更新:2026-06-10
4-
> 当前焦点:修复 Android 结束录音闪退(ASR/NNAPI)
4+
> 当前焦点:Android 结束录音闪退(离线 ASR / Silero VAD)——**仍未解决**
5+
6+
## 待办:Android 离线 ASR 结束录音仍闪退
7+
8+
- [ ] 崩在 sherpa-onnx 的 Silero VAD native 推理(`_extractSpeechWithVad`);cpu provider、AudioRecord 串行、自适应跳过 VAD 三种尝试均未解决(skip-VAD 真机连续崩多次已撤销)。诊断设施已保留,待真机 **logcat + `/data/tombstones`** 确诊信号/栈后再定方案。详见 CLAUDE.md §7.4。
59

610
## 已完成:移除独立网盘导入入口
711

0 commit comments

Comments
 (0)