logo

手把手搭建AI看图写诗:Python+文心一言实战指南

作者:c4t2025.09.26 19:27浏览量:0

简介:本文将通过完整项目源码,手把手教你用Python和文心一言API搭建一个《AI看图写诗》网页应用,实现图片上传、AI解析图像内容并生成诗歌的功能。

一、项目背景与核心价值

在AI技术快速发展的今天,将图像识别与自然语言生成结合的应用场景日益丰富。本项目通过文心一言(ERNIE Bot)的API能力,结合Python的Web开发框架Flask,构建一个用户可上传图片、AI自动解析画面内容并生成对应诗歌的网页应用。该应用不仅能展示AI在多模态交互中的潜力,还可作为教育工具或创意辅助平台使用。

二、技术栈与工具准备

  1. 核心工具

    • Python 3.8+:后端开发语言,需安装flaskrequestspillow等库。
    • 文心一言API:百度提供的自然语言生成服务,需申请API Key(官方文档)。
    • Flask框架:轻量级Web框架,用于快速搭建前后端交互逻辑。
    • HTML/CSS/JavaScript:前端页面设计,实现图片上传与诗歌展示。
  2. 环境配置

    1. pip install flask requests pillow

    创建虚拟环境(推荐):

    1. python -m venv ai_poem_env
    2. source ai_poem_env/bin/activate # Linux/Mac
    3. ai_poem_env\Scripts\activate # Windows

三、项目实现步骤

1. 文心一言API调用封装

首先,创建一个ernie_bot.py文件,封装API请求逻辑:

  1. import requests
  2. import base64
  3. import json
  4. class ErnieBot:
  5. def __init__(self, api_key, secret_key):
  6. self.api_key = api_key
  7. self.secret_key = secret_key
  8. self.access_token = self._get_access_token()
  9. def _get_access_token(self):
  10. url = "https://aip.baidubce.com/oauth/2.0/token"
  11. params = {
  12. "grant_type": "client_credentials",
  13. "client_id": self.api_key,
  14. "client_secret": self.secret_key
  15. }
  16. response = requests.post(url, params=params)
  17. return response.json().get("access_token")
  18. def generate_poem(self, image_base64, prompt="根据图片内容生成一首五言绝句"):
  19. url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"
  20. headers = {
  21. "Content-Type": "application/json"
  22. }
  23. data = {
  24. "messages": [
  25. {"role": "user", "content": f"{prompt}\n图片描述:{self._describe_image(image_base64)}"}
  26. ]
  27. }
  28. params = {"access_token": self.access_token}
  29. response = requests.post(url, headers=headers, params=params, data=json.dumps(data))
  30. return response.json().get("result", "")
  31. def _describe_image(self, image_base64):
  32. # 此处简化,实际可调用图像识别API获取描述
  33. return "一幅山水画,有山有水有云" # 示例描述

2. Flask后端开发

创建app.py作为主程序入口:

  1. from flask import Flask, request, jsonify, render_template
  2. from ernie_bot import ErnieBot
  3. import base64
  4. import os
  5. app = Flask(__name__)
  6. # 配置API密钥(实际开发中应从环境变量读取)
  7. API_KEY = "your_api_key"
  8. SECRET_KEY = "your_secret_key"
  9. ernie = ErnieBot(API_KEY, SECRET_KEY)
  10. @app.route("/")
  11. def index():
  12. return render_template("index.html")
  13. @app.route("/generate", methods=["POST"])
  14. def generate():
  15. if "file" not in request.files:
  16. return jsonify({"error": "No file uploaded"}), 400
  17. file = request.files["file"]
  18. if file.filename == "":
  19. return jsonify({"error": "Empty filename"}), 400
  20. # 读取图片并转为Base64
  21. img_bytes = file.read()
  22. img_base64 = base64.b64encode(img_bytes).decode("utf-8")
  23. # 调用文心一言生成诗歌
  24. poem = ernie.generate_poem(img_base64)
  25. return jsonify({"poem": poem})
  26. if __name__ == "__main__":
  27. app.run(debug=True)

3. 前端页面设计

templates/index.html中实现图片上传与结果展示:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>AI看图写诗</title>
  5. <style>
  6. body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
  7. .container { display: flex; flex-direction: column; align-items: center; }
  8. #result { margin-top: 20px; padding: 10px; border: 1px solid #ddd; min-height: 100px; }
  9. </style>
  10. </head>
  11. <body>
  12. <div class="container">
  13. <h1>AI看图写诗</h1>
  14. <input type="file" id="imageUpload" accept="image/*">
  15. <button onclick="uploadImage()">生成诗歌</button>
  16. <div id="result"></div>
  17. </div>
  18. <script>
  19. async function uploadImage() {
  20. const fileInput = document.getElementById("imageUpload");
  21. const file = fileInput.files[0];
  22. if (!file) {
  23. alert("请选择图片");
  24. return;
  25. }
  26. const formData = new FormData();
  27. formData.append("file", file);
  28. try {
  29. const response = await fetch("/generate", {
  30. method: "POST",
  31. body: formData
  32. });
  33. const data = await response.json();
  34. if (data.error) {
  35. alert(data.error);
  36. } else {
  37. document.getElementById("result").innerHTML = `<h3>生成的诗歌:</h3><p>${data.poem}</p>`;
  38. }
  39. } catch (error) {
  40. console.error("Error:", error);
  41. }
  42. }
  43. </script>
  44. </body>
  45. </html>

四、关键优化与注意事项

  1. API调用优化

    • 缓存AccessToken:当前实现每次调用都重新获取Token,实际应缓存并定期刷新。
    • 错误处理:添加重试机制与更详细的错误日志
    • 图像描述增强:可集成百度图像识别API(image_classify)获取更准确的画面描述。
  2. 性能与安全

    • 文件大小限制:在Flask中配置MAX_CONTENT_LENGTH防止大文件攻击。
    • API密钥保护:通过环境变量或配置文件存储密钥,避免硬编码。
    • 异步处理:对于高并发场景,可使用Celery实现异步任务队列。
  3. 扩展功能建议

    • 诗歌风格选择:前端增加下拉菜单,让用户选择五言/七言、古风/现代等风格。
    • 历史记录:将用户上传的图片与生成的诗歌存入数据库(如SQLite)。
    • 社交分享:集成分享按钮,支持将诗歌生成图片并分享至社交平台。

五、完整项目源码与部署

  1. 项目结构

    1. /ai_poem_project
    2. ├── app.py
    3. ├── ernie_bot.py
    4. ├── templates/
    5. └── index.html
    6. └── requirements.txt
  2. 部署方式

    • 本地运行:直接执行python app.py,访问http://127.0.0.1:5000
    • 云服务器部署:使用Nginx+Gunicorn部署生产环境(Flask部署指南)。
    • Docker化:创建Dockerfile实现容器化部署。

六、总结与展望

本项目通过Python与文心一言API的结合,展示了AI在多模态内容生成中的实际应用。开发者可基于此框架进一步扩展功能,如集成更多AI模型(Stable Diffusion生成配图)、开发移动端应用等。随着大语言模型与图像生成技术的进步,此类应用将在教育、艺术创作等领域发挥更大价值。

完整源码下载GitHub链接(示例链接,实际需替换)
API申请地址文心一言开放平台

相关文章推荐

发表评论