
目录
一、案例简介
二、案例目标
2.1 核心功能
2.2 技术要点
2.3 预期效果
三、技术栈与核心依赖
3.1 编程语言与框架
3.2 核心依赖库
3.3 AI服务
四、项目配置
4.1 API密钥配置
4.2 环境变量设置
4.3 语音配置
五、项目结构
文件说明:
六、核心代码实现
6.1 Agent创建与配置
6.2 博客摘要生成
6.3 音频生成与处理
6.4 Streamlit界面构建
七、运行与测试
7.1 环境准备
7.2 安装依赖
7.3 启动应用
7.4 使用流程
7.5 预期输出示例
八、实现思路与扩展建议
8.1 核心设计思想
1. Agent编排模式
2. 流式数据处理
3. 错误处理与用户体验
8.2 架构优势
8.3 扩展建议
1. 功能扩展
2. 技术优化
3. 产品化方向
4. 质量提升
九、完整源码
blog_to_podcast_agent.py
requirements.txt
一、案例简介
这是一个基于 Streamlit 和 AI Agent 技术的应用程序,能够将任何博客文章自动转换为播客音频。该应用集成了多个AI服务和工具,实现了从博客内容抓取、智能摘要生成到语音合成的完整流程。
核心价值: 通过AI技术自动化内容转换流程,让用户只需输入博客URL,即可获得高质量的播客音频,极大提升了内容生产和消费的效率。
二、案例目标
2.1 核心功能
- 博客内容抓取: 使用 Firecrawl API 自动抓取任何公开博客URL的完整内容
- 智能摘要生成: 使用 OpenAI GPT-4 创建引人入胜且简洁的博客摘要(控制在2000字符以内)
- 语音合成: 使用 ElevenLabs 语音 API 将文本摘要转换为自然流畅的音频播客
- 交互式界面: 提供友好的Web界面,支持音频在线播放和下载
2.2 技术要点
- Agent编排框架的使用(Agno框架)
- 多AI服务的集成与协调
- 流式音频数据的处理
- Web界面的状态管理与错误处理
2.3 预期效果
用户输入博客URL后,系统自动完成以下流程:
三、技术栈与核心依赖
3.1 编程语言与框架
- Python 3.8+: 主要编程语言
- Streamlit: Web应用框架,用于构建交互式界面
- Agno: AI Agent编排框架,用于构建智能体工作流
3.2 核心依赖库
| agno | >=2.2.10 | Agent编排框架,提供智能体创建和工具集成能力 |
| streamlit | >=1.40.2 | Web应用框架,构建用户界面 |
| openai | >=1.102.0 | OpenAI API客户端,用于GPT-4模型调用 |
| firecrawl-py | >=4.6.0 | Firecrawl API客户端,用于网页内容抓取 |
| elevenlabs | >=1.0.0 | ElevenLabs API客户端,用于文本转语音 |
| requests | – | HTTP请求库 |
3.3 AI服务
- OpenAI GPT-4o: 用于智能摘要生成,理解博客内容并生成对话式摘要
- Firecrawl: 网页抓取服务,提取博客的完整文本内容
- ElevenLabs: 语音合成服务,生成自然流畅的多语言音频
四、项目配置
4.1 API密钥配置
本项目需要三个API密钥,在运行时通过Streamlit侧边栏输入:
- OpenAI API Key: 用于访问GPT-4模型
- Firecrawl API Key: 用于网页内容抓取
- ElevenLabs API Key: 用于语音合成
安全提示: API密钥通过Streamlit的password类型输入框输入,不会在界面明文显示,确保密钥安全。
4.2 环境变量设置
在代码中,API密钥会被设置为环境变量:
os.environ["OPENAI_API_KEY"] = openai_key
os.environ["FIRECRAWL_API_KEY"] = firecrawl_key
4.3 语音配置
ElevenLabs配置参数:
- voice_id: "JBFqnCBsd6RMkjVDRZzb" (预设语音ID)
- model_id: "eleven_multilingual_v2" (多语言模型v2)
五、项目结构
ai_blog_to_podcast_agent-zh/
├── README.md # 项目说明文档
├── blog_to_podcast_agent.py # 主程序文件
└── requirements.txt # 依赖配置文件
文件说明:
- README.md: 包含项目介绍、功能特点、安装配置和运行说明
- blog_to_podcast_agent.py: 核心程序文件,包含Agent定义、UI构建和业务逻辑
- requirements.txt: Python依赖包列表
六、核心代码实现
6.1 Agent创建与配置
使用Agno框架创建智能体,集成OpenAI模型和Firecrawl工具:
agent = Agent(
name="博客摘要生成器",
model=OpenAIChat(id="gpt-4o"),
tools=[FirecrawlTools()],
instructions=[
"抓取博客 URL 并创建一个简洁、引人入胜的摘要(最多 2000 个字符),适合播客朗读。",
"摘要应该是对话式的,并捕捉主要内容要点。"
],
)
关键配置说明:
- model: 使用GPT-4o模型,具有强大的文本理解和生成能力
- tools: 集成FirecrawlTools,提供网页抓取能力
- instructions: 指导Agent生成适合播客的对话式摘要
6.2 博客摘要生成
调用Agent执行抓取和摘要生成:
response: RunOutput = agent.run(f"抓取并为播客总结此博客:{url}")
summary = response.content if hasattr(response, 'content') else str(response)
6.3 音频生成与处理
使用ElevenLabs API生成音频:
client = ElevenLabs(api_key=elevenlabs_key)
audio_generator = client.text_to_speech.convert(
text=summary,
voice_id="JBFqnCBsd6RMkjVDRZzb",
model_id="eleven_multilingual_v2"
)
audio_chunks = []
for chunk in audio_generator:
if chunk:
audio_chunks.append(chunk)
audio_bytes = b"".join(audio_chunks)
关键点:
- ElevenLabs的convert方法返回生成器,需要迭代收集所有音频块
- 使用bytes.join将音频块合并为完整的音频数据
- 支持多语言语音合成,适合不同语言的博客内容
6.4 Streamlit界面构建
界面包含以下组件:
st.set_page_config(page_title="📰 ➡️ 🎙️ 博客转播客", page_icon="🎙️")
st.title("📰 ➡️ 🎙️ 博客转播客智能体")
st.sidebar.header("🔑 API 密钥")
openai_key = st.sidebar.text_input("OpenAI API 密钥", type="password")
elevenlabs_key = st.sidebar.text_input("ElevenLabs API 密钥", type="password")
firecrawl_key = st.sidebar.text_input("Firecrawl API 密钥", type="password")
url = st.text_input("请输入博客 URL:", "")
if st.button("🎙️ 生成播客", disabled=not all([openai_key, elevenlabs_key, firecrawl_key])):
# 处理逻辑
界面特性:
- 密码输入框隐藏API密钥
- 按钮禁用状态与密钥输入状态联动
- 加载动画提示处理进度
- 音频播放器和下载按钮
七、运行与测试
7.1 环境准备
- OpenAI: https://platform.openai.com/
- Firecrawl: Firecrawl – The context API to search, scrape, and interact with the web at scale. 🔥
- ElevenLabs: https://elevenlabs.io/
7.2 安装依赖
pip install -r requirements.txt
7.3 启动应用
streamlit run blog_to_podcast_agent.py
7.4 使用流程
7.5 预期输出示例
成功运行后,界面将显示:
- 成功提示: "播客生成成功!🎧"
- 音频播放器: 可在线播放生成的MP3音频
- 下载按钮: 点击下载podcast.mp3文件
- 摘要展示: 展开查看2000字符以内的博客摘要
八、实现思路与扩展建议
8.1 核心设计思想
1. Agent编排模式
使用Agno框架的Agent模式,将多个AI服务编排为统一的工作流:
- Agent作为协调中心,管理工具调用和模型推理
- 通过instructions指导Agent行为,确保输出质量
- 工具集成简化了外部API的调用复杂度
2. 流式数据处理
ElevenLabs返回生成器而非直接音频数据,需要流式处理:
- 避免内存溢出,适合长文本音频生成
- 可以扩展为实时流式播放
- 支持进度显示和取消操作
3. 错误处理与用户体验
完善的错误处理机制:
- 按钮禁用状态防止无效操作
- try-except捕获异常并友好提示
- 加载动画提供视觉反馈
- 摘要展示让用户了解生成内容
8.2 架构优势
- 模块化设计: 各AI服务独立集成,易于替换和升级
- 配置灵活: 运行时输入API密钥,无需修改代码
- 扩展性强: Agent框架支持添加更多工具和能力
- 用户友好: Streamlit提供开箱即用的Web界面
8.3 扩展建议
1. 功能扩展
- 多语言支持: 根据博客语言自动选择合适的ElevenLabs语音
- 语音选择: 提供多种语音选项,让用户选择喜欢的音色
- 摘要长度控制: 允许用户自定义摘要长度
- 批量处理: 支持输入多个URL,批量生成播客
- 播客系列: 将多个博客合并为一期完整播客
2. 技术优化
- 缓存机制: 缓存已处理的博客,避免重复抓取和生成
- 异步处理: 使用异步IO提升处理效率
- 进度显示: 实时显示抓取、摘要、语音合成的进度
- 断点续传: 支持中断后继续处理
3. 产品化方向
- 用户系统: 添加用户认证和历史记录
- 订阅功能: 支持RSS订阅自动生成播客
- 分享功能: 生成播客链接供分享
- API服务: 封装为API供其他应用调用
4. 质量提升
- 摘要优化: 使用更精细的prompt工程提升摘要质量
- 语音情感: 根据内容情感调整语音语调
- 背景音乐: 添加背景音乐增强播客效果
- 多主播: 使用不同语音模拟对话式播客
九、完整源码
blog_to_podcast_agent.py
import os
from uuid import uuid4
from agno.agent import Agent
from agno.run.agent import RunOutput
from agno.models.openai import OpenAIChat
from agno.tools.firecrawl import FirecrawlTools
from elevenlabs import ElevenLabs
import streamlit as st
# Streamlit 配置
st.set_page_config(page_title="📰 ➡️ 🎙️ 博客转播客", page_icon="🎙️")
st.title("📰 ➡️ 🎙️ 博客转播客智能体")
# API 密钥(运行时输入)
st.sidebar.header("🔑 API 密钥")
openai_key = st.sidebar.text_input("OpenAI API 密钥", type="password")
elevenlabs_key = st.sidebar.text_input("ElevenLabs API 密钥", type="password")
firecrawl_key = st.sidebar.text_input("Firecrawl API 密钥", type="password")
# 博客 URL 输入
url = st.text_input("请输入博客 URL:", "")
# 生成按钮
if st.button("🎙️ 生成播客", disabled=not all([openai_key, elevenlabs_key, firecrawl_key])):
if not url.strip():
st.warning("请输入博客 URL")
else:
with st.spinner("正在抓取博客内容并生成播客…"):
try:
# 设置 API 密钥
os.environ["OPENAI_API_KEY"] = openai_key
os.environ["FIRECRAWL_API_KEY"] = firecrawl_key
# 创建用于抓取和总结的智能体
agent = Agent(
name="博客摘要生成器",
model=OpenAIChat(id="gpt-4o"),
tools=[FirecrawlTools()],
instructions=[
"抓取博客 URL 并创建一个简洁、引人入胜的摘要(最多 2000 个字符),适合播客朗读。",
"摘要应该是对话式的,并捕捉主要内容要点。"
],
)
# 获取摘要
response: RunOutput = agent.run(f"抓取并为播客总结此博客:{url}")
summary = response.content if hasattr(response, 'content') else str(response)
if summary:
# 初始化 ElevenLabs 客户端并生成音频
client = ElevenLabs(api_key=elevenlabs_key)
# 使用 text_to_speech.convert 生成音频
audio_generator = client.text_to_speech.convert(
text=summary,
voice_id="JBFqnCBsd6RMkjVDRZzb",
model_id="eleven_multilingual_v2"
)
# 如果是生成器,则收集音频块
audio_chunks = []
for chunk in audio_generator:
if chunk:
audio_chunks.append(chunk)
audio_bytes = b"".join(audio_chunks)
# 显示音频
st.success("播客生成成功!🎧")
st.audio(audio_bytes, format="audio/mp3")
# 下载按钮
st.download_button(
"下载播客",
audio_bytes,
"podcast.mp3",
"audio/mp3"
)
# 显示摘要
with st.expander("📄 播客摘要"):
st.write(summary)
else:
st.error("生成摘要失败")
except Exception as e:
st.error(f"错误:{e}")
requirements.txt
agno>=2.2.10
streamlit>=1.40.2
openai>=1.102.0
requests
firecrawl-py>=4.6.0
elevenlabs>=1.0.0

![[特殊字符]DeepSeek‑Harness(DSH)小白保姆教程-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260816085112-6a817a009aabf-220x150.png)
