# -*- coding: utf-8 -*-
# 台本「ロボットが店に広がるかを決めるのは、賢さか」— 考察回「壁打ちの型」の2本目（もとは LOG389）
#   2026-11-02 1版。もとの台本: 同じフォルダの 考察回_台本たたき.md（別のエージェントが記事と1文ずつ照合して直した版）
#   書き写した元: 動画/頭脳は脳のように分かれる/narration.py（形・読みの直し・自己紹介とアウトロの定型・EI_LINES）
#   codex はかけない（エイイチの指示 2026-11-02）。相づちはエイイチが「採っていい」と了承（2026-11-02）
#   エイイチのセリフ: LOG389 の本人の言葉を話し言葉に整えたもの＋本人に聞いた答え2つ（first_ei・rest_ei2）＋見立て帳1つ（who_ei の3文目）
#     「店舗のおばちゃんたち」は本人の指示で「店のスタッフさん」に言い換えた
#   出典（台本の中の事実）:
#     - 成功率99%・毎時600回・毎時6回: LOG389 の中の、X の議論（HM の指摘）をもとにした例の計算。画面の札に「例の計算」と出す
#     - 7000社以上・2万5000台以上・事業本部長の発言・JILBY の自動充電と紙パック: マイナビニュース（2026-06-29）https://news.mynavi.jp/article/newsinsight-463/
#       （発言の原文「充電が切れたり、紙パックがすぐに一杯になったりという些細なことで、すぐに人の作業に戻ってしまう」「継続的に運用改善に取り組む人材がいない」）
#     - 調理場と客席の区画・形は自治体や保健所の判断: 食品衛生法の施設基準（例: 那覇市・北九州市の基準）
# 話すのはハコブくん。エイイチの文は EI_LINES（槙原の声）
#
# 各要素: (場面の名前, 表情, 字幕の文, 後ろの間[秒])  間を省略すると 0.35 秒
FACES = ("base", "smile", "surprise", "doubt", "think", "trouble", "joy", "wink")

