手把手教你用Python+文心一言:AI看图写诗网页实战指南
2025.09.19 13:32浏览量:1简介:本文将详细介绍如何使用Python和文心一言API搭建一个完整的《AI看图写诗》网页应用,包含前端界面设计、后端逻辑实现和完整项目源码。
手把手教你用Python+文心一言:AI看图写诗网页实战指南
一、项目概述与技术选型
在当今AI技术飞速发展的背景下,将图像识别与自然语言生成技术结合,开发一个能够”看图写诗”的智能应用,不仅能展示AI的创造力,还能为用户提供独特的文学体验。本项目采用Python作为后端开发语言,结合Flask框架构建Web服务,前端使用HTML/CSS/JavaScript实现交互界面,核心功能通过调用文心一言API实现图像理解与诗歌生成。
技术选型依据:
- Python:拥有丰富的AI生态库(如OpenCV用于图像处理),且语法简洁易学
- Flask:轻量级Web框架,适合快速开发中小型应用
- 文心一言API:提供强大的自然语言处理能力,支持多模态交互
- 前端三件套:实现响应式设计,兼容多终端访问
二、开发环境准备
2.1 系统要求
- Python 3.7+
- 现代浏览器(Chrome/Firefox/Edge)
- 文心一言API访问权限
2.2 依赖安装
pip install flask requests opencv-python pillow
2.3 API密钥配置
在项目根目录创建.env
文件,添加以下内容:
ERNIE_API_KEY=your_api_key_here
ERNIE_SECRET_KEY=your_secret_key_here
三、核心功能实现
3.1 图像处理模块
使用OpenCV实现基础图像处理:
import cv2
import numpy as np
from PIL import Image
import io
def preprocess_image(file_stream):
"""图像预处理:调整大小、格式转换"""
try:
# 使用Pillow读取文件流
img = Image.open(file_stream)
# 转换为RGB模式
if img.mode != 'RGB':
img = img.convert('RGB')
# 调整大小(保持宽高比)
img.thumbnail((800, 800))
# 转换为字节流
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format='JPEG')
img_byte_arr.seek(0)
return img_byte_arr
except Exception as e:
print(f"图像处理错误: {e}")
return None
3.2 文心一言API集成
import requests
import base64
import json
from dotenv import load_dotenv
import os
load_dotenv()
class ErnieBot:
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):
"""获取API访问令牌"""
auth_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(auth_url, params=params)
return response.json().get("access_token")
def generate_poem(self, image_base64, prompt="根据这张图片创作一首古诗"):
"""调用文心一言生成诗歌"""
api_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(api_url, headers=headers, params=params, json=data)
return response.json().get("result", "")
def _describe_image(self, image_base64):
"""简单图像描述(实际项目可接入图像描述API)"""
# 这里简化处理,实际应调用图像理解API
return "一幅美丽的自然风景图"
3.3 Flask后端实现
from flask import Flask, request, jsonify, render_template
import base64
from io import BytesIO
from ernie_bot import ErnieBot
app = Flask(__name__)
ernie = ErnieBot()
@app.route('/')
def index():
return render_template('index.html')
@app.route('/generate', methods=['POST'])
def generate_poem():
if 'file' not in request.files:
return jsonify({"error": "未上传文件"}), 400
file = request.files['file']
if file.filename == '':
return jsonify({"error": "未选择文件"}), 400
# 图像预处理
img_byte_arr = preprocess_image(file.stream)
if not img_byte_arr:
return jsonify({"error": "图像处理失败"}), 500
# 转换为base64
img_base64 = base64.b64encode(img_byte_arr.getvalue()).decode('utf-8')
# 调用AI生成诗歌
poem = ernie.generate_poem(img_base64)
return jsonify({
"poem": poem,
"image_url": f"data:image/jpeg;base64,{img_base64}"
})
def preprocess_image(file_stream):
# 复用前面的图像处理函数
pass # 实际实现见前文
if __name__ == '__main__':
app.run(debug=True)
四、前端界面设计
4.1 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>
.container { max-width: 900px; }
.result-box { min-height: 200px; border: 1px dashed #ccc; padding: 15px; }
.preview-img { max-width: 100%; max-height: 300px; }
</style>
</head>
<body>
<div class="container mt-5">
<h1 class="text-center mb-4">AI看图写诗</h1>
<div class="card mb-4">
<div class="card-body">
<form id="uploadForm" enctype="multipart/form-data">
<div class="mb-3">
<label for="imageUpload" class="form-label">选择图片</label>
<input class="form-control" type="file" id="imageUpload" accept="image/*" required>
</div>
<button type="submit" class="btn btn-primary">生成诗歌</button>
</form>
</div>
</div>
<div class="row mt-4">
<div class="col-md-6">
<h3>图片预览</h3>
<div id="imagePreview" class="text-center">
<p>请上传图片</p>
</div>
</div>
<div class="col-md-6">
<h3>AI生成的诗歌</h3>
<div id="poemResult" class="result-box">
<p>诗歌将显示在这里...</p>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
document.getElementById('uploadForm').addEventListener('submit', async function(e) {
e.preventDefault();
const formData = new FormData();
const fileInput = document.getElementById('imageUpload');
formData.append('file', fileInput.files[0]);
try {
const response = await fetch('/generate', {
method: 'POST',
body: formData
});
const data = await response.json();
if (data.error) {
alert(data.error);
return;
}
// 显示图片
const imgPreview = document.getElementById('imagePreview');
imgPreview.innerHTML = `<img src="${data.image_url}" class="preview-img img-thumbnail">`;
// 显示诗歌
const poemResult = document.getElementById('poemResult');
poemResult.innerHTML = `<pre>${data.poem}</pre>`;
} catch (error) {
console.error('Error:', error);
alert('生成诗歌时出错');
}
});
// 实时预览
document.getElementById('imageUpload').addEventListener('change', function(e) {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(event) {
const imgPreview = document.getElementById('imagePreview');
imgPreview.innerHTML = `<img src="${event.target.result}" class="preview-img img-thumbnail">`;
};
reader.readAsDataURL(file);
});
</script>
</body>
</html>
五、项目部署与优化
5.1 部署方案
- 本地开发:直接运行
app.py
进行测试 - 生产部署:
- 使用Gunicorn作为WSGI服务器:
gunicorn -w 4 -b 0.0.0.0:5000 app:app
- 配合Nginx反向代理
- 推荐使用Docker容器化部署
- 使用Gunicorn作为WSGI服务器:
5.2 性能优化
- API调用优化:
- 实现Token缓存机制,避免频繁获取
- 添加重试逻辑处理网络波动
- 图像处理优化:
- 限制上传图片大小
- 使用异步处理长任务
- 前端优化:
- 添加加载动画
- 实现响应式图片加载
5.3 完整项目源码结构
ai-poem-generator/
├── app.py # Flask主应用
├── ernie_bot.py # 文心一言API封装
├── templates/
│ └── index.html # 前端页面
├── static/
│ └── style.css # 自定义样式(可选)
├── .env # 环境变量配置
└── requirements.txt # 依赖列表
六、扩展功能建议
多风格诗歌生成:
- 扩展API调用参数,支持不同诗歌体裁(五言、七言、现代诗)
- 添加风格选择下拉框
社交分享功能:
- 集成社交平台分享API
- 生成带水印的诗歌图片
用户系统:
- 添加用户注册/登录
- 实现诗歌收藏功能
移动端适配:
- 开发配套微信小程序
- 实现PWA渐进式Web应用
七、常见问题解决方案
API调用失败:
- 检查密钥配置是否正确
- 查看API文档确认参数格式
- 检查网络连接是否正常
图像处理错误:
- 验证上传文件是否为有效图片
- 检查图片大小是否超过限制
- 确保安装了正确的图像处理库
跨域问题:
- 开发时在Flask中添加CORS支持:
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
- 开发时在Flask中添加CORS支持:
八、总结与展望
本项目通过Python与文心一言API的结合,成功实现了一个功能完整的AI看图写诗应用。开发者不仅掌握了多模态AI应用的基本开发流程,还深入理解了API集成、前后端交互等关键技术点。未来,随着AI技术的不断进步,此类应用将在教育、文化创意等领域发挥更大价值。
完整项目源码下载:[GitHub链接](实际部署时替换为真实链接)
通过这个实战项目,读者可以:
- 快速掌握Python Web开发基础
- 理解AI API的集成方法
- 获得完整的项目开发经验
- 拓展出更多创意应用场景
建议开发者在此基础上继续优化,如添加更多AI功能模块,或开发移动端应用,创造更大的商业价值和社会价值。
发表评论
登录后可评论,请前往 登录 或 注册