夜雨聆风学习资料网

ARTICLE · 1278159

实战|低端安卓跑流式ASR助听字幕:量化踩坑与完整优化路线

实战|低端安卓跑流式ASR助听字幕:量化踩坑与完整优化路线

项目目标:在低端安卓设备(华为MRD‑AL00,Helio P35 八核A53,Android9)上,实现离线流式ASR实时上屏字幕Demo,面向助听场景,在识别精度、推理速度、安装包体积之间寻找最优平衡点。

一、整体技术选型

选用 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噪声环境也保持较好识别效果。

短板:0dB强干扰噪声下,两套模型CER均超过50%,真实嘈杂环境需要增加前置降噪模块。

二、最关键踩坑:不能无脑全INT8量化

一开始直接对整个模型做全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%高水平。

重要教训:量化不要追求"一刀切全int8",自回归模块要格外小心量化误差累积。

三、Android端工程实现

1、模型打包优化

模型放在assets目录,首次启动解压到应用私有目录,通过版本戳文件防止新旧模型文件混杂;
CPU架构只保留 arm64‑v8a 与 armeabi‑v7a,剔除模拟器x86架构,减少69.2MB体积;
关闭onnx资源压缩,避免运行时二次拷贝;
最终APK大小250.2MiB。

2、UI与交互

纯Java代码构建界面,包含圆形录音按键、呼吸脉冲动画、实时波形可视化、转写字幕卡片、计时组件;字幕区分已定稿文本和正在输入的临时文本,用青色光标模拟打字效果。

3、核心代码结构

麦克风录音循环:每100ms输出一块音频送入ASR;
双模式:麦克风实时识别 + 音频文件基准压测;
模型加载支持外置目录,方便做A/B模型对比,无需重新打包APK。

四、真机Helio P35性能瓶颈分析

在低端8×A53小核平台做多组参数扫描,核心发现:
瓶颈不是算力,是内存带宽。encoder权重173MB,每一轮推理都需要从内存读取,A53小核内存带宽有限,线程数提升收益快速衰减:1→2线程加速27%,2→3仅13%,3→4只有3.4%提升。
decoder、joiner计算量很小,不是性能卡点。
chunk分片大小对RTF整体影响不大;100ms chunk推理p95耗时最低;150ms chunk首字延迟表现最优。

生产建议:虽然4线程跑分最高,但低端设备长时间运行推荐配置 threads=3,牺牲少量RTF,预留CPU给音频采集、UI渲染,减少发热节流、界面卡顿。

实测效果: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混合精度方案,兼顾识别精度、体积,可在低端安卓实现可用的实时离线助听字幕;
真实嘈杂环境,必须增加前置降噪,否则识别效果会严重恶化。

本Demo面向助听字幕的离线场景,完整验证了流式ASR在入门级安卓设备落地的可行性。

 项目代码:https://github.com/suihanlansnow/android_asr

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料