我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

小智音箱R818专用主控选型与音频链路调优实践

小智音箱R818专用主控选型与音频链路调优实践 “小智音箱”这个项目刚立项时团队里争论最久的不是外观ID也不是喇叭选型而是主控到底用什么。原因很实际智能音箱这种产品表面看是个会说话的喇叭骨子里却是一台常年通电、随时待命、还要在嘈杂环境里准确听清人话的嵌入式设备。通用型主控芯片什么都能干但真到了“七乘二十四小时待机、三米外唤醒、播放时还要同时听清指令”这种场景短板会一个接一个冒出来。后来我们把方案切到Allwinner R818这颗智能音箱专用主控上前后打了三版板子踩了不少坑也攒了一些能直接复用的经验。这篇就围绕小智音箱采用R818这件事把选型逻辑、硬件设计、音频链路、软件调优和现场排查完整拆一遍。不管你是刚接手音频类硬件的新人还是正在做方案对比的老手应该都能从里面找到能抄作业的部分。1. 专用主控到底解决了什么问题1.1 通用SoC做音箱的三笔隐性账很多人第一反应是随便找颗跑Linux的四核芯片不就行了反正都是ARM性能还更强。我一开始也这么想直到把第一版基于通用主控的样机做出来才发现账不是这么算的。通用芯片的设计目标通常是平板、盒子或者工控设备它的外设组合和功耗模型跟音箱完全不是一路的。最直接的问题是音频接口不够用一颗芯片往往只给一路立体声I2S和一路单端模拟输入而智能音箱要接四到六颗麦克风做阵列还要留一路参考信号给回声消除通用芯片根本喂不饱只能外挂音频Codec或者再加一颗音频DSP。外挂带来的第一笔账是物料成本。多一颗Codec、多一组LDO、多一条I2S走线、多一轮驱动调试单看每项都不贵加起来就是实打实的BOM上涨和PCB面积占用。第二笔账是功耗通用芯片为了跑应用处理器待机时也维持着较高的漏电和时钟树开销而音箱大部分时间处于“听着但不出声”的状态这部分浪费会被放大到整年电费里。第三笔账最容易被忽略——调试时间。通用芯片的音频子系统往往是“能用”级别时钟抖动、通道映射、采样率切换这些细节没有为远场语音优化过你得自己填坑填到最后发现省下的芯片钱全赔进人力了。R818这类专用主控的思路正好相反它把智能音箱真正需要的东西先塞进芯片里再谈性能。多路音频ADC直接挂在片内麦克风阵列不用外挂CodecWi-Fi和蓝牙集成在同一颗die上省掉一颗模块和一圈外围片内还带了一块专门处理语音前端的DSP唤醒词检测、回声消除、降噪这些活可以丢给它主CPU该睡就睡。这种“按场景裁剪”的设计才是专用主控真正的价值不是跑分高而是该省的环节全省了。1.2 R818的关键规格逐项拆解拿到R818的规格书之后我习惯把参数按“音箱实际会用到”和“大概率用不到”分成两栏。用得到的那一栏才是选型时真正要盯的。下面这张表是我们小智音箱最终锁定的配置也是我建议你在做同类方案时重点核对的项。项目小智音箱实际配置为什么这么选CPU四核Cortex-A53主频约1.2GHz跑Linux和语音服务够用功耗比高频方案低内存DDR3L 512MB语音系统不吃内存512MB留足余量又不浪费存储eMMC 8GB双分区OTA加日志、音效文件8GB是甜点音频输入片内多路ADC接4颗模拟MEMS麦克风省掉外挂Codec阵列走线更短音频输出片内DAC加一路I2S一路模拟给功放一路I2S留给数字功放备选无线片内双频Wi-Fi加蓝牙省模块天线设计和共存调试可控语音DSP片内音频DSP唤醒和前端算法卸载主核可深度休眠封装与温度BGA封装工业级温度范围长时间播放外壳内温升明显必须留余量这里有几个参数值得单独说。四核A53听起来不算强但智能音箱的负载曲线很特殊待机时几乎空载唤醒瞬间有一个短促的峰值播放时音频解码占用稳定但不重。真正吃算力的是云端交互时的网络加密和音频编解码四核足够而且低频运行带来的散热压力小得多。我试过把主频拉高跑唤醒响应确实快了十几毫秒但外壳温度上去了夏天长时间播放会触发降频反而得不偿失。内存选512MB也是同样逻辑。有人觉得现在动辄几个G512MB太小。但语音系统的常驻内存主要被内核、音频框架和唤醒引擎占着剩下给应用层的并不多512MB刚好卡在“够用且不浪费”的位置。存储选eMMC而不是SD卡是因为音箱经常被放在客厅、厨房这种振动和油污环境里SD卡的金手指可靠性撑不住长期读写eMMC焊死在板上更稳。1.3 什么场景该上专用主控什么场景不必不是所有会说话的设备都值得上R818这个级别的专用主控。我做过一个简单的判断表按产品形态和功能边界来分基本能覆盖八成情况。产品形态推荐方案理由带屏智能音箱、需要视频通话通用四核加外挂音频前端屏幕和摄像头占用大量接口专用主控的视频能力不是重点无屏远场语音音箱R818这类专用主控音频通道、唤醒功耗、无线集成三项全占优低成本语音玩具、指令词少于十条低端MCU加离线语音芯片不需要Linux成本敏感专用主控属于杀鸡用牛刀桌面语音助手、需要本地AI推理专用主控加内存升级本地模型吃内存需确认主控支持的最大容量判断的核心就一句话如果语音交互是产品的主功能而且要求远场、常开、低功耗那专用主控的溢价是值得的如果语音只是附属功能或者产品对成本敏感到几块钱都要抠那就老老实实走MCU路线别硬上。小智音箱的定位是客厅常开设备语音是唯一入口所以这个选择没有太多犹豫。2. 硬件落地从规格书到能稳定出声的板子2.1 电源树设计与上电时序电源是整块板子的地基地基没打好后面音频指标再怎么调都是白费。R818的电源需求比通用芯片碎得多核心电压、DDR电压、模拟电压、IO电压各走各的而且上电顺序有明确要求。我们第一版板子就是时序没排对表现是偶尔启动不了复位一次又能起来查了整整两天才发现是DDR电压比核心电压早爬升了。小智音箱最终用的是12V输入主要考虑功放需要更高的供电电压才能推出足够的功率。电源树大致分四路12V直供功放一路降压到5V给USB和外设5V再降压出3.3V、1.8V和1.1V核心电压用单独的一路降压芯片从12V直接转减少级联损耗。电流预算我是这么估的四核满载约1.5WDDR约0.4WWi-Fi峰值约0.8W音频ADC和DAC合计约0.3W加上外围和损耗主板总功耗按3.5W留余量折算到5V就是0.7A再考虑功放峰值和启动浪涌5V轨选了3A的器件12V输入选了2A以上的适配器。上电时序这块我的经验是别只看规格书里的顺序图一定要用示波器四通道同时抓核心电压、DDR电压、3.3V和复位信号。实测下来要求是3.3V先建立稳定后DDR电压跟上最后才是核心电压复位信号要在所有电源都进入窗口之后至少延时10毫秒。我们最后的做法是用一颗带使能延迟的电源管理芯片统一管时序再留一个RC延时给复位比纯靠分压电阻硬凑可靠得多。注意DDR电压的爬升斜率也要看太快会让芯片内部的初始化逻辑误判。我们实测把斜率控制在每毫秒0.3V左右最稳具体数值以你用的DDR颗粒手册为准。2.2 音频链路麦克风阵列、Codec与功放音频链路是智能音箱的命门这段设计不好后面算法再强也救不回来。小智音箱用的是四颗模拟MEMS麦克风排成环形阵列间距按波长算过要做远场拾音麦克风间距太密会导致空间分辨率不够太疏又会出现栅瓣。我们最终取的是相邻麦克风间距约4厘米对应人声主要频段的中高频既能分辨方向又不至于让阵列直径大到放不进外壳。麦克风的偏置电源是很容易翻车的地方。模拟MEMS麦克风对电源纹波极其敏感我见过不少板子直接用3.3V数字电源经电阻分压供电结果录音底噪里全是开关电源的谐波。小智音箱的做法是单独用一颗低噪声LDO给麦克风偏置每颗麦克风的偏置电阻单独走线在芯片端再并一颗小电容去耦。地线也要注意麦克风的接地要就近打到模拟地不能和功放的大电流地混在一起否则播放时的电流波动会直接串进录音通道。功放这块12V供电推8欧喇叭理论最大功率是电压平方除以两倍阻抗算下来约9W实际取7W左右留余量。选D类功放而不是AB类主要是效率考虑D类在播放音乐时的效率能到85%以上AB类只有五六成多出来的热量在密闭外壳里是实打实的负担。功放的输出LC滤波参数要跟喇叭阻抗匹配电感选大了高频衰减过头声音发闷选小了开关残余滤不干净会有高频噪声。我们最后用的是一只10微亨的电感和一只0.68微法的电容实测频响在20kHz处衰减约1dB听感比较自然。2.3 PCB布局、EMI与散热的三条硬规矩PCB这块我踩过的坑最多总结下来三条硬规矩。第一条DCDC的输入环路面积必须压到最小。开关电源的输入电容要贴着芯片引脚放环路面积越小辐射越低。小智音箱第二版板子就是把输入电容挪远了半厘米结果FM收音和Wi-Fi灵敏度都掉了几个dB后来把电容挪回去立刻恢复。第二条晶振和天线区域必须做净空。晶振下面不走任何信号线周围包地并打一圈地过孔天线区域所有层掏空外壳如果是金属的还要留出塑料窗口。第三条模拟地和数字地单点连接连接点选在芯片的模拟地引脚附近不要随便找个地方搭桥。散热方面R818的BGA封装热阻不算低我们实测播放音乐时芯片表面温度比环境高约四十度夏天密闭外壳里环境温度能到四十度结温就逼近上限了。解决办法不是加风扇音箱加风扇会有噪声而是把芯片背面的PCB铺铜加厚用过孔阵列把热量导到板子背面再通过导热硅胶垫贴到外壳的金属配重块上。这个改动让芯片表面温度降了将近十度成本只增加了一块硅胶垫。提示散热设计要在打板前就定别等样机烫手了再想办法。BGA焊盘下面的散热过孔如果没预留后期基本没法补。3. 软件与音频链路的工程化落地3.1 启动链路与分区规划R818跑的是Linux启动链路从片内固件开始经过引导程序、内核最后挂载根文件系统。这条链路看起来标准但音箱产品有几个特殊要求启动要快因为用户插电后希望尽快能用系统要抗断电因为音箱经常被直接拔插头升级要可靠不能升一半变砖。我们最后的分区方案是双系统分区加一个独立的数据分区升级时写备用分区写完后改启动标志失败了还能回滚到旧分区。根文件系统挂载为只读运行时的日志和配置写到数据分区这样即使异常断电也不容易把系统写坏。启动时间我们抠到了八秒左右从通电到能响应唤醒。主要耗时在内核初始化和音频子系统的探测优化手段是把不必要的驱动裁掉音频相关的驱动编译进内核而不是做成模块减少用户态加载时间。还有一个小技巧是把唤醒引擎的模型文件放在独立的只读分区启动时用内存映射的方式加载比从文件系统读进内存快不少。3.2 唤醒词与回声消除的落地细节唤醒和回声消除是智能音箱最考验功力的部分。唤醒引擎我们放在片内DSP上跑主CPU在待机时进入低功耗状态DSP一直监听麦克风数据。这样做的原因是主CPU跑唤醒模型功耗太高常开不现实。DSP的算力有限模型必须裁剪我们的做法是把唤醒词模型量化到定点参数量控制在几十KB级别牺牲一点唤醒率换功耗实测下来安静环境五米内唤醒率仍在九成五以上。回声消除的难点在参考信号的对齐。音箱播放音乐时麦克风会同时收到喇叭的声音和人声AEC需要一路参考信号把喇叭声音减掉。这路参考信号如果和实际播放的音频有时延减不干净残留就会被误认为人声导致播放时频繁误唤醒。我们实测发现从I2S发出到喇叭实际出声中间有功放和LC滤波带来的群延迟大约在几百微秒量级这个延迟必须在软件里补偿掉。调试方法很简单播放一段扫频信号同时录麦克风信号用互相关算出延迟填进AEC的参数里反复几次就能对齐。降噪和自动增益也要调。降噪开太猛会把人声的高频削掉导致云端识别率下降自动增益太激进会把底噪一起放大。我的经验是降噪强度按场景分档安静环境轻一点嘈杂环境重一点切换依据是麦克风收到的信噪比估计值。自动增益的目标电平不要定得太高留6dB左右的余量给突发大声留空间。3.3 音频延迟预算与缓冲区计算语音交互的延迟是用户能直接感知的从说完话到音箱回应超过两秒就会觉得卡。我们把整条链路的延迟拆开算过麦克风采集加DSP前端处理约30毫秒唤醒检测约300毫秒云端识别和语义处理约500毫秒语音合成返回加播放启动约300毫秒加起来一秒出头实际体感可以接受。缓冲区大小直接影响延迟和稳定性。以16kHz、16位、单声道为例20毫秒一帧就是320个采样点共640字节。缓冲区设太小会频繁中断CPU开销大还容易丢帧设太大延迟高。我们最后把ALSA的周期设成两帧总缓冲四帧也就是80毫秒的缓冲深度既能扛住偶发的调度抖动又不会让延迟明显增加。这个参数不是拍脑袋定的是拿示波器测了播放启动到喇叭出声的实际时间再结合长时间播放的丢帧统计调出来的。注意缓冲区参数跟具体的音频框架和驱动实现有关换平台要重新测别直接照搬。4. 实测数据与调优记录4.1 功耗与发热的实测账功耗这块我做了四组实测环境温度25度外壳合盖结果如下。状态整机功耗芯片表面温度备注待机监听约1.2W约38度主核休眠DSP监听唤醒响应瞬间峰值约2.8W约42度持续不到一秒音乐播放中等音量约3.5W约55度功放占大头音乐播放最大音量约7W约63度接近外壳材料上限从数据能看出来待机功耗控制得不错这是专用主控加DSP卸载的直接收益。发热的主要来源不是主控而是功放所以散热设计的重点要放在功放和外壳的热耦合上而不是一味给主控加散热片。我们后来把功放的散热焊盘面积加大并把外壳的金属网罩和内部支架连起来最大音量下的芯片温度降了约五度。4.2 唤醒率与误唤醒的现场调优唤醒测试我们按距离和噪声两个维度做了矩阵每个点测一百次。安静环境下一米到五米的唤醒率从九十九降到九十五五米以外掉得比较快这跟麦克风阵列的孔径和外壳开孔有关。六十五分贝的白噪声下三米内唤醒率还能保持在九成以上再远就不稳定了。误唤醒方面连续播放音乐二十四小时误触发控制在一次以内主要靠AEC把喇叭声音减干净。调优过程中有个反直觉的发现麦克风灵敏度一致性比绝对灵敏度更重要。四颗麦克风如果灵敏度差超过2dB阵列的波束成形效果会明显变差远处唤醒率掉得厉害。我们后来要求供应商按±1dB配对供货成本涨了一点但唤醒率稳定了很多。另外外壳的麦克风开孔也很关键孔径太小会形成亥姆霍兹共振特定频段被削弱开孔太大又容易进灰最后选的是直径1.5毫米的孔加防尘网。4.3 音频指标的测量方法音频指标不能只靠耳朵听得有数据。频响我们是用扫频信号加标准麦克风在消声环境里测的看200Hz到8kHz的平坦度偏差控制在正负3dB以内。总谐波失真在额定功率下测做到百分之一以下。底噪是在安静房间关掉一切声源录三十秒算有效值目标是低于35dB声压级实际测下来在32dB左右。主观听感也要有但方法要对。我们找了几个同事做盲听对比小智音箱和两台参考产品曲目固定几首人声和器乐。盲听结果跟客观数据基本对得上唯一的分歧在低频数据上小智音箱的低频下潜不如参考产品但盲听时反而有人觉得更干净。后来分析是低频量少但失真低听感上不浑。这也说明指标和听感要结合看不能唯数据论。5. 常见问题与排查速查5.1 硬件类问题与处理思路现象可能原因排查动作上电不启动复位后偶尔能起上电时序不对或DDR电压爬升异常四通道示波器抓时序核对规格书窗口播放有“嘀嘀”高频声DCDC开关频率落入音频带或布局耦合改开关频率检查电感屏蔽和地平面录音底噪大麦克风偏置电源纹波大地环路换低噪声LDO检查模拟地单点连接播放爆音功放使能时序与DAC上电不同步调整使能延时加静音控制Wi-Fi频繁断连天线净空不足或电源跌落检查天线区域掏空测峰值电流下的电压硬件问题里最常见的是上电和音频耦合两类。上电问题一定要用示波器看万用表看不出来。音频耦合问题则要区分是传导还是辐射判断方法是把功放静音如果噪声还在多半是电源或地的问题如果静音后消失那就是功放或布局耦合。5.2 软件与音频类问题实录软件侧最典型的问题是唤醒不灵和播放时误唤醒。唤醒不灵的排查顺序是先确认麦克风数据有没有正常进DSP再确认唤醒模型有没有加载成功最后看AEC有没有把有效人声也减掉。播放时误唤醒则几乎都是参考信号延迟没对齐按前面说的方法重新标定就能解决。还有一个隐蔽的问题是采样率切换导致的爆音。系统提示音用48kHz唤醒监听用16kHz切换时如果没做好淡入淡出会有轻微的咔哒声。解决办法是在切换前后加几毫秒的静音过渡或者统一用同一采样率再做重采样。5.3 量产测试与一致性控制样机能跑通不代表量产能过。我们定的产线测试项包括电源各路电压和纹波、待机电流、麦克风通道逐一录音比对灵敏度、喇叭扫频听是否有异响、Wi-Fi发射功率和接收灵敏度、整机唤醒测试。其中麦克风一致性测试最花时间做法是固定声源放一段粉噪四通道同时录算每通道的增益差超过2dB就判不合格。烧录和校准也要做防呆。每台机器的Wi-Fi校准参数和麦克风增益补偿值都不同这些数据要写进独立分区并做校验写失败要能重试。产线工装我们用的是夹具加自动测试脚本测试结果直接上传避免人工记录出错。这套流程跑下来批量一致性比手调样机稳定得多。最后分享一个我在这个项目里体会最深的小经验专用主控的优势不是纸面参数堆出来的而是把“常开监听、音频前端、无线连接”这三件事在芯片层面就捏合好了你省下的不只是物料更是反复调试音频链路的时间。但前提是你得把电源时序、麦克风一致性、参考信号对齐这几个基本功做扎实否则再专用的芯片也救不回一个底噪超标、唤醒迟钝的产品。小智音箱走到量产这版真正花时间的从来不是写代码而是拿示波器和声级计一遍遍量出来的那些数字。
返回列表