本周工作思考
语音微课录制功能优化迭代
语音微课的录制一直存在一些不稳定的情况,比如抖动,爆音,刺啦音,突然的倍速变慢或者变快等,这些都是都是偶发的情况,本地极不容易复现,很难准确定位问题所在,从问题的代码分析及录制的声音质量上来说,比如抖动,变快或者变慢,都是浏览器上录制计时和压缩音频片段里的时域数据不一致造成的,简单来说使用44.1kHZ的录制的音频,在基于音频slice转码时,由于浏览器所在电脑的性能影响,音频slice存在丢失的情况,这就导致采样率变低,转码后的声音就有变形或者变慢的表现。这些问题虽然是和用户电脑相关,根本上也和我们的实现有一定关系。
本次优化换掉了纯webassembly的mp3转码库,使用Chrome WebRTC自带的MediaRecorer录制(底层基于Opus和VP8/9),在很大程度上解决了噪音,莫名的变快或者变慢问题。
这次优化不是说浏览器端做基于webassembly的mp3转码库不可靠,其实是我们做的不够完善,比如性能优化,缓存区管理,各种音声处理算法等, 这也给了我们一个重要的经验和启发,在做基于webassembly的开发时,一定要有相应的系统性的底层开发能力,并且要有软件系统的架构能力,这种技术一旦做处理,就会成为某种意义上技术壁垒,比如和AI的结合,TensorFlow.js 增加了基于webassembly的backend能力,对Web + Media / AI来说,在技术沉淀上我们还有很多工作要做,一旦建立将极大提升产品的技术竞争力。
从这次优化来看,对于技术难度较大的功能,代码设计质量也将会影响产品功能质量,看着自己多年前写的代码,我也深有感悟和总结,我们要完全摒弃这样一种观点:代码是黑盒,只要测试通过,就可以上线,好的技术设计及高质量代码是好产品的扎实的基础,满足功能需求是代码质量的其中一个属性,对于重要的关键的功能,我们要重点关注,设计,架构,性能,稳定性,扩展性等,这样才能保证更好的可持续的迭代。