概要
本記事では、X(旧Twitter)から取得したツイートと天気データを組み合わせて日記を生成し、さらにその日記から画像生成に必要な要素を抽出するツールの実装について解説します。このツールは、Pythonを使用して構築されており、外部APIを活用してデータ取得や生成を行います。
ソース
主な機能
-
ツイート取得
- 指定されたユーザーのツイートを取得します。
- モックデータを使用するオプションもあります。
-
天気データ取得
- 指定された期間と場所の天気データを取得します。
-
日記生成
- ツイート内容を日記形式に変換します。
-
画像生成
- 日記の内容からシチュエーションや登場人物を抽出し、画像生成APIを利用して画像を生成します。
-
ファイル出力
- 生成された日記と画像を指定のディレクトリに保存します。
処理の流れ
1. 引数の解析
プログラムはコマンドライン引数を受け取り、モックデータを使用するか、実際のデータを使用するかを切り替えます。
def parse_args():
parser = ArgumentParser(description="日記生成ツール")
parser.add_argument("--mock", action="store_true", help="モックデータを使用する")
parser.add_argument("--user_name", type=str, help="Xのユーザー名")
parser.add_argument("--location_name", type=str, help="天気の取得に使う地名")
parser.add_argument("--start_date", type=str, help="開始日 (YYYY-MM-DD)")
parser.add_argument("--end_date", type=str, help="終了日 (YYYY-MM-DD)")
return parser.parse_args()
2. メタデータの読み込み
ツイートや天気データを取得するためのメタデータを読み込みます。
def _load_metadata(self):
if args.mock:
self.user_name = "mock_user"
self.location_name = "東京"
self.start_date = datetime.strptime("2023-05-01", "%Y-%m-%d")
self.end_date = datetime.strptime("2023-05-02", "%Y-%m-%d")
self.tweets = x_api.get_user_tweets_mock()
else:
self.user_name = args.user_name
self.location_name = args.location_name
self.start_date = datetime.strptime(args.start_date, "%Y-%m-%d")
self.end_date = datetime.strptime(args.end_date, "%Y-%m-%d")
self.tweets = x_api.get_user_tweets(self.user_name)
3. 天気データの取得
指定された期間の天気データを取得します。
def _load_weather_data(self):
months = {(self.start_date.year, self.start_date.month), (self.end_date.year, self.end_date.month)}
for year, month in months:
if args.mock:
path = f"mock/weather/{year}{month:02d}.json"
raw = text.load_json(path)
else:
raw = whether.get_past_weather(self.location_name, year, month)
daily = whether.extract_daily_weather(raw)
self.weather_data.update(daily)
4. 日記生成
ツイート内容を日記形式に変換します。
def tweet_to_diary(tweet_text):
prompt_template = text.read_text_file("prompt/tweet_to_diary.txt")
prompt = prompt_template.replace("###TWEET_TEXT###", tweet_text)
result = gemini_api.query(prompt)
return result
5. 画像生成
生成された日記から画像生成に必要な要素を抽出し、画像を生成します。
def extract_diary_for_image(diary_text):
prompt_template = text.read_text_file("prompt/diary_to_situation.txt")
prompt = prompt_template.replace("###DIARY_TEXT###", diary_text)
result = gemini_api.query(prompt)
return result
実行方法
-
実際のデータを使用して実行する場合:
python src/main.py --user_name --location_name --start_date --end_date
-
モックデータを使用して実行する場合:
python src/main.py --mock
使用技術
まとめ
このツールは、ツイートと天気データを組み合わせて日記を生成し、さらに画像生成まで行うユニークなアプローチを採用しています。今後は、天気データ取得を気象庁APIに変更するなど、さらなる改善を予定しています。