SEGS = [
 # 0 つかみ（問いの縦書き）
 ("hook_num", "base", "仮に、成功率99%。ロボットとしては、かなり優秀です。"),
 ("hook_num", "base", "でも、1時間に600回働くと、1時間に6回、人が駆けつけることになります。", 0.6),
 ("hook_num", "surprise", "店の人からすると、10分に1回、呼ばれるロボットです。", 0.8),
 ("hook_ei", "base", "それ、優秀なのかな。", 0.6),
 ("hook_reply", "trouble", "……僕も、自信がなくなってきました。", 1.2),
 ("hook_q", "base", "今日は、答えを伝える回ではありません。エイイチが考えている途中を、そのまま見せます。", 1.8),
 # 1 自己紹介
 ("title", "smile", "Pixels to Motors。案内役のハコブくんです。"),
 ("title", "base", "この番組では、フィジカルAIのニュースや実機の記録から、現場で使える形を考えます。", 1.2),
 ("title_eiichi", "base", "エイイチは、本業のデザイナーをしながら、ロボティクスの研究と開発をしています。｜その中で分かったことと、そこから考えた見立てを、ハコブくんがお伝えします。", 1.2),
 ("title_kabe", "smile", "今回は、エイイチの壁打ちに、ハコブくんが付き合います。", 1.8),
 # 2 持ち込み（脱線①・ボタン1回目）
 ("bring", "base", "エイイチが持ち込んだのは、海外のロボットやAIの人たちの、Xの議論でした。"),
 ("bring", "base", "お題は、ロボットにも、ChatGPTのように、一夜で世の中が変わる瞬間は来るのか。", 0.6),
 ("bring_ei", "base", "実際どうなんだろうね。", 0.6),
 ("morning", "joy", "来ます。明日の朝、僕にも来ます。起きたら、なんでもできるようになっています。", 1.5),
 ("bring2", "base", "議論には、できるようになる瞬間は来ても、広がるには時間がかかる、という声がありました。"),
 ("bring2", "base", "ChatGPTは、ブラウザを開けば試せました。間違った答えが出ても、読み流せば済みます。"),
 ("bring2", "base", "ロボットは、置く場所を空けて、止まったときの対処を決めて、店のやり方を変えないと使えません。", 1.5),
 ("button1", "smile", "……失礼しました。今のが、止まったときの対処です。", 1.8),
 # 3 やり取り1：なぜ配膳ロボットが先に広がったか（脱線③・コケる）
 ("why", "base", "では、どんな仕事から広がるのか。失敗が許せて、繰り返しの多い作業から、だと考えました。", 0.6),
 ("why_ei", "base", "そうだね。データも取りやすいし、入れるハードルも低いし、お金もかからないからね。", 0.4),
 ("why_ei", "base", "サービスロボットが広がり始めたのも、このあたりが関係してるね。", 0.6),
 ("why", "base", "ファミレスの配膳ロボットは、その条件が全部そろっていました。", 0.5),
 ("first_ei", "base", "初めて店で見たときは、とうとうロボットが店舗に入った！って感激したのを覚えてる。", 0.6),
 ("first", "joy", "……感激していただいて、ありがとうございます。同じロボットとして。", 1.0),
 ("cond", "base", "止まっても、料理が少し遅れるだけ。毎日、何百回も往復する。そして、ホールの人が集まらない。", 0.8),
 ("last", "surprise", "しかも、一番難しい所を、ロボットにやらせていません。"),
 ("last", "base", "料理をテーブルに置くのはお客さん。トレーに載せるのは店員さんです。", 0.6),
 ("last_boke", "joy", "では僕が、料理もテーブルに置きます。最後まで、責任を持って。", 1.5),
 ("last_ei", "base", "だから人に任せたんだよ。", 0.5),
 ("last2", "trouble", "……はい。配膳ロボットは、頑張らない所を決めて、広がりました。", 1.8),
 # 4 山場：扱えるか
 ("easy", "base", "もう1つ、配膳ロボットには強みがあります。"),
 ("easy", "base", "使い方は、テーブル番号のボタンを押すだけ。止まったら、どかせばいい。", 0.5),
 ("easy_ei", "base", "店のスタッフさんでも使えてるしね。ポイント高いよね。", 0.6),
 ("easy", "base", "研修もマニュアルも、ほとんどいりません。入れたあとに、エンジニアを呼ぶ手間が、ほぼ消えました。"),
 ("easy", "think", "裏を返すと、どんなに賢いロボットでも、｜止まったときにどうすればいいか｜分からなければ、広がりません。", 0.6),
 ("peak_ei", "base", "そうなんだよな。そこをしっかり見極めないと、どんなに素晴らしい技術のロボットでも、広がらないよね。", 1.5),
 ("q3", "base", "見極めは、3つの問いに分けられます。", 0.5),
 ("q3", "base", "1つ目。止まったとき、理由が分かるか。通れません、なのか、物を見失いました、なのか。"),
 ("q3", "base", "2つ目。エンジニアを呼ばずに、その場の人が戻せるか。"),
 ("q3", "trouble", "3つ目。次にどう動くか、周りの人に読めるか。読めないと、怖いです。", 0.8),
 ("demo", "surprise", "この3つは、技術のデモでは、ほとんど評価されません。", 0.5),
 ("demo_ei", "base", "デモの点数には、入らないんだね。", 0.5),
 ("demo", "wink", "はい。僕も、さっきコケた所は、点数に入れないでほしいです。", 0.4),
 ("demo_ei2", "base", "入れとくよ。", 1.8),
 # 5 やり取り2：足りなくなるのは誰か（ボタン2回目）
 ("who", "base", "話を、店の外に広げます。配膳や清掃のように、動き回る仕事のロボットは、機体が安くなってきました。", 0.6),
 ("who_ei", "base", "移動系はほんとうに早そうだし、コストも一気に安くなりそうだよね。", 0.3),
 ("who_ei", "base", "その分、入れるための営業やエンジニアが、足りなくなりそうだよね。", 0.4),
 ("who_ei", "base", "ロボットで利益が残るのは、作る側より、入れて回す側だと思う。", 0.8),
 ("who", "base", "足りなくなるのは、店の通路の幅や段差を見て、どこまでをロボットに任せるか線を引き、止まったときの対処を、店のルールにする人です。", 1.5),
 ("button2", "smile", "……ありがとうございます。今みたいに戻してくれる人が、足りないんです。", 0.8),
 ("local_ei", "base", "でも、サービスロボットを入れるのは、地方の方が切実なんだよね。この問題をどう解決できるかが、鍵だね。", 0.4),
 ("local_ei", "base", "家電量販店とか電気屋さんが、候補には上がりそうだけど、実際どうなんだろう？", 0.6),
 ("local", "base", "町の電気屋さんは、何かあればすぐ来てくれる関係を、もう持っています。止まったときの駆けつけに、向いています。"),
 ("local", "think", "ただ、どこまでロボットに任せるかを、店と一緒に決める力は、どちらにもまだありません。そこは、離れた所から専門の人が受け持つ形が、現実的だと考えました。", 0.5),
 ("local_ei2", "base", "役割を分けるんだね。", 1.8),
 # 6 やり取り3：止まらない作りと、扉（飛び出す・脱線④）
 ("iris_ei", "base", "アイリスオーヤマが、ロボットを扱ってなかったっけ？ どうしてるか、調べてみて。", 0.6),
 ("iris", "base", "調べました。報道では、これまでに7000社以上に、2万5000台以上を入れているそうです。"),
 ("iris", "trouble", "事業の責任者は、充電が切れたり、｜紙パックがすぐいっぱいになったりする｜小さなことで、｜すぐ人の作業に戻ってしまう、と話しています。"),
 ("iris", "base", "そして、運用を直し続ける人が現場にいないことが、広める上での壁だ、と。", 0.6),
 ("iris", "base", "なので、新しい清掃ロボは、掃除が終わると自分で充電に戻り、紙パックも替えやすくしました。", 1.2),
 ("iris", "joy", "……紙パックです。直し続ける人がいないなら、紙パックで人を呼ばない作りにする。", 0.6),
 ("iris_ei2", "base", "家電の会社らしいね。", 1.0),
 ("door", "base", "残る壁は、下げ膳です。食べ終わったお皿を、洗い場まで運ぶ仕事です。", 0.5),
 ("door_ei", "base", "ロボットがお店のフロントからバックヤードに行くには、扉を開けられないといけない。ここが今、目に見える問題かな。", 1.5),
 ("door_boke", "joy", "大丈夫です。扉は、体当たりで開けます。", 1.2),
 ("door", "base", "決まりで求められているのは、調理場を客席と仕切ることです。どう仕切るかは、地域の決まりや保健所の判断で変わります。"),
 ("door", "base", "なので、扉を通らない手があります。両側から取り出せる棚を客席側に置いて、ロボットはそこにトレーを置くだけにする。", 0.6),
 ("door_ei2", "base", "そうだね、現場設計だね。正直、直接洗い場までロボットが持って行けたら、最高だけどね。", 0.6),
 ("door", "base", "それは、新しい店や改装のときに、ロボットの通り道ごと設計する所から、だと考えました。", 1.8),
 # 7 まとめ（ボードが表になる）
 ("sum", "smile", "ここまでを、1枚にまとめます。", 0.5),
 ("sum", "base", "残っている壁の多くは、ロボットの賢さではありませんでした。店の作りと、仕事の分け方と、保健所との調整です。", 0.6),
 ("sum", "base", "決めていたのは、店の人が自分で扱えるように、作業と店の作りを切り直せるか。", 1.0),
 ("sum", "wink", "ちなみに、ボツになった3つは、全部、僕が自分でやろうとしたことです。", 0.5),
 ("sum_ei", "base", "全部やらなくていいんだよ。", 1.8),
 # 8 残った問い（ボタン3回目・自分で押す）
 ("rest_ei", "base", "この辺の問題を解決する力を持つ人が、フィジカルAIの時代には、重宝されそうだね。", 0.6),
 ("rest", "base", "店とロボットのあいだに立って、止まらない店に切り直す役です。ただ、その役には、まだ名前も、求人の枠もありません。", 0.5),
 ("rest", "base", "エイイチなら、どんな店から始めますか。", 0.4),
 ("rest_ei2", "base", "大型のお店から、スタートしたいね。", 0.6),
 ("rest", "base", "誰が最初にやるのかは、まだ分かりません。"),
 ("rest", "base", "この考察ノートの全文は、サイトの記事にあります。調べた決まりと数字の出どころは、概要欄に置いてあります。", 0.8),
 ("ask", "base", "あなたの店でロボットが止まったら、誰が戻しますか。", 1.5),
 ("end", "joy", "自分で戻りました。", 0.5),
 ("end_ei", "base", "それが一番えらい。", 1.8),
 # 9 アウトロ
 ("outro", "smile", "この動画が役に立ったら、高評価とチャンネル登録をお願いします。"),
 ("outro", "base", "ロボットの開発や導入の相談は、概要欄の連絡先から、エイイチに直接どうぞ。"),
 ("outro", "wink", "コメントは、エイイチが全部読んでいます。それではまた。", 1.8),
]

