Mermaidで作成した人物相関図を、Gradioで画像として出力したい
解決したいこと
小説の人物相関図をMermaidに作成させ、Gradioで画像として出力させたい
詳細
現在OpenAI APIに青空文庫の小説をスクレイピングさせ、内容の要約と人物相関図を画像として表示させるアプリを作成しています。
ですがGradioのwebアプリ画面で人物相関図の画像を表示させようとするとエラーが出てしまいます。
いろいろ改善策を試してみたのですが、全くうまくいかず皆さんの助言をいただきたくて質問させていただきます。
Google Colabで実装してます。
コードの内容は以下の通りです。よろしくお願い致します
!npm install -g @mermaid-js/mermaid-cli
import openai
import os
!pip install --upgrade openai
!pip install bs4
from bs4 import BeautifulSoup
from urllib import request
import re
!pip install mermaid-py
import mermaid as md
from mermaid.graph import Graph
from IPython.display import display, Markdown
!pip install gradio
import gradio as gr
import subprocess
import uuid
!pip install openai bs4 gradio mermaid-py
#OpenAI APIにログイン
from google.colab import userdata
key = userdata.get("OpenAI_key")
os.environ["OPENAI_API_KEY"] = key
openai.api_key = key
client = openai.OpenAI(api_key=key)
system_contents = """
あなたはプロの編集者です。段階ごとに要約と人物相関図を出力してください。
#手順
- 要約する : ユーザーから与えられたテキストを要約してください
- 人物相関図を出力する : 要約したテキスト、登場人物の関係性を示した人物相関図をMermaid記法で出力してください
#出力形式
1.要約
- 要約は400文字以内で出力してください
- ですます調は禁止
- ネタバレ(犯人・手口・結末)禁止
"""
import tempfile
from PIL import Image
import os
#テキストがURLだった場合スクレイピングする関数
def scraping(text):
response = request.urlopen(text)
soup = BeautifulSoup(response, "html.parser")
response.close()
main_text = soup.find("div", class_ = "main_text")
tags_to_delete = main_text.find_all(["rp", "rt"])
for tag in tags_to_delete:
tag.decompose()
#ここは文章要約コード
text_content = main_text.get_text()
result = re.sub(r"[\u3000 \n \r]", "", text_content)
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": system_contents},
{"role": "user", "content": result}
],
temperature=0.7,
max_tokens=400)
summary = response.choices[0].message.content
mermaid_code = """graph LR
A((主人公))
B((桜の樹の美しさ))
C((屍体のイメージ))
D((不安と憂鬱))
E((心の平衡))
F((酒宴をひらく村人たち))
A --> B
A --> C
C --> D
D --> E
E --> A
F --> B
"""
# 一時ファイル作成
with tempfile.NamedTemporaryFile(mode='w', suffix=".mmd", delete=False) as mmd_file:
mmd_file.write(mermaid_code)
mmd_path = mmd_file.name
svg_path = mmd_path.replace(".mmd", ".svg")
# Mermaid CLIでSVG変換
subprocess.run(["mmdc", "-i", mmd_path, "-o", svg_path], check=True)
return summary, svg_path # summaryはテキスト、svg_pathは画像パス
demo = gr.Interface(
fn=scraping,
inputs=gr.Textbox(label="URLまたはテキストを入力"),
outputs=[
gr.Textbox(label="要約"),
gr.Image(label="人物相関図 (Mermaid SVG)")
]
)
demo.launch()