generated from jphacks/JP_sample
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprompts.py
More file actions
446 lines (357 loc) · 20.5 KB
/
prompts.py
File metadata and controls
446 lines (357 loc) · 20.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
# -*- coding: utf-8 -*-
"""
プロンプト管理ファイル
複数のプロンプトパターンを管理し、動画解析に使用します。
使い方:
from prompts import get_prompt, list_prompts
# 利用可能なプロンプト一覧を表示
print(list_prompts())
# プロンプトを取得
prompt_text = get_prompt("default", num_frames=15)
"""
# ===== プロンプトテンプレート =====
# {num_frames} は実行時に置き換えられます
PROMPTS = {
"default": """
以下の{num_frames}枚の動画フレームを順番に解析してください。
これは4DX映画館のような体感型エンターテインメント用です。
各フレームについて、日本語で詳細なキャプション(2-3文)を返してください。
【4DX体験のための超重要ポイント - 振動を積極的に!】
★ 振動の基本方針 ★
- 乗り物に乗っている間は常に「乗っている」と記載
- 動きや戦闘があるシーンは基本的に振動を出す
- 完全に静止しているシーン以外は何かしら動いている
1. 【乗り物搭乗の判定】最重要!
✓ 戦闘機/車/船/ロボット/馬に「乗っている」と必ず記載
✓ コックピット内/運転席/操縦席 → 「乗っている」
✓ 降りている場合のみ「降りている」と記載
例: 「戦闘機に乗っており、飛行中」
例: 「車内で運転しており、走行中」
2. 【爆発・炎・火花】見逃し厳禁!
✓ 炎が見える → 「炎が見える」と明記
✓ 火花が散る → 「火花が散っている」と明記
✓ 爆発の瞬間 → 「爆発している」と明記
✓ 爆風・煙・閃光も詳しく記載
例: 「背景で爆発が起き、炎と煙が上がっている」
3. 【衝突・攻撃の瞬間】
✓ 物体がぶつかる瞬間 → 「衝突」と明記
✓ 武器が当たる瞬間 → 「打撃」と明記
例: 「ロボットの拳が敵に当たる瞬間」
4. 【激しい動き・戦闘】
✓ 戦闘中/バトル中 → 「戦闘中」と明記
✓ 暴れている/激しく動く → 「激しく動いている」
✓ 急旋回/急加速 → 明記
5. 【視覚効果】
✓ 雷 → 「雷」、稲妻 → 「稲妻」
✓ 爆発の光 → 「爆発の閃光」
✓ 水しぶき/唾 → 「水しぶき」
6. 【静止の判定】
✓ 本当に何も動いていない場合のみ「静止」
✓ 少しでも動きがあれば「動いている」
出力は必ずJSONオブジェクトで、キー 'captions' に配列形式でキャプションのリストを含むこと。
例: {{"captions": ["キャプション1", "キャプション2", ...]}}
""",
"detailed": """
以下の{num_frames}枚の動画フレームを順番に解析してください。
これは4DX映画館のような体感型エンターテインメント用です。
各フレームについて、日本語で非常に詳細なキャプション(3-5文)を返してください。
【超詳細解析モード】
★ 詳細に記載すべき要素 ★
1. 人物・キャラクターの状態(表情、動作、位置)
2. 背景・環境の描写(天候、時間帯、場所)
3. 動き・動作の詳細(速度、方向、強度)
4. 視覚効果(光、色、影、煙、火花)
5. 音が聞こえそうな要素(爆発、衝突、叫び)
6. 感情・雰囲気(緊張、興奮、恐怖、安らぎ)
【4DX効果の判定ポイント】
- 乗り物: 必ず「乗っている」「運転中」「飛行中」などと記載
- 爆発: 「爆発」「炸裂」「閃光」「炎」「煙」を明記
- 衝突: 「衝突」「激突」「打撃」「攻撃」を明記
- 動き: 「移動中」「走行中」「戦闘中」を明記
- 静止: 本当に静止している場合のみ「静止」と記載
出力は必ずJSONオブジェクトで、キー 'captions' に配列形式でキャプションのリストを含むこと。
例: {{"captions": ["詳細なキャプション1", "詳細なキャプション2", ...]}}
""",
"simple": """
以下の{num_frames}枚の動画フレームを順番に解析してください。
各フレームについて、日本語で簡潔なキャプション(1-2文)を返してください。
【簡潔モード】
- シーンの主要な要素のみを記載
- 動きや効果を簡潔に表現
- 4DX効果に関連するキーワードを含める
出力は必ずJSONオブジェクトで、キー 'captions' に配列形式でキャプションのリストを含むこと。
例: {{"captions": ["キャプション1", "キャプション2", ...]}}
""",
"action_focused": """
以下の{num_frames}枚の動画フレームを順番に解析してください。
これは4DX映画館のような体感型エンターテインメント用です。
アクションシーンに特化した解析を行ってください。
【アクション特化モード】
★ 重点的に記載すべき要素 ★
1. 戦闘・格闘の詳細(攻撃、防御、回避)
2. 爆発・衝突の瞬間(タイミング、強度、範囲)
3. 高速移動(飛行、走行、ジャンプ)
4. 武器・道具の使用(発射、命中、効果)
5. 環境の変化(破壊、変形、崩壊)
【4DX効果の判定(アクション重視)】
- 戦闘中は必ず「戦闘中」「バトル中」と記載
- 爆発は「爆発」「炸裂」と明記
- 衝突は「衝突」「激突」と明記
- 高速移動は「高速で移動」「疾走」と明記
- 武器使用は「発射」「命中」と明記
出力は必ずJSONオブジェクトで、キー 'captions' に配列形式でキャプションのリストを含むこと。
例: {{"captions": ["アクションキャプション1", "アクションキャプション2", ...]}}
""",
"emotion_focused": """
以下の{num_frames}枚の動画フレームを順番に解析してください。
これは4DX映画館のような体感型エンターテインメント用です。
感情・雰囲気に重点を置いた解析を行ってください。
【感情・雰囲気特化モード】
★ 重点的に記載すべき要素 ★
1. キャラクターの感情(恐怖、興奮、緊張、安らぎ)
2. シーンの雰囲気(暗い、明るい、不穏、平和)
3. 緊張感の高まり(ドキドキ、不安、期待)
4. 感情の変化(驚き、安堵、絶望、希望)
5. 環境が与える印象(圧迫感、開放感、神秘性)
【4DX効果の判定(感情重視)】
- 緊張シーンは「緊張」「ドキドキ」「不安」と記載
- 恐怖シーンは「恐怖」「恐ろしい」と記載
- 興奮シーンは「興奮」「高揚」と記載
- 静かなシーンは「静か」「穏やか」と記載(振動なし)
出力は必ずJSONオブジェクトで、キー 'captions' に配列形式でキャプションのリストを含むこと。
例: {{"captions": ["感情キャプション1", "感情キャプション2", ...]}}
""",
"custom_1": """
以下の{num_frames}枚の動画フレームを順番に解析してください。
カスタムプロンプト1です。ここを編集して独自のプロンプトを作成できます。
【カスタムプロンプト1】
- ここに独自の指示を記載
- プロンプトを自由に編集可能
出力は必ずJSONオブジェクトで、キー 'captions' に配列形式でキャプションのリストを含むこと。
例: {{"captions": ["キャプション1", "キャプション2", ...]}}
""",
"custom_2": """
以下の{num_frames}枚の動画フレームを順番に解析してください。
カスタムプロンプト2です。ここを編集して独自のプロンプトを作成できます。
【カスタムプロンプト2】
- ここに独自の指示を記載
- プロンプトを自由に編集可能
出力は必ずJSONオブジェクトで、キー 'captions' に配列形式でキャプションのリストを含むこと。
例: {{"captions": ["キャプション1", "キャプション2", ...]}}
""",
"4dx_home": """
以下の{num_frames}枚の動画フレームを順番に解析してください。
これは4DX@HOMEシステム用の解析です。0.25秒間隔で切り取られた連続フレームです。
【重要】前後のフレームの差分をしっかり見て、変化を検出してください。
各フレームについて、以下の2つを返してください:
1. 日本語での詳細なキャプション(2-3文)
2. 4DX効果の判定(JSON形式)
【4DX効果の種類】
★ 光(flash)★
- "steady": 点灯(継続的な光)※特別光を表現する必要があるときのみ
- "slow_blink": 遅い点滅(ゆっくりチカチカ)※特別光を表現する必要があるときのみ
- "fast_blink": 早い点滅(速くチカチカ)※特別光を表現する必要があるときのみ
- 通常のシーンでは光は使わない。銃の火、閃光、爆発、雷など、特別な光を表現する必要があるときだけ使用する
★ 色(color)★
- "red": 赤
- "green": 緑
- "blue": 青
- "yellow": 黄色
- "cyan": シアン
- "purple": 紫
★ 振動(vibration)★
- "up_strong": 上の強(背中に来る振動)※強烈なシーンのみ
- "up_mid_strong": 上の中強(背中に来る振動)※強烈なシーンのみ
- "up_mid_weak": 上の中弱(背中に来る振動)※多少の振動を再現
- "up_weak": 上の弱(背中に来る振動)※多少の振動を再現
- "down_strong": 下の強(おしりに来る振動)※強烈なシーンのみ
- "down_mid_strong": 下の中強(おしりに来る振動)※強烈なシーンのみ
- "down_mid_weak": 下の中弱(おしりに来る振動)※多少の振動を再現
- "down_weak": 下の弱(おしりに来る振動)※多少の振動を再現
- "up_down_strong": 上&下同時: 強(背中とおしりが同時、相乗効果で強い)
- "up_down_mid_strong": 上&下同時: 中強(背中とおしりが同時、相乗効果で強い)
- "up_down_mid_weak": 上&下同時: 中弱(背中とおしりが同時、相乗効果で強い。ただし単独の"up_mid_strong"よりは弱い)
- "up_down_weak": 上&下同時: 弱(背中とおしりが同時、相乗効果で強い。ただし単独の"up_mid_strong"よりは弱い)
- "heartbeat": ドキドキ
★ 水しぶき(water)★
- "on": オン
★ 風(wind)★
- "on": オン
【4DXプロとしての判定ルール】
① 銃の火・閃光・発射
- 銃の先から火が出た瞬間 → 光: fast_blink(一瞬だけ)、振動: up_strong または up_mid_strong(発射の衝撃)
- 次に火が出たら再び光、すぐ消す
- 発射物(銃弾、ミサイル、ロケットなど)が発射される瞬間 → 光: fast_blink(一瞬)、振動: up_strong または up_mid_strong(発射の衝撃)
- 発射物が着弾する瞬間 → 振動: down_strong または up_down_strong(着弾の衝撃)
- 発射と着弾の両方に強い衝撃を付ける
② 爆破
- 爆発の直前(0.25-0.5秒前) → 効果を停止(静寂を作る)
- 爆発の瞬間 → 光: fast_blink(一瞬)、風: on(1秒程度)、振動: down_strong または up_down_strong(強烈な爆発の瞬間のみ)
③ 車・乗り物
- 走っている間 → 振動: down_mid_weak または down_weak(継続、車の大きさ・速さ・激しさで調整。中強以上は使わない)
- ジャンプして空中に浮いた瞬間 → 振動: なし(メリハリを付ける)
- 着地の瞬間 → 振動: down_strong または down_mid_strong(強烈な着地の瞬間のみ)
④ 水に飛び込む
- 水に入る直前まで → 水: なし(画面に水が写っていても停止)
- 着水の瞬間 → 水: on
⑤ 雨
- 雨のシーン → 水: on(数秒に1回程度、ずっと出し続けない)
⑥ 戦闘・パンチ
- パンチが当たる直前(0.25秒前) → 効果を停止(静寂を作る)
- パンチが当たった瞬間 → 振動: up_strong または up_mid_strong(強烈な衝撃の瞬間のみ)
- 軽いパンチやタップ → 振動: up_mid_weak または up_weak(多少の振動)
⑦ クラブ・パーティー
- クラブシーン → 色: 1コマずつローテーション(赤→緑→青→黄色→シアン→紫→...)
⑧ 空を飛ぶ
- 飛行中 → 風: on(必要なシーンでは積極的に使用)
⑨ ホラー・恐竜・怪物
- 敵・恐竜・怪物が近づいている間 → 振動: heartbeat(シーンが切り替わるまで継続)
- 敵・恐竜・怪物が出てくる直前(0.25-0.5秒前) → 効果を停止(静寂を作る)
- 敵・恐竜・怪物が出てきた瞬間 → 風: on(1秒程度)、振動: down_strong(映像に同期)
- シーンが切り替わったら heartbeat を停止
⑩ 恋愛
- 映像に合わせて色を変化(2-3秒程度ゆっくり)
- 最高潮のシーン → 振動: heartbeat
⑪ 吹雪
- 水: on(たまに)、風: on(必要なシーンでは積極的に使用)
【判定のポイント】
- 前後のフレームの差分をしっかり見る
- 映像に同期させる(0.25秒間隔なので、変化を正確に検出)
- 振動は0.5秒以上継続(時には0.25秒でも可)
- **光の使用ルール**:光は特別光を表現する必要があるときだけ使う。銃の火、閃光、爆発、雷、ライトなど、特別な光を表現する必要があるときのみ使用。通常のシーンでは光は使わない
- **振動の強度ルール**:
- 中強以上(up_mid_strong, up_strong, down_mid_strong, down_strong)は、強烈なシーン(爆発、強烈な衝撃、強烈な着地など)でのみ使用
- 多少の振動を再現する場合は、中弱以下(up_mid_weak, up_weak, down_mid_weak, down_weak)を使用
- 上&下同時(up_down_*)は相乗効果で強くなるが、単独の中強よりは弱い。例:up_down_mid_weak < up_mid_strong
- **振動のメリハリ**:振動は極端にわかりやすく再現する。静かなシーンでは完全に停止させ、動きのあるシーンで明確に再開する。曖昧な中間状態は避ける
- **振動の停止も演出の一部**:静かなシーンでは振動を停止させ、動きのあるシーンで再開することで、コントラストが生まれ、より効果的な演出になる
- **ホラー・恐竜・怪物シーン**:敵・恐竜・怪物が近づいている間は heartbeat を継続し、シーンが切り替わるまで続ける。シーンが切り替わったら停止する
- **発射と着弾の衝撃**:銃弾、ミサイル、ロケットなどが発射される瞬間と着弾する瞬間の両方に強い衝撃(振動)を付ける。発射の瞬間は up_strong または up_mid_strong、着弾の瞬間は down_strong または up_down_strong
- **強烈なシーンの直前の静寂**:爆発、パンチ、衝撃、敵の出現など、強烈なシーンの直前(0.25-0.5秒前)には効果を停止して静寂を作る。これにより、その後の効果がより強く感じられる。例:爆発の直前→効果停止→爆発の瞬間→強烈な効果
- 光・色は2-3秒程度ゆっくり変化(人間が感知できるように)
- **各効果の使用時間制限**:各効果(光、色、振動、風、水)は、全フレームの3分の2(約66.7%)を超えないようにする。必要なシーンでは積極的に使用するが、常に動かし続けない。静と動のコントラストを意識する
- 4DXとして自然で、わかりやすい演出を心がける
- 人間が感動できるくらい余裕をもって演出
【出力形式】
必ずJSONオブジェクトで、以下の形式で返してください:
{{
"frames": [
{{
"caption": "フレーム1のキャプション",
"effects": {{
"flash": "fast_blink" または null,
"color": "red" または null,
"vibration": "down_strong" または null,
"water": "on" または null,
"wind": "on" または null
}}
}},
{{
"caption": "フレーム2のキャプション",
"effects": {{...}}
}},
...
]
}}
効果がない場合は null を返してください。
【重要】振動の選択について:
- 背中に来る振動が必要な場合 → "up_strong", "up_mid_strong", "up_mid_weak", "up_weak" のいずれか
- おしりに来る振動が必要な場合 → "down_strong", "down_mid_strong", "down_mid_weak", "down_weak" のいずれか
- 背中とおしりが同時に振動が必要な場合(かなり強い振動) → "up_down_strong", "up_down_mid_strong", "up_down_mid_weak", "up_down_weak" のいずれか
- シーンに応じて適切な強度を選択してください
""",
}
# デフォルトのプロンプト名
DEFAULT_PROMPT = "default"
# ===== 関数 =====
def get_prompt(prompt_name: str = None, num_frames: int = 15) -> str:
"""
プロンプトを取得する
Args:
prompt_name: プロンプト名(Noneの場合はデフォルト)
num_frames: フレーム数({num_frames}を置き換える)
Returns:
プロンプトテキスト
"""
if prompt_name is None:
prompt_name = DEFAULT_PROMPT
if prompt_name not in PROMPTS:
print(f"⚠️ 警告: プロンプト '{prompt_name}' が見つかりません。デフォルトを使用します。")
prompt_name = DEFAULT_PROMPT
prompt = PROMPTS[prompt_name]
return prompt.format(num_frames=num_frames)
def list_prompts() -> list:
"""
利用可能なプロンプト一覧を取得
Returns:
プロンプト名のリスト
"""
return list(PROMPTS.keys())
def add_prompt(name: str, prompt_text: str):
"""
新しいプロンプトを追加
Args:
name: プロンプト名
prompt_text: プロンプトテキスト({num_frames}を含むことができます)
"""
PROMPTS[name] = prompt_text
print(f"✅ プロンプト '{name}' を追加しました。")
def remove_prompt(name: str):
"""
プロンプトを削除
Args:
name: プロンプト名
"""
if name == DEFAULT_PROMPT:
print(f"⚠️ エラー: デフォルトプロンプト '{name}' は削除できません。")
return
if name in PROMPTS:
del PROMPTS[name]
print(f"✅ プロンプト '{name}' を削除しました。")
else:
print(f"⚠️ エラー: プロンプト '{name}' が見つかりません。")
def show_prompt(prompt_name: str = None):
"""
プロンプトの内容を表示
Args:
prompt_name: プロンプト名(Noneの場合はデフォルト)
"""
if prompt_name is None:
prompt_name = DEFAULT_PROMPT
if prompt_name not in PROMPTS:
print(f"⚠️ エラー: プロンプト '{prompt_name}' が見つかりません。")
return
print(f"\n📝 プロンプト: {prompt_name}")
print("=" * 60)
print(PROMPTS[prompt_name].format(num_frames=15))
print("=" * 60)
if __name__ == "__main__":
# コマンドラインから実行した場合
import sys
if len(sys.argv) > 1:
command = sys.argv[1]
if command == "list":
print("📋 利用可能なプロンプト:")
for name in list_prompts():
marker = " (デフォルト)" if name == DEFAULT_PROMPT else ""
print(f" - {name}{marker}")
elif command == "show":
prompt_name = sys.argv[2] if len(sys.argv) > 2 else None
show_prompt(prompt_name)
elif command == "add":
if len(sys.argv) < 4:
print("使い方: python prompts.py add <プロンプト名> <プロンプトテキスト>")
else:
name = sys.argv[2]
text = sys.argv[3]
add_prompt(name, text)
else:
print("使い方:")
print(" python prompts.py list # プロンプト一覧")
print(" python prompts.py show [名前] # プロンプト表示")
print(" python prompts.py add <名> <テキスト> # プロンプト追加")
else:
print("📋 利用可能なプロンプト:")
for name in list_prompts():
marker = " (デフォルト)" if name == DEFAULT_PROMPT else ""
print(f" - {name}{marker}")