从链接生成播客
本应用用 Grok API 构建 AI 播客生成器,将文章或 PDF 制作成双人主持的节目。它展示了如何结合结构化输出和文本转语音,你可以用它为基础,将其他阅读材料转成音频。
传入文章或 PDF 的链接,应用便会围绕材料撰写和录制两位主持人的对话。Grok 每写完一句就开始配音,整份脚本还没写完,节目就能在几秒内开始播放。
你将学到什么
将网页或 PDF 转换为 Grok 的输入,使用 Files API 上传 PDF
将脚本作为结构化输出流式生成,每写完一句就开始处理
使用文本转语音为每句台词配音,并使用
[laugh]和<whisper>等语音标签控制表达方式通过服务器发送事件(SSE)将进度从 Node 服务器流式传送到网页
运行示例
需要 Node.js 22.13 或更高版本。将 API 密钥放入 .env(位于仓库根目录),或导出环境变量 XAI_API_KEY。
cd examples/podcast-from-a-link/typescript
npm install
npm run web打开 http://localhost:3000,粘贴或选择一个链接,然后点击 Make episode。页面的用法与播客应用类似:Grok 写出节目标题后,封面会立即显示标题;转录稿逐句呈现对话。前几句录制好后,节目就会开始播放,并高亮正在朗读的台词。点击某句台词或进度条上对应的位置,即可跳到该处。
如需在终端中制作节目,请传入链接或 PDF 文件路径:
npm start -- https://en.wikipedia.org/wiki/Voyager_Golden_Record节目会保存到 output/,格式为 MP3,同时在同一位置保存 Markdown 转录稿。
工作原理
共享代码位于 src/podcast.ts:
readSource()获取网页并从 HTML 中提取文本。如果来源是 PDF,则使用client.files.upload()上传文件,并将文件作为input_file传给 Grok。已上传的文件一小时后自动删除。writeScript()流式读取由以下模型生成的节目:grok-4.7,并将 JSON Schema 放在text.format中。JSON 数据到达时,流的json事件会送来已生成的脚本;下一句开始时,函数便报告上一句和 Grok 的推理。此处使用较低的推理强度:在默认强度下,Grok 会在输出第一句前先拟完整份脚本,导致首句延迟数分钟。recordLine()为一句台词配音,调用的是client.voice.speak()。语音 API 遇到未知语音标签会将其直接念出,因此先通过 SDK 的stripInvalidSpeechTags()移除 API 无法识别的标签。
src/server.ts 会在收到每句台词后立即开始录制,同时最多录四句,并将进度以 SSE 发送到网页。public/index.html 使用原生 HTML 和 JavaScript 展示事件,并按顺序播放片段。src/index.ts 在终端中完成相同的工作,并将片段合并为一个 MP3。
这里的提示词保存在 src/podcast.ts 中,让两位主持人都阅读材料,并以平等身份讨论。如果将其中一位设为采访者,Grok 容易写成知识问答:一位几乎只提问,另一位负责陈述事实。提示词还指定每轮发言的长度可以是几个词到一整段,否则每句台词的长度会大致相同。
要更换主持人或声音,请修改 HOSTS,它位于 src/podcast.ts。client.voice.list() 可列出内置声音。