ARTICLE · 1278159
实战|低端安卓跑流式ASR助听字幕:量化踩坑与完整优化路线
实战|低端安卓跑流式ASR助听字幕:量化踩坑与完整优化路线选用 sherpa‑onnx 作为推理框架,C++底层+JNI供Java调用,无AndroidX额外依赖;模型采用流式zipformer‑transducer,解码使用greedy_search降低算力开销;UI采用原生纯Java手写,规避Compose带来的包体积膨胀。 PC端完成候选模型评测: 轻量14M全int8模型:速度快,但干净文本CER 12.36%,噪声环境识别崩坏,同音字错漏多; paraformer流式模型:RTF过高,低端机跑不满实时; bilingual混合精度模型入选:干净场景CER低至3.79%,10dB噪声环境也保持较好识别效果。 一开始直接对整个模型做全int8量化,出现严重问题:字符大量重复循环输出,例如「漂亮漂亮亮主妇妇」,字符错误率CER从3.87%暴涨至25.34%。 于是做逐组件隔离量化实验,分别控制encoder、decoder、joiner的精度,用 rep_ratio(重复字符占比)衡量循环bug严重程度: decoder做int8是灾难根源:decoder属于自回归模块,上一步输出会回输到下一步,int8舍入误差会在循环里持续放大,引发token重复;但decoder从fp32转int8仅仅只节省0.7MB,收益极低。 joiner可以安全int8:只是简单的特征投影,不存在反馈回路,可节省9.1MB,识别精度几乎无变化。 encoder必须int8,直接节省141MB权重体积,收益巨大。 ✅最终量化组合:encoder‑int8 + decoder‑fp32 + joiner‑int8 模型体积189.8MB,既控制体积,又解决重复输出,CER保持3.77%高水平。 模型放在assets目录,首次启动解压到应用私有目录,通过版本戳文件防止新旧模型文件混杂; CPU架构只保留 arm64‑v8a 与 armeabi‑v7a,剔除模拟器x86架构,减少69.2MB体积; 关闭onnx资源压缩,避免运行时二次拷贝; 最终APK大小250.2MiB。 纯Java代码构建界面,包含圆形录音按键、呼吸脉冲动画、实时波形可视化、转写字幕卡片、计时组件;字幕区分已定稿文本和正在输入的临时文本,用青色光标模拟打字效果。 麦克风录音循环:每100ms输出一块音频送入ASR; 双模式:麦克风实时识别 + 音频文件基准压测; 模型加载支持外置目录,方便做A/B模型对比,无需重新打包APK。 在低端8×A53小核平台做多组参数扫描,核心发现: 瓶颈不是算力,是内存带宽。encoder权重173MB,每一轮推理都需要从内存读取,A53小核内存带宽有限,线程数提升收益快速衰减:1→2线程加速27%,2→3仅13%,3→4只有3.4%提升。 decoder、joiner计算量很小,不是性能卡点。 chunk分片大小对RTF整体影响不大;100ms chunk推理p95耗时最低;150ms chunk首字延迟表现最优。 实测效果:threads=3、chunkMs=100,RTF≈0.657,P95解码323ms,首字P50约955ms,可实现离线实时字幕。 合理配置推理线程数; 字幕UI节流刷新,避免频繁构建Spannable造成GC抖动; 调整端点检测静音阈值,加快句子定稿; AudioRecord缓冲区调优,防止音频欠载断音; joiner开启int8,在无损精度前提下压缩模型体积。 生产环境推理线程固定为3,规避设备热节流; chunk调整为150ms,首字延迟降低到850ms,推理性能损失很小。 接入GTCRN前置降噪,解决餐厅嘈杂0dB噪声识别崩盘的痛点; 尝试NNAPI硬件加速(仅新设备可用,Helio P35不支持); 调优ONNX计算图优化等级。 更换小体积模型,代价识别精度明显下降; encoder模型剪枝、模型蒸馏,压缩encoder权重; 定制per‑channel感知量化,尝试修复decoder int8退化问题,改动底层导出脚本。 字幕能力:增加标点恢复、SRT/TXT字幕导出; 多说话人:接入说话人分离模型,区分多人对话; 无障碍助听场景:定稿震动反馈、关键词高亮、低延迟模式、离线唤醒词; 工程化:模型CDN按需下载,APK瘦身至5MB级别;多模型热切换;根据设备性能自动自适应推理参数。 低端离线流式ASR最大的坑来自自回归Decoder的量化误差累积,不能无脑全int8,必须分组件做消融实验; Helio P35这类小核ARM平台,瓶颈经常不是CPU算力,而是内存带宽,线程不是越多越快; 当前bilingual混合精度方案,兼顾识别精度、体积,可在低端安卓实现可用的实时离线助听字幕; 真实嘈杂环境,必须增加前置降噪,否则识别效果会严重恶化。 项目代码:https://github.com/suihanlansnow/android_asr
项目目标:在低端安卓设备(华为MRD‑AL00,Helio P35 八核A53,Android9)上,实现离线流式ASR实时上屏字幕Demo,面向助听场景,在识别精度、推理速度、安装包体积之间寻找最优平衡点。
一、整体技术选型
短板:0dB强干扰噪声下,两套模型CER均超过50%,真实嘈杂环境需要增加前置降噪模块。
二、最关键踩坑:不能无脑全INT8量化
重要教训:量化不要追求"一刀切全int8",自回归模块要格外小心量化误差累积。
三、Android端工程实现
1、模型打包优化
2、UI与交互
3、核心代码结构
四、真机Helio P35性能瓶颈分析
生产建议:虽然4线程跑分最高,但低端设备长时间运行推荐配置 threads=3,牺牲少量RTF,预留CPU给音频采集、UI渲染,减少发热节流、界面卡顿。
已经落地的优化
五、后续优化路线(按投入产出)
🟢 低成本,可快速落地
🟡 中等成本,需要验证
🔴 高成本改造
六、产品功能扩展方向
七、项目总结
本Demo面向助听字幕的离线场景,完整验证了流式ASR在入门级安卓设备落地的可行性。















































































