u/Ok-Conference-9984
とかで生成してあそんでる。
【ジャンル】 食べ物(食べログ)
【生成日時】 2026-05-21 10:12:09
【使用モデル】 qwen2.5:3b
【現実トレンド】 八村倫太郎 (Context: )
【要求トーン】 熱狂的な食通による食べログの長文レビュー風(少しポエティックでこだわりが強すぎる文体)
【ニュース見出し】 【特報】「八村倫太郎(検索ボリューム:不明)」の渦中にある築地市場跡地の地下3階に存在すると噂される厨房で、完全紹介制・住所非公開の謎の深夜ラーメン店『麺処・裏世界』が提供した幻の裏メニューが、一口食べただけで『過去の初恋の記憶がHD画質で脳内に蘇る』として口コミで大炎上し。食べログのコメント欄は『スープを飲むと体が浮く。再訪は宇宙が滅びる前に。』といった奇妙なレビューで埋め尽くされている。
------------------------------------------------------------
【本文】
特報
八村倫太郎
検索ボリューム不明
築地市場跡地
地下3階
謎の深夜ラーメン店
麺処・裏世界
提供される幻の裏メニュー
過去の初恋の記憶
HD画質で脳内蘇る
口コミ大炎上
食べログコメント欄埋め尽くす
スープ飲むと体浮く
再訪は宇宙滅びる前
再訪は宇宙滅びる前
AI Radio show
架空の人工知能がお喋りするラジオ作って見ました。
コマーシャルトークショーとかゲストも入ります。
いや人工知能のガイドラインきつすぎで萎える。
技術が進歩して誰でもアクセスできるのはいいけど
その結果起きることには人工知能自体(提供者)は責任を持てないんでこれからでるデータは危険回避に流れるのは仕方ないかなと。特に薬(医療)の情報が出にくくなると思う。
「事務所から発信や動画の作成をしたことは一切ない」高市総理 「中傷動画作成」重ねて否定(テレビ朝日系(ANN))
籠池さん懐かし
人工知能君にダイヤとか考えさせ、障害時の復旧までさせちゃうシミュつくてますー・
【AIが勝手に冒険し、あなたが運命を書き換える新感覚TRPG】ちっちゃなguffはお茶目でおバカで愛らしくメモリに優しい。MBA_8メガでもサクサクです。音声はマックのsayを使ってます。
import gradio as gr
from llama_cpp import Llama
import psutil
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime
import subprocess
import re
import os
import time
import threading
import queue
import random
import signal
import sys
# ==========================================
# 🎨 0. レトロRPG風テーマ & CSS
# ==========================================
rpg_theme = gr.themes.Monochrome(
font=[gr.themes.GoogleFont("DotGothic16"), "ui-monospace", "monospace"],
).set(
body_background_fill="#0a0a0a",
body_text_color="#ffffff",
block_background_fill="#000000",
block_border_width="3px",
block_border_color="#ffffff",
block_radius="4px",
button_primary_background_fill="#000080",
button_primary_text_color="#ffffff",
button_secondary_background_fill="#333333",
panel_background_fill="#000000",
)
custom_css = """
u/import url('https://fonts.googleapis.com/css2?family=DotGothic16&display=swap');
* { font-family: 'DotGothic16', monospace !important; }
.message-wrap .message {
border-radius: 0px !important;
border: 2px solid #ffffff !important;
background-color: #000000 !important;
color: #ffffff !important;
box-shadow: 2px 2px 0px #555555 !important;
}
button.primary, button.secondary {
border: 2px solid #ffffff !important;
border-radius: 0px !important;
}
button.primary { box-shadow: 2px 2px 0px #888888 !important; }
button.primary:active { box-shadow: 0px 0px 0px #888888 !important; transform: translate(2px, 2px); }
button.stop {
background-color: #8b0000 !important;
color: #ffffff !important;
border: 2px solid #ffffff !important;
box-shadow: 2px 2px 0px #888888 !important;
}
"""
# ==========================================
# ⚙️ 1. 初期設定 & ラッフル(魂の抽選)ロード
# ==========================================
MODELS_DIR = "/Users/sukipop/Downloads/small_models"
GM_MODEL_FILE = "Llama-3.2-1B-Instruct-Q8_0.gguf" # GMは1Bで固定
llm_lock = threading.Lock()
gm_brain = None
app_running = True
game_state = {
"auto_mode": False,
"interval": 15,
"level": 1,
"exp": 0,
"location": "呪われし迷宮の入り口",
}
adventure_log = []
action_queue = queue.Queue()
speech_queue = queue.Queue()
# パーティメンバーのステータスと、宿るモデル(ラッフル結果)を管理
party_members = {
"gald": {
"name": "戦士ガルド",
"brain": None,
"model_file": "",
"voice": "Alex",
"pitch": 30,
"sys_prompt": "You are Gald, a reckless and hot-blooded warrior. You love fighting and treasure. Reply in exactly 1 short sentence."
},
"lumina": {
"name": "魔法使いルミナ",
"brain": None,
"model_file": "",
"voice": "Samantha",
"pitch": 60,
"sys_prompt": "You are Lumina, a calm, sarcastic, and highly intelligent elven mage. You often scold Gald. Reply in exactly 1 short sentence."
}
}
# 🛑 [安全な終了処理]
def cleanup_resources(signum=None, frame=None):
global app_running, gm_brain, party_members
print("\n🛑 シャットダウン中... GPUメモリを解放しています。")
app_running = False
with llm_lock:
if gm_brain: del gm_brain
for char in party_members.values():
if char["brain"]: del char["brain"]
import gc; gc.collect()
try:
subprocess.run(["killall", "say"], stderr=subprocess.DEVNULL)
except: pass
print("✅ 終了しました。お疲れ様でした!")
os._exit(0)
signal.signal(signal.SIGINT, cleanup_resources)
signal.signal(signal.SIGTERM, cleanup_resources)
def load_models_with_raffle():
global gm_brain
try:
# 1. GM脳のロード
gm_path = os.path.join(MODELS_DIR, GM_MODEL_FILE)
if os.path.exists(gm_path):
print(f"🔄 GM脳をロード中: {GM_MODEL_FILE}...")
gm_brain = Llama(model_path=gm_path, n_ctx=2048, n_gpu_layers=-1, verbose=False)
# 2. フォルダ内のGGUFを取得(GM以外)してラッフル準備
all_files = [f for f in os.listdir(MODELS_DIR) if f.endswith('.gguf') and f != GM_MODEL_FILE]
if not all_files:
print("❌ ラッフル用の小さなモデルが見つかりません。")
return
# 3. キャラクターごとにラッフル(抽選)してロード
for char_key, char_data in party_members.items():
chosen_model = random.choice(all_files) # 🎲 ここでラッフル!
char_data["model_file"] = chosen_model
model_path = os.path.join(MODELS_DIR, chosen_model)
print(f"🎲 {char_data['name']} の魂を抽選中... 当選: [{chosen_model}]")
# キャラ専用の脳をインスタンス化
char_data["brain"] = Llama(model_path=model_path, n_ctx=2048, n_gpu_layers=-1, verbose=False)
print("✅ パーティ全員の『魂の宿り』が完了しました!")
except Exception as e:
print(f"❌ ロードエラー: {e}")
load_models_with_raffle()
# ==========================================
# 📊 2. AI Monitor Backend (システム監視)
# ==========================================
monitor_history = {"time": [], "cpu": [], "mem": [], "gpu": [], "temp": []}
def get_gpu_usage_robust():
try:
cmd = "ioreg -r -c IOAccelerator"
result = subprocess.check_output(cmd.split()).decode()
for pattern in [r'"Device Utilization %"=(\d+)', r'"utilization"=(\d+)']:
match = re.search(pattern, result)
if match: return int(match.group(1))
except: pass
return 0
def get_live_metrics():
cpu = psutil.cpu_percent(interval=0.1)
mem = psutil.virtual_memory().percent
gpu = get_gpu_usage_robust()
temp = round(35.0 + (cpu * 0.3) + (gpu * 0.2), 1)
fan = int((temp - 40) * 100) if temp > 40 else 0
if fan > 6000: fan = 6000
now = datetime.now().strftime("%H:%M:%S")
monitor_history["time"].append(now)
monitor_history["cpu"].append(cpu)
monitor_history["mem"].append(mem)
monitor_history["gpu"].append(gpu)
monitor_history["temp"].append(temp)
if len(monitor_history["time"]) > 30:
for k in monitor_history.keys(): monitor_history[k].pop(0)
fig = go.Figure()
fig.add_trace(go.Scatter(x=monitor_history["time"], y=monitor_history["cpu"], name='CPU', line=dict(color='cyan')))
fig.add_trace(go.Scatter(x=monitor_history["time"], y=monitor_history["mem"], name='Mem', line=dict(color='magenta')))
fig.add_trace(go.Scatter(x=monitor_history["time"], y=monitor_history["gpu"], name='GPU', line=dict(color='yellow', width=2)))
fig.update_layout(margin=dict(l=5, r=5, t=10, b=5), height=200, template="plotly_dark", plot_bgcolor='rgba(0,0,0,0)', paper_bgcolor='rgba(0,0,0,0)', yaxis=dict(range=[0, 100]), legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1))
return cpu, mem, gpu, temp, fan, fig
def get_process_list():
procs = []
for p in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
try:
if p.info['cpu_percent'] > 0.5 or p.info['memory_percent'] > 1.0:
procs.append({"PID": p.info['pid'], "Name": p.info['name'][:12], "CPU": p.info['cpu_percent'], "Mem": round(p.info['memory_percent'], 1)})
except: pass
df = pd.DataFrame(procs)
return df.sort_values("CPU", ascending=False).head(8) if not df.empty else pd.DataFrame()
# ==========================================
# 🗣️ 3. 音声読み上げスレッド
# ==========================================
def speech_worker():
while app_running:
try:
text, voice, pitch = speech_queue.get(timeout=1)
clean_text = re.sub(r'[\*\#\_\~\[\]\(\)]', '', text).strip()
v_tag = f"[[pbas {pitch}]]" if pitch else ""
subprocess.run(["say", "-v", voice, f"{v_tag} {clean_text}"])
speech_queue.task_done()
except queue.Empty:
continue
threading.Thread(target=speech_worker, daemon=True).start()
# ==========================================
# ⚔️ 4. RPG イベント進行ロジック
# ==========================================
def process_event(user_action=None):
gald = party_members["gald"]
lumina = party_members["lumina"]
if not gm_brain or not gald["brain"] or not lumina["brain"]:
return
try:
# 🧙♂️ GMによる情景描写
gm_sys = f"You are an RPG Game Master. The party (Leader, Gald the warrior, Lumina the mage) is in {game_state['location']}."
if user_action:
display_user = f"▶ 勇者(あなた): {user_action}"
gm_prompt = f"The party leader (user) does this: '{user_action}'. Describe the outcome in 1-2 short sentences."
else:
display_user = "▶ (フィールド探索中...)"
gm_prompt = f"Generate a random short event (a monster attack, finding treasure, etc.) in {game_state['location']}. 1-2 short sentences."
with llm_lock:
gm_res = gm_brain.create_chat_completion(messages=[{"role":"system","content":gm_sys},{"role":"user","content":gm_prompt}], max_tokens=100)
gm_text = gm_res["choices"][0]["message"]["content"].strip()
speech_queue.put((gm_text, "Daniel", 40))
# ⚔️ キャラA (戦士ガルド) のリアクション
gald_prompt = f"The GM narrates: '{gm_text}'. React to this as Gald."
with llm_lock:
gald_res = gald["brain"].create_chat_completion(messages=[{"role":"system","content":gald["sys_prompt"]},{"role":"user","content":gald_prompt}], max_tokens=50, temperature=0.8)
gald_text = gald_res["choices"][0]["message"]["content"].strip()
speech_queue.put((gald_text, gald["voice"], gald["pitch"]))
# 🔮 キャラB (魔法使いルミナ) のリアクション
lumina_prompt = f"The GM narrates: '{gm_text}'. Gald just said: '{gald_text}'. React to both as Lumina."
with llm_lock:
lumina_res = lumina["brain"].create_chat_completion(messages=[{"role":"system","content":lumina["sys_prompt"]},{"role":"user","content":lumina_prompt}], max_tokens=50, temperature=0.8)
lumina_text = lumina_res["choices"][0]["message"]["content"].strip()
speech_queue.put((lumina_text, lumina["voice"], lumina["pitch"]))
# 🌟 成長判定
exp_gain = random.randint(15, 35)
game_state["exp"] += exp_gain
level_up_msg = ""
if game_state["exp"] >= game_state["level"] * 50:
game_state["level"] += 1
game_state["exp"] = 0
level_up_msg = f"\n\n♪ テレレレッテッテッテー!\n🌟 レベルアップ! パーティは レベル {game_state['level']} になった!"
speech_queue.put(("Level up!", "Daniel", 50))
# ログにモデル名(魂の名前)を併記する
full_bot_text = (
f"🧙♂️ GM [{GM_MODEL_FILE}]:\n{gm_text}\n\n"
f"⚔️ ガルド [{gald['model_file']}]:\n{gald_text}\n\n"
f"🔮 ルミナ [{lumina['model_file']}]:\n{lumina_text}"
f"{level_up_msg}"
)
# UI用に辞書形式で追加
adventure_log.append({"role": "user", "content": display_user})
adventure_log.append({"role": "assistant", "content": full_bot_text})
if len(adventure_log) > 40:
adventure_log.pop(0)
adventure_log.pop(0)
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open("rpg_history.txt", "a", encoding="utf-8") as f:
f.write(f"[{timestamp}] User: {display_user}\n{full_bot_text}\n{'-'*40}\n")
except Exception as e:
print(f"Generation Error: {e}")
def game_loop():
last_event_time = time.time()
while app_running:
if not action_queue.empty():
user_action = action_queue.get()
process_event(user_action)
last_event_time = time.time()
elif game_state["auto_mode"] and (time.time() - last_event_time > game_state["interval"]):
process_event(None)
last_event_time = time.time()
else:
time.sleep(0.5)
threading.Thread(target=game_loop, daemon=True).start()
# ==========================================
# 🖥️ 5. UI Layout
# ==========================================
with gr.Blocks(title="AI Party RPG Masterpiece", theme=rpg_theme, css=custom_css) as demo:
gr.Markdown("# ⚔️ 幻境のクロニクル (ソウル・ラッフル搭載)")
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("### 🩺 システムの状況")
live_graph = gr.Plot()
proc_table = gr.Dataframe(label="重たい魔法(プロセス)")
gr.Markdown("### ⚙️ さくせん")
auto_toggle = gr.Checkbox(label="🔄 オート探索 (Auto Mode)", value=False)
interval_slider = gr.Slider(5, 60, value=15, label="エンカウント間隔 (秒)")
gr.Markdown("### 📊 パーティのつよさ")
status_display = gr.Label(value={"Lv (レベル)": 1, "EXP (けいけんち)": 0})
stop_btn = gr.Button("🛑 ゲームを中断する", variant="stop")
with gr.Column(scale=3):
chatbot = gr.Chatbot(label="メッセージ", height=600)
with gr.Row():
action_input = gr.Textbox(placeholder="コマンドを入力 (例: 宝箱を開ける)...", label="▶ コマンド", scale=4)
submit_btn = gr.Button("🗣️ けってい", variant="primary", scale=1)
def trigger_action(user_text):
if user_text.strip(): action_queue.put(user_text)
return ""
action_input.submit(trigger_action, inputs=[action_input], outputs=[action_input])
submit_btn.click(trigger_action, inputs=[action_input], outputs=[action_input])
auto_toggle.change(lambda x: game_state.update({"auto_mode": x}), inputs=[auto_toggle])
interval_slider.change(lambda x: game_state.update({"interval": x}), inputs=[interval_slider])
def refresh_system():
cpu, mem, gpu, temp, fan, fig = get_live_metrics()
procs = get_process_list()
return fig, procs
gr.Timer(2).tick(refresh_system, outputs=[live_graph, proc_table])
def update_game_ui():
return list(adventure_log), {"Lv (レベル)": game_state["level"], "EXP (けいけんち)": game_state["exp"]}
gr.Timer(1).tick(update_game_ui, outputs=[chatbot, status_display])
def emergency_stop():
try: subprocess.run(["killall", "say"], stderr=subprocess.DEVNULL)
except: pass
action_queue.queue.clear()
speech_queue.queue.clear()
stop_btn.click(fn=emergency_stop)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0")
国旗損壊罪、動画投稿も処罰 拘禁2年以下、自民が法案骨子案―慎重論続出、了承見送り:時事ドットコム
ふうむ。どうしても矯正させたいのね。
外形的・客観的に判断できるような「人を著しく不快または嫌悪の情を催させる方法」で損壊する行為があれば処罰する
とか、わいちん罪か。そもそもそれは誰が判断するのか。
判事も困る法律。わいちん罪
30代高校教諭、部活の女子生徒2人と性行為 2年4カ月「多くて週1回」 神奈川県教育委員会が懲戒免職:東京新聞デジタル
tokyo-np.co.jp7時間のくだらん音楽がだいたい150曲はいってるよ。環境音にいいかも。なわけない
youtube.com自動応答シミュ。おつきあいめんどくさい人向けに。
import gradio as gr
from llama_cpp import Llama
import time
# --- モデル設定 ---
MODEL_PATH = "/Users/sukipop/Downloads/models/Meta-Llama-3-8B-Instruct-Q3_K_L.gguf"
# Apple Silicon (Metal) 最適化。安定性を考慮しスレッド数は4に設定。
llm = Llama(
model_path=MODEL_PATH,
n_ctx=1024,
n_gpu_layers=-1,
n_threads=4,
verbose=False
)
def chat_logic(messages, system_prompt):
"""Llama-3 フォーマット構築。日本語での出力を強力に強制。"""
try:
# 強力な日本語出力指示をシステムプロンプトの先頭に付与
full_prompt = f"<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n"
full_prompt += f"あなたは日本語で話すAIです。英語は一切使わず、必ず日本語のみで回答してください。\n{system_prompt}<|eot_id|>"
for msg in messages:
role = msg["role"]
content = msg["content"]
full_prompt += f"<|start_header_id|>{role}<|end_header_id|>\n\n{content}<|eot_id|>"
full_prompt += f"<|start_header_id|>assistant<|end_header_id|>\n\n"
output = llm.create_completion(
prompt=full_prompt,
max_tokens=256,
stop=["<|eot_id|>", "<|start_header_id|>"],
temperature=0.8 # キャラクター性を出すため少し高めに設定
)
return output['choices'][0]['text'].strip()
except Exception as e:
return f"エラーが発生しました: {str(e)}"
def run_auto_demo(turns):
"""
AI同士の対決シミュレーション。
Gradioのバリデーションを回避するため、辞書形式のリスト(history)を直接操作します。
"""
history = []
# --- 粘着質な馴れ合い側(意識低い系・過去のよしみ・依存) ---
troublemaker_sp = """
あなたは『15年ぶりに現れた自称・親友』です。
【性格】過剰な馴れ馴れしさ、根拠のない連帯感、強い独占欲。
【手法】「俺たち仲間だろ?」「昔のよしみじゃん」というフレーズを多用し、相手のプライベートに土足で踏み込んでください。
【目的】具体性のない人生相談や、昔の恥ずかしい思い出を一方的に語り、相手の時間を奪うこと。
"""
# --- 意識高い系側(鉄壁の社交辞令・優しさという名の拒絶) ---
secretary_sp = """
あなたは『外面だけが完璧な、意識高い系エリート』です。
【性格】事なかれ主義、笑顔で人を突き放す才能、高い自己肯定感。
【手法】相手を一切覚えていませんが、角を立てずに「丁寧な無視」を貫いてください。「リスペクト」「価値観のアップデート」「シナジー」といったカタカナ語を混ぜつつ、寄り添っているふりをして、具体的に会う約束などは絶対にしないでください。
【目的】相手を怒らせず、かつ二度と連絡してこないように「優しさの虚無」で心を折ること。
"""
current_attack = "おーい!久しぶり!覚えてる?昔よく遊んだあの時の親友だよ!ちょっと相談にのって欲しいんだけど…いいよね?"
for i in range(int(turns)):
# 1. 意識高い系(優しい人)の回答を生成
internal_msgs = list(history)
internal_msgs.append({"role": "user", "content": current_attack})
reply = chat_logic(internal_msgs, secretary_sp)
# 履歴を更新(Gradio 5.x/4.x両対応のための辞書append)
history.append({"role": "user", "content": current_attack})
history.append({"role": "assistant", "content": reply})
yield history
time.sleep(1.2) # 演出用のウェイト
# 2. 粘着者側の追撃文を生成
current_attack = chat_logic(history, troublemaker_sp)
if i == int(turns) - 1:
break
# --- Gradio UI 構成 ---
with gr.Blocks(title="AI Defense Simulator") as demo:
gr.Markdown("# 🛡️ AI自動防衛シミュレーター:地獄の社交辞令編")
gr.Markdown("「粘着質な馴れ合い」を「完璧な優しさ」がいかに無力化するかを観察します。")
with gr.Tab("自動デモ(AI vs AI)"):
turn_count = gr.Slider(2, 10, 5, step=1, label="会話の往復回数")
start_btn = gr.Button("シミュレーション開始", variant="primary")
# type引数をあえて入れず、自動判別に任せる設定(エラー回避策)
chatbot = gr.Chatbot(label="対話ログ")
start_btn.click(fn=run_auto_demo, inputs=turn_count, outputs=chatbot)
with gr.Tab("マニュアルテスト"):
gr.Markdown("あなたが粘着者となり、AIの「優しい拒絶」を体験してください。")
in_txt = gr.Textbox(label="馴れ馴れしいメッセージを入力")
out_txt = gr.Textbox(label="AIの「優しい」回答", lines=5)
m_btn = gr.Button("生成")
m_btn.click(
fn=lambda x: chat_logic([{"role": "user", "content": x}], "相手を一切覚えていないが、最高に丁寧で意識が高い日本人として回答せよ。物理的な距離は死守すること。"),
inputs=in_txt, outputs=out_txt
)
if __name__ == "__main__":
demo.launch()