国庆三天,我窝在工位上干了一件被朋友说是“脱裤子放屁”的事:花199块钱做了一块开源AI录音卡。用起来是这样的:开会的时候把它往桌上一放,按一下录音键,散会拔下来插到电脑上,本地跑一段FunASR离线语音转写,整场对话就变成带说话人标签的文字稿,再让DeepSeek把重点提炼成一张思维导图。算上自带的18650电池,这块卡能连续录20小时。
先给不了解的朋友说清楚这到底是什么:它不是一个手机App,也不是云录音服务,而是一个巴掌大的硬件模块。核心是一块ESP32-S3主控加一块数字麦克风,固件和上位机脚本全部开源。适合谁?爱折腾的嵌入式玩家、靠大量会议和访谈吃饭的职场人、想做课程记录的老师,甚至只是想给家里老人做录音提醒工具的人,都能从这个项目里找到能抄的作业。
1. 项目定位与需求拆解
1.1 这个需求是怎么冒出来的
最开始是因为我手头每周至少三场技术评审会,每场一两个小时。翻聊天记录翻不到重点,逐字听录音又太费时间。用市面上的智能录音笔吧,好一点的起步六七百,功能还绑死在一个App里。用手机录音确实免费,但接个电话、切个后台,录音就可能断,而且手机党开会时容易把录音这事抛到脑后。
所以我想要的其实是这样一个东西:像一个U盘一样小,塞口袋里不占地方,按下就录,坏了不心疼,录完能快速转成文字。它不需要屏幕,不需要触摸键盘,不需要语音助手,只做好“长时间可靠录音”这一件事,剩下的交给电脑端的软件处理。
1.2 成品形态与使用流程
做出来的成品是一块U盘形状的录音卡,整体尺寸大概跟一只普通U盘差不多,一侧留了一个按钮和一个指示灯,另一侧是USB接口和TF卡槽。
使用流程也很直白:
- 长按开机,绿灯常亮表示待机。
- 短按一下,红灯慢闪开始录音,同时把音频实时写入TF卡。
- 再短按一下停止录音,生成一个WAV文件。
- 拔下来插到电脑上,运行WorkBuddy的桌面端脚本。
- 脚本自动检测TF卡里新产生的音频文件,依次完成语音转写、说话人分离、要点提取和思维导图生成。
- 最终产出一份Markdown格式的会议纪要加一张思维导图。
整个过程不需要打开浏览器,不需要登录云平台,不需要上传音频。转写引擎是本地的,麦克风采集是本地的,存储也是本地的。只有最后生成思维导图那一步会调用大模型接口,而且这个接口也可以配置成本地模型。后面我会细说。
1.3 为什么是“录音卡”而不是录音笔
市面上现成的录音笔方案很多,但大部分架构是封闭的:音频格式私有、固件不能改、语音转写按分钟收费、电池续航号称很久但实际一录就掉电。我的诉求恰恰相反:所有数据要掌握在自己手里,所有软件能力要能随时替换。
自己做录音卡还有一个隐形好处:可维修、可扩展。今天用这块卡录会议,明天改一下麦克风阵列就能做声源定位,后天加一块DSP模块就能做关键词唤醒。这种自由度是任何成品录音笔都给不了的。199元的成本,损失最大的无非是几顿饭钱,换来的却是一个能不断折腾的基础设施。
2. 硬件选型与成本拆解
2.1 核心硬件清单
先列我实际用到的物料,全部从常见电商渠道能买到,没有冷门型号:
| 部件 | 型号/规格 | 参考价 | 作用 |
|---|---|---|---|
| 主控核心板 | ESP32-S3-DevKitC-1,8MB Flash | 38元 | 音频采集、按键控制、TF卡写入 |
| 数字麦克风 | INMP441,I2S接口MEMS硅麦 | 12元 | 拾音,自带24bit ADC |
| 电池 | 18650电芯,3400mAh | 18元 | 整机供电,续航关键 |
| 充电/升压模块 | TP4056充电板 + 3.7V升压5V | 8元 | 电池充电、稳压输出 |
| 存储 | 32GB MicroSD卡 | 18元 | 存放PCM/WAV音频文件 |
| TF卡座模块 | MicroSD卡读写模块 | 6元 | 卡座转接,方便替换 |
| 外壳与辅料 | 3D打印外壳、按钮、导线、拨动开关 | 40元 | 固定结构、开关机控制 |
| 其他 | 铜柱、螺丝、热缩管、胶带 | 10元 | 组装固定 |
合计大概是150到160元之间,如果手头有旧电池或者旧SD卡,100出头就能落地。我还留了40块的“余量”用来买烧坏的模块和备用麦克风,所以999标题里的199元是真实够用的预算。
2.2 每笔钱花得值不值
有人会问,既然是录音卡,能不能直接用带录音功能的开发板?能,但效果差别很大。ESP32-S3本身没有模拟音频输入接口,必须通过I2S接口外接数字麦克风,所以买一个集成了I2S输入引脚的配套开发板是省事的,但这些板子普遍会贵一些。
我的方案是拆开买的,核心板选ESP32-S3-DevKitC-1,它的UART转USB芯片还可以在断电后给上位机做通讯,调试很方便。INMP441这颗麦克风只要12块钱,却是整个项目里最关键的部件之一。它把模拟信号转换成数字信号输直接在芯片内部完成,抗干扰能力比驻极体麦克风强很多,不容易被主板上的数字电路噪声干扰。
电池和充电模块这部分,我给两个建议。第一,18650尽量买带保护板的品牌电芯,别贪便宜买无标电池,之前某次我图便宜买回来一颗漏液电池,把一块开发板腐蚀报废了。第二,TP4056充电板有Type-C口,可以直接用手机充电器充电,省掉买专门充电座的开销。
2.3 组装顺序与注意事项
组装顺序其实很简单,但有几处细节会影响后面调试效率:
第一步,先把核心板刷一个最简单的Blink程序,确认板子本身是好的。第二步,把INMP441的I2S引脚依次接到核心板的GPIO,这里有一个必须避开的坑:ESP32-S3的某些IO在启动时处于特殊状态,不能接麦克风的数据线,否则会导致无法烧录固件。所以我选了GPIO15作为DAT口,GPIO5作为BCLK,GPIO16作为LRCLK,避开启动敏感引脚。
第三步,焊接电池和充电模块。TP4056模块的OUT正负极接核心板5V和GND,电池插到BAT端。这部分要注意共地,如果不共地,麦克风与主控之间的I2S信号会乱掉。第四步,把TF卡座模块接上SPI引脚,插一张格式化好的TF卡。第五步,装进外壳、固定电池,通电测试。
整个过程最花时间的其实不是焊接,而是把线理顺。ESP32-S3的排针间距是2.54mm标准间距,但直接把杜邦线插入到底板上会显得乱,我建议先用热缩管把每一组线束套起来,再用电工胶带固定到外壳内侧。别小看这一步,它是整机稳定性的基础。
3. 软件架构:离线转写与AI能力怎么落地
3.1 录音端固件的职责划分
录音端固件只做三件事:管理按键、读取麦克风数据、写入TF卡。不要试图把转写放到录音卡上跑,一块主频240MHz的双核MCU,跑实时转写模型是跑不动的,硬跑的结果就是录音卡发烫、续航暴跌,体验一塌糊涂。
我的设计思路是“采集端尽量笨,处理端尽量聪明”。录音端只负责把INMP441采集到的PCM数据,加上一个44字节的WAV文件头,以64kbps的采样率、16bit单声道写入TF卡。64kbps这个采样率对语音来说够用,11kHz以上的人声范围都能覆盖,而且每秒只占不到8KB存储空间,32GB的卡能录很久很久。
有人可能会问,为什么不用更低的采样率省空间?我实测过,低于24kHz后,一些齿音和唇齿音会被吃掉,后续转写的准确率会明显下降。64kbps是平衡存储消耗和识别准确率的一个甜点值。固件的主要难点在于:录音的同时要把数据及时写入TF卡,不能等录音结束再统一写。我用了RTOS下的一个后台任务,配合DMA缓冲,实测下来就算一边录音一边高负载写入,也不会出现掉帧。
3.2 离线语音转写怎么实现
转写这边,我采用的方案是FunASR推理框架加Paraformer模型。这里要解释一下,FunASR是阿里开源的一个语音识别工具包,它在底层封装了各种ASR模型,方便我们拿Python直接调用。Paraformer则是它主打的一个高精度离线语音识别模型,在中文日常对话场景下,字错误率能控制在5%到10%以内,具体取决于录音环境和口音。
离线转写意味着音频文件不用上传到公网,全部在本地电脑上推理。我的电脑是一台不算新的笔记本,只有CPU,没有独立显卡。跑Paraformer-large模型,一小时的音频大概需要三到五分钟才能转完,速度完全可以接受。识别过程中我用的是ONNX Runtime加速,让模型推理效率更高一些。
FunASR的使用流程很简单:先加载模型,然后调用推理接口,传入音频路径,返回文本和时间戳。真正要处理的是音频格式兼容。FunASR内部能处理WAV,但如果你用了别的录音工具生成了MP3或者M4A,就得先用ffmpeg转成16k采样率的单声道PCM。这是一个新手经常踩的坑。
3.3 50+语种怎么支持
很多人看到标题里的“50+语种”会觉得不可思议,其实原理不复杂:阿里系模型里有一个叫SenseVoice的多语言语音识别模型,它支持超过50种语言的语音识别,包括中文、粤语、英文、日语、韩语、法语、德语、西班牙语、俄语、阿拉伯语等。
它的核心思路和多语言大模型类似:把多种语言的语料混合训练,让模型在同一个特征空间里理解不同语言。好处是,不需要针对每种语言单独部署一个模型,一个模型就能同时搞定50多种语言;坏处是,个别生僻语种的准确率肯定不如专门训练的小语种模型高。但对我们这种做通用录音工具的场景,一个模型覆盖绝大多数情况已经很够用了。
我在WorkBuddy脚本里加了一个语言检测逻辑:先快速判断音频里最可能的语言类型,如果是中文,就用Paraformer做精细转写;如果是其他语言,自动切到SenseVoice处理。这个切换是自动的,不需要用户在界面上手动选择。实际测下来,中英混说的对话,也能在中文段落里正确输出中文,英文段落里输出英文。
3.4 多人识别和说话人分离
“多人识别”在学术上通常叫说话人分离,也就是分辨声音来自哪个人。实现思路分两步:先把音频切成一小段一小段,每段大概两三秒;接着提取每一段的声纹特征,也就是说话人独特的音色指纹;最后把这些声纹聚类,相同音色的段落归到同一个人。
在FunASR里,这个过程可以用声纹模型加聚类算法完成。实测在双人对话场景下,准确率比较高;三人以上、环境嘈杂的时候,误判会多一些。但作为会议纪要的辅助工具,把“某一段话大致是哪个人说的”标出来,已经能省去大量人工回顾的时间。我在项目里还给每段话加了一个虚拟标签,比如“说话人A”“说话人B”,用户可以在生成的Markdown里手工替换成人名。
3.5 用DeepSeek生成思维导图
转写完成之后,WorkBuddy脚本会把全文发送给DeepSeek大模型,让它做三件事:提炼核心议题、整理关键结论、抽取待办事项。然后再把结果输出成Markdown版的思维导图。
这里有一个容易被忽略的设计决策:为什么不是让大模型直接输出思维导图文件?因为直接输出纯Markdown的列表结构,既方便在文档里阅读,也方便在支持导入的工具里渲染成思维导图。我会让DeepSeek固定输出三到四层的树状结构,每层用Markdown列表嵌套。这样的好处是,用户可以直接把文本贴到Notion、Obsidian等工具里,也可以用我脚本里的一个小函数,把它转换成XMind兼容的格式。
调用DeepSeek的时候我设置了两个关键参数:温度设为0.3,避免生成内容太发散;最大输出token设得足够大,防止思维导图被截断。如果机器上没有外网,或者出于隐私考虑不想调用云端模型,WorkBuddy也支持切换到本地部署的OpenAI兼容接口,只需要改一行配置。
4. 三天搭建全过程记录
4.1 Day1:硬件调试与音频采集
第一天上午几乎都在跟接线较劲。上午把各模块接好之后,烧了一个最简单的录音测试固件,发现读到的音频数据全是“嗡嗡嗡”的底噪,拿示波器看了一下,I2S信号线被周围电源线干扰得厉害。后来把麦克风信号线从主板的左侧挪到右侧,避开充电模块的升压电感,噪声才降下来。
下午换了一种验证方式:把录制的声音直接通过串口发到电脑上,用Audacity打开。这时候才真正感受到INMP441的效果,会议室环境里,一米外正常说话也能清晰拾音。不过我也发现了另一个问题:开发板自带的USB口在录音时会传出高频啸叫,原因是USB转串口芯片的时钟信号串进了I2S总线。解决方法是,录音时把USB线拔掉,用电池供电,问题立刻消失。
第一天的教训是:硬件调试不能只靠耳朵听,最好用波形软件看看频谱和波形,这样排查噪声快得多。我用的是Audacity的频谱分析功能,很容易看出50Hz工频干扰、1kHz以上数字噪声这些典型问题。
4.2 Day2:转写流水线跑通
第二天早上,我先把音频文件拷到电脑上,写了一个最简单的Python脚本:调用FunASR的现成接口转写测试音频。第一次跑,脚本卡在依赖安装上,balと言うPython包版本对不上,我花了一个小时排查,最后强制重装所有依赖才解决。
转写效果比我预期好,十分钟的中文会议录音,输出文字几乎不用改。但这天真正花时间的,是处理英文和中文混说的情况。FunASR的Paraformer中文模型很出色,但在整段英文上会直接乱码。我那天下午的精力几乎都花在语言检测模型上。我用了一个轻量级的语言分类器,对音频每隔3秒做一次预测,然后根据预测结果决定该片段交给哪个模型。这种分块处理的方式,在实际录音里表现很稳。
当天晚上,我把转写脚本封装成了WorkBuddy桌面端可执行文件,加入了文件拖拽入口。拖一个WAV文件进去,三分钟之后就能拿到带时间戳的转写结果。那种把一个想法变成工具的感觉,是很让人上头的。
4.3 Day3:多人识别、思维导图与整体打磨
第三天上午,开始调说话人分离。FunASR生态里最省事的办法是直接调用声纹模型,把整段音频分块,提取特征,聚类。一开始我以为要写很多聚类代码,后来发现直接用Spectral Clustering就能得到还算不错的分组效果。我跑了一段四人的模拟对话测试,结果是四个标签基本对应到四个人,个别段落会混淆。
下午转向思维导图功能。这一步在技术实现上反而最简单,把转写全文拼接成Prompt,扔给DeepSeek,解析返回的Markdown列表,输出成思维导图Markdown文件。为了让生成的思维导图更贴合会议场景,我要求它的第一层必须覆盖“背景、结论、待办、风险”四类,第二层再细分成具体要点,这样就比自由发挥要可靠得多。
第三天晚上,剩下的事情就是给整机做了整整三个小时的重度测试:连续录音、频繁插拔、把TF卡塞到读卡器里拷文件。最终版本跑了一个通宵,第二天早上检查电量还有一半,续航20小时的目标算是达成了。测试过程中也发现了一个隐藏在SD卡写入里的bug:长文件名会出现写入失败,把文件名改成短命名规则后就稳定了。
4.4 最终效果展示
讲几个实际体验过的场景,让大家有个更直观的感受。
第一场是线上团队周会,我把它插在电脑旁,录了两小时。转写后生成了三层结构的思维导图,第一层把“项目进度、技术方案、遗留问题、下周计划”四大块分好,第二层自动把每个人汇报的要点归类到位,第三层是具体的待办事项。我用的时候基本不用再回去翻录音。
第二场是线下头脑风暴,三四个人轮流讲话,偶有插话和抢话。说话人分离在这种场景里确实有混淆,同一个人的两段话被分成了两个标签。但让我意外的是,摘要里“待办事项”的提炼非常准,比我手动记的笔记还要全。
第三场是用SenseVoice转一段英文播客,虽然有些口语句子被识别得支离破碎,但依靠上下文仍然能理解大致意思。将来如果出差去不同语言环境,这块卡能当翻译素材采集器使。
5. 常见问题与排查技巧
5.1 硬件层面的问题
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 录音有持续电流声 | 电源共地不良,或数字信号线干扰 | 确保电池负极和核心板GND可靠相连,避开升压电感走线 |
| 按键无反应 | 没有配置输入上拉 | 在固件里开启GPIO内部上拉,或外接10k上拉电阻 |
| 录音文件打不开 | WAV头没写完整,或TF卡速度不够 | 录音结束前flush文件,并关闭写入缓存;换高速Class10 TF卡 |
| 插USB后板子不识别 | 某个IO被占用导致启动异常 | 检查是否用了启动引脚接外设,复位后重新拔插 |
| 电池电量显示不准 | 没有接电量计芯片 | 用电压区间估算,或加一个MAX17048方案 |
5.2 续航达不到20小时怎么办
我最初测试时续航只有7小时,排查后发现好几个原因在“偷偷耗电”。
第一是开发板自带的USB转串口芯片和稳压芯片一直在耗电,即使外设都睡着了,这些芯片依然在跑。解决的办法是,烧录完固件之后换一颗低压降的LDO,或者干脆把板子上的待机路径改一下,让板子进入Deep Sleep时关掉所有非必要外设。第二是麦克风本身也耗电,INMP441在录音模式下功耗接近1mA,虽然不高,但乘以20小时就不少了。所以在不录音时,我让固件直接断电麦克风。第三是TF卡在空闲时会保持活跃,需要在每次写入后立即进入休眠状态。
这些改动做完,整机的平均待机电流从原来的90mA降到了45mA。用3400mAh的18650电池,理论续航72小时,但录音状态电流会升到120mA左右,所以实际算下来,连续录音大概是20到25小时。计算公式很简单:电池容量除以平均录音电流,再打一个八折的工程余量,也就是3400毫安时除以120毫安乘0.8约等于22小时。
5.3 转写准确率怎么优化
确保音频质量。距离麦克风太远是准确率下降最主要的原因,尽量控制在1.5米以内。过度压缩的动态范围也有影响,所以录音端不要做自动增益。
善用热词表。FunASR支持在解码时增加热词,把会议中常见的专有名词、人名、产品名加进去,能大幅降低这类词被识别错的情况。我在WorkBuddy里加了一个可编辑的热词文件,每次开会前可以快速刷新补充。
自动标点现在已经很成熟,偶尔会逗号乱飞,但整体不影响阅读。遇到特定的行业术语,比如“微服务”被识别成“危服务”,最有效的办法不是改模型,而是修改热词表,把“微服务”作为一个完整的词条加入。
5.4 多人识别串话怎么解决
说话人分离在两人,尤其是两人分别坐在不同方位时效果最好。如果多人挤在一台设备旁边,麦克风采集到的其实是混叠声,声纹聚类的难度会大很多。
一个有用的技巧是:把每个说话人作为独立声源,先做一轮VAD(语音活动检测),再按停顿切分。只要切分准确,声纹提取的质量就会上去。实测中我发现,按停顿切分比按固定片段切分更能提高聚类的准确率。
如果现场确实很嘈杂,那可以把说话人分离作为可选功能关掉,只保留转写。因为一旦分离错误,生成的标签反而会误导读者。这种情况下的核心需求其实是“谁在什么时候大概说了什么”,而不是“每一句话到底是谁说的”。
5.5 思维导图内容跑偏怎么处理
调用大模型生成摘要,偶尔会遇到“写得太空”的情况。我的经验是,在Prompt里把要求写具体,甚至连格式都约束好。比如我要求必须输出四段结构,第一段必须用“核心议题”,第二段必须用“关键结论”开头。这比只用“请生成会议纪要”要稳定得多。
另一个技巧是,给模型提供转写文本之前,先做一个简单的后处理:去掉语气词和重复词,压缩过长的段落。这样模型能看到的信息量更大,也更接近人类的阅读顺序。实测中,处理过的文本生成的思维导图,在信息密度上明显比原始文本生成的更集中。
6. 我个人还想啰嗦几句
6.1 开源项目怎么选型更省心
做这类硬件加AI的项目,最忌一上来就自己造轮子。直接用FunASR、SenseVoice这种成熟方案,能省掉大量训练和调参的时间。开源社区的好处是,遇到模型加载报错、依赖冲突、C++扩展编译失败这类问题时,很容易找到解决方案。
我的基本原则是:能直接用官方接口的就不自己写;能跑通用模型的就不自己造数据集;能复用的开源工具库就不重新实现。WorkBuddy本身也延续了这个想法,它只是把录音、转写、摘要、思维导图这些能力粘合起来,真正的核心模型都留给各个专注做这块的团队。
6.2 后续还能怎么扩展
完成这个版本之后,我列了几个想继续做深的方向:
第一个是给录音卡加一块小屏幕,显示剩余电量、录音时长和文件数量。这需要加一个OLED模块,成本也就十几块。
第二个是把WorkBuddy做成常驻后台的监听服务,只要检测到TF卡插到电脑上,就自动开始转写,不需要手动拖文件。
第三个是在Ros近年把说话人识别做成可训练的,让用户给每个标签录入几句参考语音,从而实现更精准的“谁是谁”映射。
第四个是为这个项目写一个配套的Markdown模板,让生成的会议纪要可以直接放进项目管理系统。这些扩展基本上都是在现有架构上做加法,我不打算推翻重写,因为当前这版已经足够好用,也够稳定了。
6.3 给新手的最后建议
如果你从来没接触过嵌入式开发,第一次尝试这个项目,我建议你找个周末先照着最简版做一遍,不要追求所有功能一次性到位。第一版可以只做录音和转写,跳过说话人分离和思维导图。等跑通之后,再逐个功能往上加。
材料不要一次买齐,先买核心板和麦克风,烧录点灯程序成功之后再买电池和TF卡模块。这样即使某个环节踩坑报废了,损失也能控制在几十块以内。我最初也想一次搞个大满配,后来发现一个功能一个功能地加,反而更容易定位问题。
最后再分享一个我自己最意外的体会:这个项目的价值并不只在于“省下买录音笔的钱”,而在于它让我重新理解了录音和整理这件事。以前开会之后总要花半小时翻录音补笔记,现在录完生成一张思维导图就够了。真正被释放出来的不是那半小时,而是我对“音频也是一种可整理的数据”这件事的重新认识。