# エイイチの声で読む文（槙原の声を流用・video_rules.md 1-4）。場面の名前が _ei か _ei2 で終わる文
EI_LINES = [i for i, seg in enumerate(SEGS) if seg[0].endswith(("_ei", "_ei2"))]

# 「エイイチ」を残す文（自己紹介・アウトロのほかに名前が要る文）。文の頭で探す（video_rules.md 3-1）
NAME_OK = [i + 1 for i, seg in enumerate(SEGS) if seg[2].startswith((
    "今日は、答えを伝える回では", "今回は、エイイチの壁打ちに", "エイイチが持ち込んだのは",
    "エイイチなら、どんな店から"))]

READ = [
 ("Pixels to Motors", "ピクセルズ トゥー モーターズ"), ("ChatGPT", "チャットジーピーティー"), ("Xの", "エックスの"),
 ("フィジカルAI", "フィジカルエーアイ"), ("AI", "エーアイ"), ("99%", "きゅうじゅうきゅうパーセント"),
 ("600回", "ろっぴゃっかい"), ("6回", "ろっかい"), ("1時間", "いちじかん"), ("10分", "じゅっぷん"), ("1回", "いっかい"),
 ("7000社", "ななせんしゃ"), ("2万5000台", "にまんごせんだい"), ("3つ", "みっつ"), ("1つ目", "ひとつめ"), ("2つ目", "ふたつめ"),
 ("3つ目", "みっつめ"), ("1つ", "ひとつ"), ("1枚", "いちまい"),
 ("栄一", "えいいち"), ("「", ""), ("」", ""), ("｜", ""), ("…", ""),
]

