有几份已经生成好的长文音频,接下来怎么听?逐个打开网页可以,但节目一多,就开始在标签页里找文件。另一种做法是给这些公开音频配一份RSS,让支持订阅的播放器自己读取列表。
我把五份中文学习、历史和读书音频整理成了一个可公开访问的Feed。音频没有重新生成,只增加了节目列表和中文关注说明。这里记录的是实际完成的制作和HTTP核验;还没有在iPhone客户端做订阅测试,也没有提交Apple播客目录。
我是「自听」MyListen开发者Ryan Zhu,本文及代码由AI辅助整理。音频由AI合成,在Mac使用归档模型生成,非当前iPhone录音。示范音频、文稿和代码均可独立使用,不要求购买App。
一个节目,首先是几份稳定的文件
这次用的素材已经各自有完整页面:历法9分13秒、SQL左连接7分51秒、铁路时间8分05秒、平均数与中位数8分17秒,以及《弗兰肯斯坦》解读6分30秒。
每期都有完整MP3;文稿、资料来源与可复制听稿请求放在对应页面。RSS只是把这些已有文件组织起来,不会自动核查AI生成的内容,也不会自动把音频变得正确。
公开订阅说明:https://godgod126.github.io/listening-script-kit/podcast/
RSS地址:https://godgod126.github.io/listening-script-kit/podcast/feed.xml
这个Feed目前只有五期,不承诺更新频率。订阅日期表示首次加入本Feed,不把旧音轨写成今天新制作的节目。
RSS不上传声音,它告诉播放器去哪里取
RSS2.0的channel描述整个节目,每个item描述一期。最关键的附件信息在enclosure里。
以下是这次SQL单集的实际文件数据,省略了简介和部分播客扩展标签:
<item><title>左连接为什么丢掉一个人?</title><link>https://godgod126.github.io/listening-script-kit/learning/sql-left-join/</link><guidisPermaLink="false">https://godgod126.github.io/listening-script-kit/podcast/episode/sql-left-join</guid><enclosureurl="https://godgod126.github.io/listening-script-kit/learning/sql-left-join/sql-left-join-zh.mp3"length="4227295"type="audio/mpeg"/></item>这里有三个容易填错的字段。
url必须指向实际音频文件,不能指向播放器页面。length是文件字节数,不是音频秒数;这份MP3是4,227,295字节,实测时长470.94秒。type描述媒体类型,这里是audio/mpeg。
GUID是播放器辨认“这是不是同一期”的标识。改标题、改说明时,不应随手给原单集换一个GUID。这个例子把GUID当稳定标识,并明确isPermaLink为false,不把它假装成可访问的节目页面。
每期音频URL也要唯一。Apple官方规范明确提到,不同单集使用重复附件URL可能被忽略。当前示范的五个GUID和五个附件URL都不同。
把资料表作为源文件
我没有每次手改XML。podcast/catalog.json记录标题、文件名、字节数、时长、简介与首次加入Feed的时间;tools/build-podcast.py从这张资料表生成RSS和中文说明页。
在完整仓库根目录运行:
py-3 tools/build-podcast.py生成器只用Python标准库,不调用AI、语音API或外部服务。它会检查本地MP3实际大小是否仍与资料表一致。新增音轨时,先准备真实音频及对应说明,再维护资料表,不把“计划做一期”写成已经存在的附件。
时间使用带时区的记录,再生成RFC2822形式的pubDate。旧素材原公开时间没查清时,不补造原始发布日。本例的pubDate按首次加入Feed计,资料表同时保留原始公开时间未知这一点。
完整源码:https://github.com/GODGOD126/listening-script-kit/tree/main/podcast
生成器:https://github.com/GODGOD126/listening-script-kit/blob/main/tools/build-podcast.py
能打开文件,还不够
Apple的Feed技术规范要求音频托管服务器支持HEAD与字节范围请求。前者能查文件元信息,后者让客户端读取音频的一部分。
这次在公开部署之后,实际做了三类检查:
- GET读取RSS和中文说明页,确认HTTP200,而且正文与Git提交中的文件字节一致。
- 对五份音频分别发HEAD,核对Content-Length与RSS的length一致。
- 实际请求bytes=0-1023,五份均返回206、1024字节,以及包含正确文件总长度的Content-Range。
SQL音轨的实际分段结果是:
HTTP 206 Partial Content Content-Range: bytes 0-1023/4227295不是只看Accept-Ranges这个字段就判断成功,而是确实读取了一小段文件。同时也解析了XML,核对五个GUID没有重复,pubDate能按带时区的日期解析。
部署时还遇到一个小差异:Windows工作区使用CRLF,Git部署版本使用LF。两份文字看起来一样,原始字节却不同。最终用Git提交内的文件作为对照,避免把换行转换误判成部署漏更新。
这些检查能证明当次接口和文件一致,不能证明每个网络环境或播放器都已经实测通过。
手动关注和正式上架,是两件事
Apple官方中文说明给出的iPhone路径是:打开Apple播客的“资料库”,点省略号按钮,选择“通过URL关注节目”,再粘贴RSS地址。
直接关注Feed不会让节目自动进入Apple播客公开目录、搜索和编辑精选,也没有对应的Apple播客分析数据。这个例子尚未进入目录,不把RSS公开当成Apple审核通过。
页面提供可选中的完整地址。我最初做了自动复制按钮,核验时页面提示成功,但浏览器工具回读的剪贴板仍是旧内容。因此改为选中地址、由用户手动复制;这一流程已经实际按复制键并回读到正确URL。它少一点自动化,但不会只凭提示就告诉用户复制成功。
示范封面为1254×1254的AI概念图,不宣称满足正式目录封面规范。若以后正式投稿,应单独准备合规封面、核查目录要求,并完成Connect和客户端验证。
自己的私人长文,无需公开成RSS
这里处理的是可公开分享的原创示范。有权分享的节目适合用公开RSS组织;工作材料、私人笔记等不需要为了收听上传到公共仓库。GitHub Pages中的Feed和附件是公开文件,不能把“地址暂时没人知道”当隐私保护。
如果目的只是把自己的长文放在iPhone里随时听,可以先让AI整理成连续稿件,核对数字、来源和不确定性,再用适合自己的本地收听工具。
「自听」MyListen在iPhone本地把长文生成可保存的自然声音,支持锁屏收听与进度续听。无订阅、无广告;可免费下载试用,完整功能通过App内购买解锁。它负责固定稿件的收听环节,不替代来源核查或版权判断。
中国区App Store:https://apps.apple.com/cn/app/id6790382144
参考资料:Apple《播客RSS Feed规范》《Apple播客如何分发节目供听众收听》,2026年10月9日回读。
https://podcasters.apple.com/zh-cn/support/823-podcast-requirements
https://podcasters.apple.com/zh-cn/support/5108-how-apple-podcasts-distributes-your-shows-to-listeners