@VTR

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Mermaidで作成した人物相関図を、Gradioで画像として出力したい

解決したいこと

小説の人物相関図をMermaidに作成させ、Gradioで画像として出力させたい

詳細

現在OpenAI APIに青空文庫の小説をスクレイピングさせ、内容の要約と人物相関図を画像として表示させるアプリを作成しています。
ですがGradioのwebアプリ画面で人物相関図の画像を表示させようとするとエラーが出てしまいます。

スクリーンショット 2025-06-21 165500.png

いろいろ改善策を試してみたのですが、全くうまくいかず皆さんの助言をいただきたくて質問させていただきます。
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 = """
あなたはプロの編集者です。段階ごとに要約と人物相関図を出力してください。

#手順

  1. 要約する : ユーザーから与えられたテキストを要約してください
  2. 人物相関図を出力する : 要約したテキスト、登場人物の関係性を示した人物相関図を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()

0 likes

No Answers yet.

Your answer might help someone💌