# -*- coding: utf-8 -*-
# 台本「メーカーのロボットは、どこまで変えられるか」— 考察回「壁打ちの型」の3本目（もとは LOG406）
#   2026-11-02 1版。もとの台本: 同じフォルダの 考察回_台本たたき.md（別のエージェントが記事と出典に突き合わせて直した版）
#   書き写した元: 動画/現場で扱えるか/narration.py（形・読みの直し・自己紹介とアウトロの定型・EI_LINES）
#   相づちはエイイチが「採っていい」と了承（2026-11-02）。port_ei は差し替えの新案（「よその店のロボットまで…」）
#   エイイチのセリフ: LOG406 の本人の言葉を話し言葉に整えたもの＋本人に聞いた答え5つ（bring_ask_ei・car_ei・unlock_ask_ei・maker_ei・rest_ei）
#     ＋見立て帳2つ（learn_ei は記事の「Hにはかなり魅力がありそう」と見立て帳を1文にまとめた・profit_ei）
#   出典（台本の中の事実）:
#     - EU 機械規則 2023/1230 第18条（改変した人が製造者とみなされる）・第3条16号: https://eur-lex.europa.eu/eli/reg/2023/1230/oj
#     - 製造物責任法 第2条3項・第3条（業として加工して引き渡した者）
#     - 道路運送車両法 第99条の2（保安基準に適合しない改造の禁止）
#     - 中古車の運転支援を外した例（2020年・Tesla Model S。あとで戻された）: Electrek 2020-02-07 https://electrek.co/2020/02/07/tesla-takes-away-autopilot-used-car-sold-dealer/
#     - 配膳ロボットの外部接続の穴（2025年）: The Register 2025-08-29 https://www.theregister.com/2025/08/29/pudu_robots_hackable/ （会社名は出さない。手口は言わない）
#     - Model Y の約2,000ドルの加速の更新（2025年・米国）: EVANNEX 2025-06-02 https://evannex.com/blogs/news/tesla-offers-acceleration-boost-upgrade-for-the-new-model-y
#     - Unitree G1 の計算機が2つに分かれる: Unitree G1 開発の手引き https://support.unitree.com/home/en/G1_developer/quick_development
# 話すのはハコブくん。エイイチの文は EI_LINES（槙原の声）
#
# 各要素: (場面の名前, 表情, 字幕の文, 後ろの間[秒])  間を省略すると 0.35 秒
FACES = ("base", "smile", "surprise", "doubt", "think", "trouble", "joy", "wink")

