把背景音变成习得场:做一款电台学习器的四个工程切口
网络电台很容易做成一个好看却留不住人的播放器。复盘 PodDuck 如何在全球电台流之上叠加语境查词、发音兜底与调音,把被动收听变成边听边学。

「网络电台」是一个很容易让人产生开发冲动、又很难做出差异的品类。
接入开放的电台源、放进一个播放器、套上深色卡片界面,在今天的 vibe coding 流程里并不费事。但接进全球数万个电台之后,一个产品事实很快浮现:电台天然是背景音。用户打开它,往往只是为了工作时不那么安静,随时会走。
做 PodDuck 时,我把问题从「做一个漂亮的播放器」改成了:怎样让正在播放的声音,变成可以学习的语言材料?
围绕「边听边学」这个支点,有四个工程切口值得记录。
01 / 直播流没有精确时间轴,就别假装有
播客和音乐播放器有确定的播放进度,歌词可以逐行滚动。网络电台是持续的直播流,当前曲目信息常常比声音慢上几秒。
如果照搬卡拉 OK 式的逐行高亮,错位会比没有歌词更让人难受。我的做法是:
- 切歌时更新当前曲目和歌词,不强行追逐毫秒级同步;
- 「点词学习」作为独立入口,不打断播放;
- 在界面上直接写明「可能有几秒偏差」,以及「电台无法提供歌曲进度」——把协议的限制讲清楚,而不是掩盖它。
02 / 查词要带上那一句话
语言工具最让人泄气的,是查一个词得到十几种释义,却不知道此刻用的是哪一个。
所以在 PodDuck 里点一个词时,发出去的不只是这个词,还有它所在的那句歌词:
interface ContextualLookup {
word: string;
contextSentence: string; // 当前这句歌词
targetLanguage: string; // 英、日、韩、法、德、西、意、葡、俄等
}
给模型的要求很简单:先解释这个词在这句话里是什么意思,再补充搭配和用法,最后返回结构固定的结果,方便直接加入生词本。
查词使用的模型可以由用户自己配置,因此错误提示也要说人话:额度不足、请求太频繁、模型没返回有效结果,各自给出能操作的下一步。
03 / 发音要有退路
查完词,听一遍发音才算闭环。但云端语音会遇到限流、超时或暂时不可用。
PodDuck 的朗读分两条路:
- 先用云端语音,发音更自然;
- 失败时自动改用浏览器自带的系统语音,并提示「已改用系统语音」;
- 如果设备没装对应语言的语音,就提示用户去系统设置里添加,而不是静默失败。
浏览器拦截自动播放时,也只提示「请再点一次朗读」。学习功能的可靠性,很大程度上取决于这些失败路径有没有被认真处理。
04 / 让它配得上常驻屏幕
一个想被长期打开的音频工具,播放之外还有几件基础功:
- 均衡器:平直、低音增强、高音增强、人声、流行、摇滚几种预设,新闻谈话和音乐各取所需;
- 系统媒体控制:把电台名称和当前曲目同步到锁屏与控制中心,可以用耳机暂停;
- 可安装到桌面:以独立应用的方式打开,适配全面屏的安全区域;
- 闹钟与节目单:按工作日或周末定时响起,查看当天的节目安排。
写在最后
用 vibe coding 推进产品时,最容易做的是不断堆功能:再加一个分类,再加一个收藏。
PodDuck 给我的提醒是:老品类的新意,常常来自把一个高频的日常场景,和一个更有价值的需求咬合在一起。当电台里的每一句歌词都能被点开、被解释、被存下来,它才有了被长期留在屏幕上的理由。