ELEVEN_READ = [
    ('エイイチ', '栄一'),   # video_rules.md 3-1
    ('ChatGPT', 'チャットジーピーティー'),
    ('Xの', 'エックスの'),
    ('99%', '99パーセント'),
    # この回で先回りして足す読み（全文を聞いて確かめる）
    ('下げ膳', 'さげぜん'),
    ('7000社', '七千社'),
    ('2万5000台', '二万五千台'),
    ('600回', '六百回'),
    ('何百回', 'なんびゃっかい'),
    ('10分', 'じゅっぷん'),
    ('通り道', 'とおりみち'),
    ('一番', 'いちばん'),
    ('入れないで', 'いれないで'),   # 2026-11-02 エイイチの指摘（「はいれない」と読んでいた）
]

OVERRIDE = {}

def reading(t):
    t = OVERRIDE.get(t, t)
    for a, b in READ:
        t = t.replace(a, b)
    return t


def parse(seg):
    """1行を (場面, 表情, 字幕, 間) にそろえる"""
    if len(seg) >= 3 and seg[1] in FACES:
        scene, face, text = seg[0], seg[1], seg[2]
        pause = seg[3] if len(seg) > 3 else 0.35
    else:
        scene, face, text = seg[0], "base", seg[1]
        pause = seg[2] if len(seg) > 2 else 0.35
    return scene, face, text, pause
