这些日子里,要跟上科技新闻的发展似乎已经变得不可能了。我偶尔中断一下工作,结果就会发现有新的AI模型、新框架或新工具出现,而这些都是我必须学会使用的东西。不过,阅读所有这些信息已经不再可行了。但我仍然希望保持对技术的了解。
因此,我决定改变方式,而不是放弃。我选择了一些我自己喜欢的科技博客文章,挑选其中最优秀的文章,然后用自己的声音把它们转化为音频格式。这样,我就可以在走路、跑步或开车的时候随时了解最新的信息了。
在这个教程中,你将学习如何逐步构建这样一个流程的简化版本。
目录
你要创建什么
你将创建一个Node.js脚本,该脚本可以做到以下几点:
-
从RSS源中提取文章。
-
从每篇文章中提取可读的文本。
-
过滤掉不需要的内容。
-
将文本整理成适合发音的形式。
-
用你的声音将文本转换成音频。
-
将音频上传到Cloudflare R2上。
-
生成播客的RSS订阅链接。
-
按照预定的时间表自动运行整个流程。
最后,你会得到一份真正的播客文件,你可以在手机上订阅它。

如果你不想继续观看这个教程,可以直接使用已经完成的功能。你可以访问GiTHub来获取完整版和说明。
prerequisites
为了能够继续使用这个教程,你需要具备基本的JavaScript知识。
你还需要以下资源:
-
R2_ACCOUNT_ID -
R2_ACCESS_KEY_ID -
R2_SECRET_ACCESS_KEY -
R2_BUCKET_NAME -
R2_PUBLIC_URL
这些变量可以帮助脚本上传文件并生成公共网址。
项目概述
在开始编写代码之前,先清楚理解项目的概念是很重要的。
这个项目是一个流程化的操作:
Fetch content -> Filter content -> Clean up content -> Convert to audio -> Repeat
每个步骤都依赖于前一个步骤的输出结果。保持这种线性流程有助于更好地理解、调试和自动化整个过程。
本教程中的所有代码都存储在一个名为index.js的文件中。
开始使用
创建一个新的项目文件夹以及主文件。
mkdir podcast-pipeline
cd podcast-pipeline
touch index.js
初始化项目并安装所需的依赖项。
npm init -y
npm install rss-parser @mozilla/readability jsdom node-fetch uuid xmlbuilder @aws-sdk/client-s3
启用ESM,使import语法在Node 22中可以使用。
npm pkg set type: module
以下是各个依赖项的用途:
-
rss-parser用于读取RSS源。 -
@mozilla/readability用于提取可读的文章文本。 -
jsdom为Readability提供DOM结构。 -
node-fetch用于获取远程内容。 -
uuid用于生成唯一的文件名。 -
xmlbuilder用于创建播客的RSS订阅链接。 -
@aws-sdk/client-s3用于将音频上传到Cloudflare R2上。
如何将内容转换为音频
OrangeClone提供了音频URL,但播客应用程序需要一个稳定的、公开的文件来存储音频。
这就是Cloudflare R2发挥作用的地方。
R2是一种与S3兼容的存储服务,这意味着我们可以使用AWS SDK来上传文件,并将其公开供播客应用程序使用。
设置凭据
在你的Cloudflare仪表板中创建一个R2桶,并设置以下环境变量:
-
R2_ACCOUNT_ID -
R2_ACCESS_KEY_ID -
R2_SECRET_ACCESS_KEY -
R2_BUCKET_NAME -
R2_PUBLIC_URL
这些值使得脚本能够上传文件并生成公共URL。
运行流程并生成订阅源
现在我们需要一个单一的入口点来运行这个流程并生成播客的订阅源。在“管道”函数下方添加以下内容:
name: Podcast
Pipeline
on:
cron: "0 6 * * *"
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
node-version: 22
- uses: actions/setup-node@v4
with:
node-version: 22
env:
ORANGECLONE_API_KEY: ${{ secrets.ORANGECLONE_API_KEY }}
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
R2_BUCKET_NAME: ${{ secrets.R2_BUCKET_NAME }}
R2_PUBLIC_URL: ${{ secrets.R2_PUBLIC_URL }}
当运行node index.js时,会执行以下步骤:
-
获取新文章
-
生成新的音频文件
-
更新播客的订阅源
一旦设置完成,你的播客就会自动更新,无需手动操作。
结论
这是我的生产流程的一个基本版本,即PostCast。不过,核心思想是相同的。
现在你知道如何将博客文章转化为个人播客了。请注意版权问题,只使用你有权使用的内容。
如果有任何疑问,可以通过X邮件联系我:sprucekhalifa。我经常撰写类似的实用技术文章。