手把手”搭建AI诗画网页:Python+文心一言全流程指南
2025.10.10 16:40浏览量:2简介:本文将详细介绍如何使用Python和文心一言API搭建一个完整的《AI看图写诗》网页项目,包含前端界面设计、后端逻辑实现和完整源码解析。
一、项目背景与技术选型
随着AI技术的快速发展,图像识别与自然语言生成的结合催生了”看图写诗”这类创新应用。本项目旨在通过Python构建一个Web应用,用户上传图片后,系统调用文心一言API生成对应诗歌,实现”诗画共生”的创作体验。
技术选型方面,我们采用:
- Flask框架:轻量级Web框架,适合快速开发
- HTML5+CSS3:构建响应式前端界面
- Bootstrap 5:加速UI组件开发
- 文心一言API:提供高质量的诗歌生成能力
- Pillow库:处理图片上传与预处理
选择这些技术的原因是:Flask的学习曲线平缓,开发效率高;Bootstrap能快速实现美观的界面;文心一言API在中文诗歌生成领域表现优异,能生成符合韵律的古典诗词。
二、环境准备与API配置
1. 开发环境搭建
# 创建虚拟环境python -m venv venvsource venv/bin/activate # Linux/Macvenv\Scripts\activate # Windows# 安装依赖pip install flask pillow requests
2. 文心一言API配置
首先需要在百度智能云平台申请文心一言API权限,获取:
- API Key
- Secret Key
- Access Token(需通过API Key和Secret Key获取)
建议将敏感信息存储在环境变量中:
import osos.environ['ERNIE_API_KEY'] = 'your_api_key'os.environ['ERNIE_SECRET_KEY'] = 'your_secret_key'
三、核心功能实现
1. 图片处理模块
使用Pillow库实现图片预处理:
from PIL import Imageimport iodef process_image(image_file):try:img = Image.open(image_file)# 调整图片大小(可选)img.thumbnail((800, 800))# 转换为RGB模式(确保兼容性)if img.mode != 'RGB':img = img.convert('RGB')return imgexcept Exception as e:print(f"图片处理错误: {e}")return None
2. API调用封装
创建专门的API客户端类:
import requestsimport base64import jsonimport osfrom datetime import datetime, timedeltaclass ErnieBotClient:def __init__(self):self.api_key = os.getenv('ERNIE_API_KEY')self.secret_key = os.getenv('ERNIE_SECRET_KEY')self.access_token = self._get_access_token()def _get_access_token(self):url = "https://aip.baidubce.com/oauth/2.0/token"params = {"grant_type": "client_credentials","client_id": self.api_key,"client_secret": self.secret_key}response = requests.post(url, params=params)return response.json().get("access_token")def generate_poem(self, image_base64, prompt="根据这张图片创作一首古诗"):url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions"headers = {'Content-Type': 'application/json'}data = {"messages": [{"role": "user","content": f"{prompt}\n图片描述:{self._describe_image(image_base64)}"}]}params = {"access_token": self.access_token}response = requests.post(url, headers=headers, params=params, data=json.dumps(data))return response.json().get("result", "")def _describe_image(self, image_base64):# 这里可以添加图片描述的逻辑return "一幅美丽的风景画"
3. Flask路由设计
from flask import Flask, render_template, request, jsonifyimport base64from io import BytesIOapp = Flask(__name__)ernie_client = ErnieBotClient()@app.route('/')def index():return render_template('index.html')@app.route('/generate', methods=['POST'])def generate_poem():if 'image' not in request.files:return jsonify({"error": "未上传图片"}), 400image_file = request.files['image']img = process_image(image_file)if not img:return jsonify({"error": "图片处理失败"}), 400buffered = BytesIO()img.save(buffered, format="JPEG")img_str = base64.b64encode(buffered.getvalue()).decode('utf-8')poem = ernie_client.generate_poem(img_str)return jsonify({"poem": poem})if __name__ == '__main__':app.run(debug=True)
四、前端界面开发
创建templates/index.html文件:
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>AI看图写诗</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"><style>.result-box {min-height: 200px;border: 1px solid #ddd;padding: 15px;margin-top: 20px;background-color: #f8f9fa;}</style></head><body><div class="container mt-5"><h1 class="text-center mb-4">AI看图写诗</h1><div class="row justify-content-center"><div class="col-md-6"><div class="card"><div class="card-body"><form id="poemForm" enctype="multipart/form-data"><div class="mb-3"><label for="imageInput" class="form-label">选择图片</label><input class="form-control" type="file" id="imageInput" accept="image/*" required></div><button type="submit" class="btn btn-primary w-100">生成诗歌</button></form><div class="result-box mt-4" id="resultBox"><p class="text-muted">诗歌将显示在这里...</p></div></div></div></div></div></div><script>document.getElementById('poemForm').addEventListener('submit', async (e) => {e.preventDefault();const formData = new FormData();const fileInput = document.getElementById('imageInput');formData.append('image', fileInput.files[0]);try {const response = await fetch('/generate', {method: 'POST',body: formData});const data = await response.json();if (data.error) {document.getElementById('resultBox').innerHTML =`<div class="alert alert-danger">${data.error}</div>`;} else {document.getElementById('resultBox').innerHTML =`<h5>生成的诗歌:</h5><pre>${data.poem}</pre>`;}} catch (error) {console.error('Error:', error);document.getElementById('resultBox').innerHTML =`<div class="alert alert-danger">发生错误: ${error.message}</div>`;}});</script></body></html>
五、完整项目源码与部署指南
完整项目结构
ai-poem-project/├── app.py # 主应用文件├── templates/│ └── index.html # 前端模板├── static/ # 静态资源(可选)├── requirements.txt # 依赖文件└── README.md # 项目说明
requirements.txt内容
Flask==2.3.2Pillow==10.0.0requests==2.31.0
部署建议
- 本地测试:直接运行
python app.py - 生产部署:
- 使用Gunicorn:
gunicorn -w 4 -b 0.0.0.0:5000 app:app - 配合Nginx反向代理
- 使用Gunicorn:
- 云服务部署:
- 推荐使用百度智能云BCE或阿里云ECS
- 配置自动伸缩应对流量变化
六、优化与扩展方向
性能优化:
- 添加图片缓存机制
- 实现异步任务队列(Celery)
- 添加API调用限流
功能扩展:
- 支持多种诗歌体裁选择(五言、七言、词牌)
- 添加诗歌历史记录功能
- 实现社交分享功能
用户体验改进:
- 添加加载动画
- 实现图片预览功能
- 添加多语言支持
七、常见问题解决方案
API调用失败:
- 检查Access Token是否过期
- 确认API权限是否正确配置
- 查看网络连接是否正常
图片处理错误:
- 确保上传的是有效图片文件
- 检查图片大小是否超过限制
- 验证图片格式是否支持
诗歌质量不理想:
- 调整prompt提示词
- 尝试不同的图片描述方式
- 联系API提供商调整模型参数
本项目的完整源码已附上,开发者可以根据实际需求进行修改和扩展。通过这个项目,不仅可以学习Python Web开发的基本流程,还能深入理解如何将AI能力集成到实际应用中。随着AI技术的不断进步,这类创意应用将有更广阔的发展空间。

发表评论
登录后可评论,请前往 登录 或 注册