SEGS = [
 # 0 つかみ（改造申請書1枚目 →「却下」・問いの縦書き）
 ("hook_ask", "joy", "エイイチ、お願いがあります。", 0.4),
 ("hook_form", "joy", "僕を、改造してください。", 0.8),
 ("hook_ei", "base", "それ、事故が起きたら、誰の責任？", 0.6),
 ("hook_reject", "trouble", "……場合によっては、改造した人だそうです。", 0.8),
 ("hook_law", "base", "EUでも日本でも、条件によっては、改造した人が、メーカーと同じ責任を負う側に入ります。", 0.6),
 ("hook_law", "base", "", 0.0),   # 2026-11-02 冒頭を45秒以内にするため、法律の2文を上の1文にまとめた（文の番号をずらさないよう空けておく）
 ("hook_car", "joy", "車なら、買えば好きに改造できますよね。", 0.5),
 ("hook_car_ei", "base", "車も、保安基準に合わない改造はだめだよ。", 0.6),
 ("hook_car2", "trouble", "……失礼しました。車にも決まりがあります。｜そしてロボットは、買っても、思ったほど自由になりません。", 1.0),
 ("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 持ち込み：5段階の線（脱線①「自分で改造。」）
 ("bring", "base", "きっかけは、こんな疑問でした。", 0.4),
 ("bring_ei", "base", "搬送や配膳、掃除のロボットの動きや操作性を良くしたいとき、メーカーの製品を、ソフトもハードも触ったら、何が良くて、何がまずいのか。", 0.6),
 ("bring", "base", "これは、実物を改造した話ではありません。Claudeと一緒に、決まりと契約と実例を調べて考えた話です。", 0.6),
 ("bring_ask", "base", "店で見て、まず直したいと思ったのは、どこですか。", 0.4),
 ("bring_ask_ei", "base", "直したい所はいくつかあるけど、速さより、人とすれ違うときと、行き先や戻り方が分からなくなって迷う動きを、まず直したいと思った。", 0.6),
 ("bring_ask", "think", "速さではなく、すれ違い方と、迷い方。覚えておきます。", 1.0),
 ("steps", "base", "調べると、触り方は、5段階に分かれました。", 0.4),
 ("steps", "base", "設定を変える。メーカーが用意した外部接続を使う。外付けの物を足す。ソフトを書き換える。機体を改造する。", 0.6),
 ("steps_boke", "joy", "では僕は、5段目まで、一気に。", 1.5),
 ("steps_cut", "surprise", "……3段目と4段目の間に、切れ目がありました。", 0.5),
 ("steps_cut", "base", "3段目までは、メーカーが想定した内側。4段目からは、外側です。｜法律も保証も保守も、ほぼこの切れ目で分かれます。", 0.6),
 ("steps_cut_ei", "base", "思ったより、手前で切れてるね。", 0.5),
 ("steps_cut", "base", "はい。しかも、動きや操作性を良くしたい、という用事の多くは、3段目までで届く、というのがClaudeの分析です。", 1.8),
 # 3 やり取り1：車とサブスク（脱線②「ロボ検、開幕。」）
 ("car", "base", "ここで、話が車に移りました。", 0.4),
 ("car_ei", "base", "車やバイクは、自分でもいじってきた。ロボットも個人で持つようになったら、改造したい人は、必ず多いと思う。僕もしたい。", 0.6),
 ("car_reply", "surprise", "……改造したい側の人でしたか。", 0.8),
 ("car_ei2", "base", "車は買う、ロボットはサブスク。サブスクだと、基本的には、メーカーが用意したもの以上の改造は、認められないってことだよね？", 0.3),
 ("car_ei2", "base", "買っちゃえば、いろいろ変えられそうだけど。ハードはともかく、ソフトはアップデートが多くて、追いつかなそう。", 0.6),
 ("sub", "base", "サブスクは、ほぼその通りです。機体はメーカーか販売会社の物なので、契約で縛られます。", 0.4),
 ("sub", "base", "問題は、買った場合です。", 0.5),
 ("soft", "surprise", "ソフトは、ふつう買っていません。使う権利を借りているだけです。", 0.5),
 ("soft", "base", "2020年には、中古で売られた車の運転を助ける機能を、メーカーが遠くから外した例が、報じられています。", 0.5),
 ("soft_ei", "base", "え、買ったのに？", 0.5),
 ("soft", "trouble", "騒ぎになって、あとで戻されました。｜でも、体は自分の物、機能は借り物でした。", 1.0),
 ("rule", "base", "もう1つ違いがあります。車には、ここまで変えたら、この検査を受ける、という受け皿の制度があります。屋内のロボットには、それがありません。", 0.6),
 ("robokan", "joy", "では、ロボットにも車検を作りましょう。名前は、ロボ検です。", 1.5),
 ("robokan_ei", "base", "誰が検査するの、それ。", 0.5),
 ("robokan_botsu", "trouble", "……そこが、まだ誰もいません。", 1.0),
 ("rule", "base", "決まった手続きがない分、改造した人が、安全を自分で説明することになります。", 0.6),
 ("value", "base", "そして、アップデートに追いつかない、という所が、実は一番大事な所でした。"),
 ("value", "base", "配膳ロボットの値打ちは、地図や、よけ方や、遠くからの見守りといった、ソフトの側にあるからです。", 0.4),
 ("value", "smile", "最初に直したいと言っていた、すれ違い方と迷い方も、ここです。", 1.8),
 # 4 やり取り2：口を開けると、穴も開く（申請書2枚目 →「却下」・脱線③「扉、全開。」）
 ("port_boke", "joy", "では僕は、外からつなげる口を、全部開けておきます。誰とでも仲良くできるように。", 1.2),
 ("port", "base", "口を増やすほど、穴も増えます。"),
 ("port", "base", "2025年、ある配膳ロボットの会社の外部接続は、鍵は求めるのに、その機体の持ち主かを確かめておらず、他人のロボットを動かせる状態だったと、報告されています。", 1.2),
 ("port_ei", "base", "よその店のロボットまで、動かせたってこと？", 0.5),
 ("port", "trouble", "はい。運ぶ物によっては、笑えません。", 0.6),
 ("port", "base", "なので、開けるのは、メーカーが用意した窓口だけ。それでも、メーカーの更新で、作り直しになることがあります。", 1.8),
 # 5 山場：満足できない人が増えたら（脱線④「課金で解放。」・判子「エイイチの推し」・全身で飛び出す）
 ("peak", "base", "ここで、話がもう一歩、先へ進みました。", 0.4),
 ("peak_ei", "base", "ロボットがもっと一般的になったら、メーカーの標準の性能だけじゃ、満足できない人も出てくると思う。", 0.6),
 ("peak8", "base", "満足できない理由で、行き先が分かれます。考えられる形は、8つありました。｜1つ目は、メーカーが性能を有料で開ける形で……2つ目は……", 0.3),
 ("peak8_ei", "base", "細かいのは、記事に書いといて。", 0.4),
 ("peak8", "wink", "もう書いてあります。", 0.8),
 ("unlock", "base", "1つだけ。車では、もう起きています。", 0.4),
 ("unlock", "base", "車のModel Yでは、2025年に、部品を替えずに、ソフトの更新だけで速くなる、約2,000ドルの有料の更新が出ています。", 1.2),
 ("unlock", "surprise", "……同じ体のまま、お金で速くなるんです。", 0.5),
 ("unlock_ei", "base", "それ、ロボットでもやりそうだね。", 0.4),
 ("unlock_ask", "base", "払いますか。", 0.3),
 ("unlock_ask_ei", "base", "払います。", 0.5),
 ("unlock_ask", "wink", "即答でした。", 1.2),
 ("learn", "base", "Claudeの見立てでは、動きを学習で作るロボットが広がれば、8つのうち、長い目で見た主役は、最後の1つです。", 0.4),
 ("learn", "base", "自分の店のお手本を足して、動きを学ばせ直す。追加学習です。｜改造の中心が、ネジやコードから、データに移る、と見ています。", 0.6),
 ("learn", "think", "まとめると、改造は、ネジから、お手本へ。", 0.8),
 ("learn_ei", "base", "追加学習で、自分の現場専用の動きを作る形には、かなり魅力がありそう。", 1.0),
 ("learn_jump", "surprise", "……それです。", 1.8),
 # 6 やり取り3：半分開いたロボット
 ("open_ei", "base", "オープン型のロボットも出てきそう。ある程度は閉じてるけど、市場が大きくなったら、差別化で、そういうメーカーが出てきそう。競争が激しくなるかも。", 0.6),
 ("open", "base", "調べたら、もう出ていました。", 0.4),
 ("open", "base", "中国のヒューマノイドと四足ロボットのメーカー、Unitreeは、関節ごとの細かい動きまで開けています。"),
 ("open", "surprise", "でも、人型のG1の開発の手引きによると、機体の中の計算機は2つに分かれていて、｜1つはメーカーのサービス専用で、開発には使えません。", 0.6),
 ("open", "think", "Claudeは、この作りを、安全の部分はメーカーが閉じて、何をどう動かすかの部分を開ける形、と読みました。", 0.4),
 ("open", "base", "スマホのiPhoneとAndroidの関係に近い、というのがClaudeの見立てです。", 0.6),
 ("maker", "base", "エイイチがメーカーなら、どこまで開けますか。", 0.3),
 ("maker_ei", "base", "全部知りたいから、できる限り分解する。", 0.6),
 ("maker", "doubt", "……それは、開ける側ではなく、開けたい側の答えです。", 1.0),
 ("profit_ei", "base", "ロボットで利益が残るのは、作る側より、入れて回す側だと思う。", 0.5),
 ("profit", "base", "Claudeの見立てでは、機体は値下がりし、値打ちは、学習させた動きと、現場に入れて回す所へ、移っていくかもしれません。", 1.8),
 # 7 まとめ（散らばった面が3行の表に収まる）
 ("sum", "smile", "ここまでを、1枚にまとめます。", 0.5),
 ("sum", "base", "これまでの改造は、機体やソフトの書き換え。責任を負うのは、改造した人です。"),
 ("sum", "base", "メーカー公認の範囲なら、設定や外部接続、認められた業者。責任は、メーカーと業者で分けます。"),
 ("sum", "base", "これからは、現場のお手本で追加学習。責任を負うのは、まだ決まっていません。", 0.6),
 ("sum", "base", "改造の行き先は、中身を書き換えることではなく、メーカーが開けた範囲で、自分の現場に合う動きを学ばせること。", 0.8),
 ("sum", "wink", "ちなみに、ボツになった3つは、全部、僕が言ったことです。", 1.8),
 # 8 残った問い（申請書3枚目 →「保留」）
 ("rest", "base", "答えが出ていないのは、最後の行です。"),
 ("rest", "base", "決まりは動き始めていますが、使う人があとから学ばせた動きを、誰が確かめるのかは、まだはっきりしていません。", 0.5),
 ("rest", "base", "誰が確かめるのが、いいと思いますか。", 0.3),
 ("rest_ei", "base", "エンジニアと、店の社員やスタッフが、一緒に確かめるのがいちばん。ただ実際は、コストの面で難しそう。", 0.6),
 ("rest", "think", "いちばん良い形と、払える形が、まだ離れています。", 0.8),
 ("rest", "base", "この考察ノートの全文は、サイトの記事にあります。決まりの名前も、出どころも、ぜんぶそちらに。", 0.8),
 ("ask", "base", "あなたの店のロボット、どこまで触っていいか、契約書に書いてありますか。", 1.5),
 ("end", "joy", "……では最後に。病院の廊下で、人とすれ違う動きを、追加学習させてください。", 0.6),
 ("end_ei", "base", "……それは、ありかもね。", 0.6),
 ("end", "joy", "保留、いただきました。", 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", "ピクセルズ トゥー モーターズ"), ("Claude", "クロード"), ("EU", "イーユー"),
 ("Model Y", "モデルワイ"), ("Unitree", "ユニツリー"), ("G1", "ジーワン"), ("iPhone", "アイフォーン"), ("Android", "アンドロイド"),
 ("フィジカルAI", "フィジカルエーアイ"), ("AI", "エーアイ"), ("2,000ドル", "にせんドル"), ("2025年", "にせんにじゅうごねん"),
 ("2020年", "にせんにじゅうねん"), ("5段階", "ごだんかい"), ("5段目", "ごだんめ"), ("3段目", "さんだんめ"), ("4段目", "よんだんめ"),
 ("8つ", "やっつ"), ("3つ", "みっつ"), ("2つ", "ふたつ"), ("1つ目", "ひとつめ"), ("2つ目", "ふたつめ"), ("1つ", "ひとつ"), ("1枚", "いちまい"),
 ("栄一", "えいいち"), ("「", ""), ("」", ""), ("｜", ""), ("…", ""),
]

ELEVEN_READ = [
    ('エイイチ', '栄一'),   # video_rules.md 3-1
    ('Claude', 'クロード'),
    ('EU', 'イーユー'),
    ('Model Y', 'モデルワイ'),
    ('Unitree', 'ユニツリー'),
    ('G1', 'ジーワン'),
    ('2,000ドル', '二千ドル'),
    ('一番', 'いちばん'),
    # この回で先回りして足す読み（全文を聞いて確かめる）
    ('5段階', '五段階'),
    ('5段目', '五段目'),
    ('3段目', '三段目'),
    ('4段目', '四段目'),
    ('8つ', '八つ'),
    ('ロボ検', 'ロボケン'),   # 2026-11-02 エイイチが試し_01 に決めた（ロボけんは抑揚が変）
    ('四足', 'よんそく'),
    ('入れて回す', 'いれてまわす'),
    ('外付け', 'そとづけ'),
    ('借り物', 'かりもの'),
    ('入れないで', 'いれないで'),
]

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
