---
title: "解説動画を謎解きの型に変えた ― ハコブくんの隣に、自分のドット絵と AI の声で出る"
slug: mystery-format-video-first
date: 2026-10-28
day: 395
meta_description: "ニュースを謎として置き、答えを全体の72%で出す謎解きの型の解説動画を13分41秒で仕上げた。作り手は100ドットのドット絵と別のAI音声で出し、口と目は声で動く。codexは事実確認だけに使った。"
tags: [YouTube, 解説動画, 謎解き, ドット絵, AI音声, ElevenLabs, codex, 人型ロボット, フィジカルAI]
series: "ひとり研究所の裏側"
---

ニュースを謎として置き、3つの手がかりで解いていく型の解説動画を、13分41秒の1本として仕上げた。題材は2026年4月の北京の人型ロボットのハーフマラソン（優勝のロボットは50分26秒・人間の男子の世界記録候補より速い）と、家で洗濯物を任せられる人型ロボットがまだ見当たらないことの逆転で、台本は別のエージェントの照合と codex の事実確認を2回通してから声にした。画面の右下には、写真でも本人の声でもなく、100ドットの自分の絵と、番組で使っている別の AI 音声を当てた自分を出した。

Pixels to Motors の YouTube は、案内役のロボット「ハコブくん」が話す解説動画を、これまで1節の型（フック→自己紹介→問い→先に結論→目次→本編→見立て→答え）で作ってきました。LOG394 で再生数を追うのをやめ、入口の広い話題から入って自分の研究につなげる方針に変えたあと、最初の1本をどの型で作るかを決める必要がありました。参考にしたのは、海外のニュースを謎解きの形で話す18分の番組の文字起こしです。構成だけを取り出すと、冒頭で数字と不思議を置き、たとえを1つ、手がかりを3つ、答えは全体の75〜80%の所、という骨組みでした。謎解きが好きな人は一定数いる、という読みで、この骨組みに Pixels to Motors らしさ（出どころの札・自分の机の上の記録・見立て）を足した形にしました。

もう1つ決めたのは、自分をどう出すかです。写真は嫌、本人の声は通らない、でも「エイイチの感想は……」と言われる場面で本人が出ないのは変、という3つの条件がありました。答えは、ChatGPT で作った絵を元に手で直した100ドットのドット絵と、番組のマンガのショートで使っている別の AI 音声（槙原の声）を当てる、でした。ドット絵は話している間だけ口と目が動き、指をさすのは大事な所だけ、出る場面は「自分で確かめた所・現場の証言・見立て」の3つに限っています。

| やったこと | なぜ | 結果 |
|---|---|---|
| 参考番組の文字起こしから構成だけを取り、謎解きの型にした | 入口の広い話題で、答えまで見てもらうため | 数字と謎→エイイチ登場→札の約束→たとえ1つ→手がかり3つ→現場の証人→解く→見立て→答え、の11パート |
| 台本を11版まで直した | 別のエージェントの照合（17か所）と codex 2回（17件→3件）の事実の指摘を入れるため | 筋は3版のまま。codex の構成の提案は入れなかった |
| 自分のドット絵を4枚作り、口と目を声で動かした | 写真でも本人の声でもない形で、本人を出すため | 100ドット・4ポーズ・口は3段・話す間だけ動く |
| 自分のセリフ4文を AI 音声で入れた | 「エイイチの感想は……」のあとに本人の声があるほうが自然なため | 槙原の声を流用。ハコブくんの口はその間止まる |
| 字幕の縁取りの穴・札の重なり・前の絵の透け・動きの場面の指紋を直した | 確認用で見つかった4つの不具合 | render.py・scenes.py・assemble.py を直した |
| よその映像の使い方を決めた | ほかのチャンネルが報道映像を背景に流しているのを見て、規約を聞かれたため | 自分7：よそ3。会社の素材か引用の2通りだけ。台帳を付ける |

**謎解きの型は、答えを先に言わない代わりに、出どころの札と自分の記録で信じられる土台を先に作る形になりました。** 話の出どころは画面の左上の札で出し（大会や会社の発表・ニュース・論文や本・エイイチの記録と見立て）、「どこまで信じるかは札を見て決めてください」と冒頭で言っています。

この型で視聴が続くかは、まだ分かりません。公開後に、30秒時点の視聴者維持率と平均視聴率を、1節の型で作った前の本編と比べます。

【画像】LOG395_01_hook.jpg 動画の冒頭。紙色の画面に「世界記録より速い／洗濯物はまだ」、左下にハコブくん。字幕は「人間の世界記録より速く走るロボットがいるのに、」

【画像】LOG395_03_ei_react.jpg 動画の1:00ごろ。真ん中に「性能は、すごい／仕事とは別？」、右下にドット絵のエイイチ（腕組み・口を開けている）。左上に「エイイチの記録と見立て」の札


## 作業ログ ― 参考番組の構成を取り出し、謎解きの型の1本目を仕上げるまで

ここから下は作業の記録です。効果の数字はまだなく、「見込める効果」はすべて見込みです。視聴の数字は公開後に YouTube アナリティクスで確かめます。

### 参考番組の18分から、構成だけを取り出した

海外のニュース（GMO の回）を謎解きの形で話す18分の番組の文字起こしを渡され、「文章の構成についてだけ分析し、現行のうちの YouTube と何が違うか」を比べました。取り出した骨組みは次のとおりです。

| 参考番組 | 時間の目安 | うちの解説回（1節の型） |
|---|---|---|
| 変な事実を数字で置く。答えは言わない | 0〜8% | フックのあと「先に結論」を言う |
| たとえを1つ置き、その上に手がかりを並べる | 8〜15% | 目次で「3つあります」と数を言う |
| 手がかり1・2・3。途中で聞き手の早とちりを1つ入れて直す | 15〜75% | 本編3節。節ごとに結論を言う |
| 答え（山場）。過去の指摘や研究者の言葉で裏を取る | 75〜85% | 見立て |
| 聞き手が次に見るときの目の付け所を渡す | 85〜100% | 答えと視聴者に渡す問い |

【図解】LOG395_mystery_format.html

違いの中心は「答えを先に言うか、山場で言うか」でした。うちの決まり（video_rules.md の C 節「冒頭30秒で答えか数字を出す」）とぶつかるので、この型では「冒頭で数字と謎を出し、答えは山場で出す」と読むことをエイイチに確かめ、承認をもらいました。

> 謎解きの面白さを動画に入れ込んでるという構成ですかね（謎解きが好きな層は一定数いる）この骨組みで動画を作ってみましょう。型を分析して、さらに Pixels to Motors らしさを加える案を考えてください。

Pixels to Motors らしさとして足したのは4つです。

- 出どころの札。数字や主張を出す場面に、大会や会社の発表（黒）・ニュース（青）・論文や本（灰の枠）・エイイチの記録と見立て（オレンジ）の4種類の札を出す
- 現場の証人。3つ目の手がかりの中で、自分の机の上のロボットアーム（mechArm 270-Pi）の記録を呼ぶ
- ハコブくんの早とちり。手がかりの途中で、間違った推理を1つ置いて次で直す
- 見立て。解説回と同じく「ここからはエイイチの見立てです」と言ってから話す

### 題材は、世間が知っている話から入ることにした

最初に出した題材の候補は、自分の研究寄りのもの（フィジカルAI研究室の学習の記録など）でした。エイイチの判断は、まず世間に分かりやすいネタから始めて、そのあとに自分のネタにしていく、でした。

> もっと世間わかりやすいネタからスタートして、その後に自分ネタにしていきたいね

> ターゲットが狭すぎる

候補 A〜C を出し、A「世界記録と洗濯物」（フィジカルAIとは何かが謎解きで分かる。入口としていちばん広い）に決まりました。謎は「人型ロボットがハーフマラソンで人間の世界記録より速く走ったのに、家で洗濯物を任せられる人型ロボットはなぜまだないのか」。たとえは「ロボットの学校」（走る＝体育、洗濯物をたたむ＝家庭科）の1つだけ。手がかりは、練習する場所・相手の形・お手本の数の3つです。

### 自分を出す方法：写真でも本人の声でもなく、ドット絵と別の AI 音声

> オレを登場させる？動画の右側に（リアル写真は嫌）

エイイチが持ってきたのは、ChatGPT で作った自分のドット絵でした。出る場面は3つ（自分で確かめた所・現場の証言・見立て）だけ、表情の差分は5枚くらい、ハコブくんの絵柄ともう少し合わせたい、という条件でした。

【画像】LOG395_15_avatar_source.png エイイチが最初に持ってきたドット絵。黒髪に眼鏡、黒いインナーに灰色のジャケットで腕を組んでいる

最初に3Dっぽく描き直した案は「ドット絵の良さがなくなっている」で戻しになりました。ドット絵の良さは残したまま、服に残っていた手の残像を消し、左胸のポケットを外し（ポケットのないジャケットのため）、ジャケットの色と影の量を元の絵に合わせました。できたのは、100×100ドット・16色の4枚です。

【画像】LOG395_09_avatar4.png ドット絵の4ポーズ。左から腕組み・うなずく・指さす・ひらめく

頷く絵は最初、襟が顎の後ろに回っていて「頷くところが変だね」と言われ、襟を顎の前に描き直しました。

### 台本：11版までの直しと、codex は事実確認だけ

台本は narration.py に1文ずつ（場面・表情・字幕・後ろの間）で書きます。1版から11版までの変化を、ファイルの先頭の記録から抜き出すと次のとおりです。

| 版 | 直したこと | きっかけ |
|---|---|---|
| 1版 | 謎解きの型で書いた | 題材 A に決定 |
| 2版 | エイイチの実感を4つ入れた | 本人に聞いた答え |
| 3版 | 照合で17か所直した。1年で速くなった理由を「仮想の練習」から「機体づくりと投資」へ | 別のエージェントの照合 |
| 4版 | codex の提案で題・問い・章を組み替えた | codex 1回目 |
| 5版 | 4版をやめ、3版の筋に事実の直しだけを入れた | エイイチ「codex は事実確認をベースに」 |
| 6版 | 冒頭〜早とちりの言い回しを柔らかく | エイイチ「まだ固い」 |
| 7版 | 地面の言い方・答えの「理由の1つ」・Helix 2.5 の日付 | codex 2回目（3件） |
| 8版 | 1文目「家の洗濯物には勝てていない」を言い換え | エイイチ「意味が分からない」 |
| 9版 | 冒頭の感想の前にエイイチの紹介を足した | エイイチ「出だしで出したい」 |
| 10版 | 場面の名前を分けた（動きの場面のため） | 画面づくり |
| 11版 | エイイチの言葉4つを、ハコブくんの前置き＋本人の声に分けた | エイイチ「おれの声を作って入れたい」 |

4版から5版への戻しが、この回でいちばん大きな判断でした。codex 1回目は17件の指摘で、事実の指摘（世界記録候補・一部の補助・Helix 2.5 の30軒・1X の量産開始）に加えて、題と問いの言い換え・人の作業動画の章の追加・据え置きの専用ロボットの追加・確かめる3つの言い換え、という構成の提案も出していました。それを全部入れた4版を見たエイイチの判断です。

> codexは事実確認をベースにしてください。内容を変えるのはやめてください（多少はいいけど、codexに任せるとただのニュースのようになってします）

- ねらい：codex の役割を事実確認に限り、話の筋・たとえ・見立ては人（エイイチ）と台本を書いた側が持つ
- 変わったこと：依頼文の冒頭に「事実確認をしてください。筋・構成・見立ては変えない。組み替えや新しい話題・事例を足す提案は要らない」と書き、観点を事実と言い過ぎだけにした。2回目の依頼には「再び指摘しないで」と書いた
- 見込める効果：codex の指摘が3件に減り、どれも事実の確度の話だった。謎解きの筋が残ったまま、数字と言い切りだけが直った

この決まりは video_rules.md の0節の手順5に足しました。

#### codex の依頼文を作る make_docs.py（2回目の依頼）

````python
"""台本の読み物（台本_*.md）と codex 敵対的検証の依頼（codex_*.md）を、narration.py から作り直す。
台本を直したら、動画の作業フォルダで  python3 make_docs.py
2026-10-28: 「何台入れたら店は変わる」の make_docs.py を写して書き換えた（謎解きの型の1本目・1回目の依頼）
2026-10-28: 2回目の依頼にした（台本5版）。エイイチの指示で、codex には事実確認だけを頼む（話の筋・構成・見立ての提案は求めない）
"""
import sys, json, os
sys.path.insert(0, '.')
from narration import SEGS, parse
NAME = "世界記録と洗濯物"
TITLE = "人型ロボットは人間より速く走ったのに、なぜ洗濯物はたためないのか（仮題）"
ROUND = 2
FJ = {"base": "基本", "smile": "小さな笑み", "surprise": "驚き", "doubt": "ジト目", "think": "目を閉じる",
      "trouble": "困り眉", "joy": "＞▽＜", "wink": "ウインク"}
SEC = [("hook", "0 謎"), ("title", "1 自己紹介"), ("question", "2 今日の謎"), ("promise", "3 聞くときの約束"),
       ("map", "4 地図（たとえは1つだけ）"), ("hayatochiri", "5 ハコブくんの早とちり"),
       ("c1", "6 手がかり1：練習する場所"), ("c2", "7 手がかり2：相手の形"),
       ("c3", "8 手がかり3：お手本の数（今日いちばん大事）"), ("ei_desk", "　― 証人：エイイチの机の上"),
       ("solve", "9 謎が解ける"), ("mitate", "10 エイイチの見立て"), ("answer", "11 謎の答えと、持ち帰る3つ"),
       ("outro", "12 アウトロ")]
idx = {o['i']: o for o in json.load(open('tts/index.json'))} if os.path.exists('tts/index.json') else {}
rows, n, t, done, first, last = [], 0, 0.0, set(), {}, {}
for k, s in enumerate(SEGS):
    sc, f, text, p = parse(s)
    for key, name in SEC:
        if sc == key and name not in done:
            rows.append(("sec", name, t)); done.add(name)
    o = idx.get(k)
    t += (o['dur'] + o['pause']) if o else 0
    if text:
        n += 1
        first.setdefault(sc, n); last[sc] = n
        rows.append(("line", n, f, sc, text))


def R(*scs):
    return "・".join((f"S{first[x]:03d}〜S{last[x]:03d}" if first[x] != last[x] else f"S{first[x]:03d}") for x in scs if x in first)


# 読み物の台本
out = [f"# 台本：{TITLE}", "", "話し手はハコブくん（エイイチは三人称）。各行は「文番号｜表情｜場面｜字幕の文」。字幕の「｜」は、読み上げは1文のまま字幕だけ次の枚に替える位置。",
       "エイイチ（ドット絵・右下の小窓・声なし）が出るのは、場面が ei_ で始まる所と、見立て（mitate）だけ。", ""]
for r in rows:
    if r[0] == "sec":
        m, ss = divmod(int(r[2]), 60); out += ["", f"## {r[1]}" + (f"（{m}:{ss:02d}〜）" if idx else ""), ""]
    else:
        out.append(f"- S{r[1]:03d}｜{FJ[r[2]]}｜{r[3]}｜{r[4]}")
if idx:
    m, ss = divmod(int(t), 60)
    out += ["", f"全体の長さ（いまの音声）：{m}分{ss:02d}秒"]
open(f"台本_{NAME}.md", "w").write("\n".join(out) + "\n")

# codex 敵対的検証の依頼
body = []
for r in rows:
    body.append(f"\n### {r[1]}\n" if r[0] == "sec" else f"S{r[1]:03d}　{r[4].replace('｜', '')}")
chars = sum(len(r[4].replace('｜', '')) for r in rows if r[0] == "line")
md = f"""# 敵対的検証依頼：YouTube台本「{TITLE}」

この台本の**事実確認**をしてください。数字・日付・名前・発言の紹介・研究や発表の中身が出典と合っているか、出典の範囲を超えて言い切っていないかを、ウェブ検索で一次情報を確かめて見てください。日本語で答えてください。

**話の筋・構成・たとえ・問いの立て方・エイイチの見立ては変えません。** それらを組み替える提案や、新しい話題・事例を足す提案は要りません（足すと、ただのニュースの解説になってしまうため。運営者の判断）。直す案は、事実を正しくするための最小の言い換えにしてください。台本の文が、新しい事実（2026年の発表など）で誤りになっている場合だけ、その文を正しくする形で指摘してください。

## 前提

- チャンネル：フィジカルAI解説｜Pixels to Motors（YouTube）。運営はエイイチ（本業はデザイナー。ロボティクスの研究と開発をしている）。ナレーションはキャラクターのハコブくん（AI 音声）で、エイイチは三人称で出てくる
- 視聴者：ロボティクスに関心のある経営者・PM・マネージャー・開発者。人型ロボットのニュースは見ているが、専門家ではない人も多い
- この回の型：謎解きの型（このチャンネルで1本目）。冒頭で変な事実（謎）を出し、答えは後半の「9 謎が解ける」で出す。たとえは1つだけ（ロボットの学校：走る＝体育、たたむ＝家庭科）。手がかりは3つ。話の出どころを4種類の札（大会や会社の発表・ニュースの報道・研究の論文・エイイチの見立て）で画面に出す
- 謎：2026年4月の北京の人型ロボット・ハーフマラソンで、優勝機が50分26秒（人間の男子の世界記録候補 56分51秒より速い）。なのに、家で洗濯物を毎日任せられる人型ロボットは、公開資料では確認できない。なぜか
- 「まだ」の定義：家で、人が遠くから操作したり手伝ったりせずに、毎日任せられる段階には来ていない（{R('define')}・{R('answer')}）
- エイイチの言葉（{R('ei_react')}・{R('ei_desk2')}・{R('mitate2')}・{R('mitate3')}）は、2026-10-28 に本人に聞いた答え。中身は足していない。中国の人型ロボットについての見方（{R('mitate2')}）は、本人が「強く主張していい」と言った見立て。事実の主張としてではなく、見立てとして言い方が伝わっているかを見てください
- エイイチの机の上の数（750回）は、本人のロボットアームの通しの試行の台帳（2026-06-18〜10-22・失敗も含む）。外からは確かめられないので、言い方だけ見てください
- 台本を書いたあと、書いたのとは別のエージェントに出典と1文ずつ突き合わせてもらい、直した（1年で速くなった理由を仮想の練習から機体づくりと投資に／走れる土台は仮想の練習・2本足の Cassie（2021）でつなぐ／電池・機体交換・伴走の車・道順／HONOR の学ばせ方は「見当たらない」／ETH と NVIDIA・GPU 1枚／π0 の1万時間はいろいろな作業の合計／1X は会社自身の説明／ゴールドバーグの10万年の意味／布の仮想の研究も進んでいる／別の研究者の「思い込み」／答えで「まだ」の定義を言い直す）
- **これは{ROUND}回目の検証です。** 1回目（「直してから」・結論「条件つきで成立」・17件）の事実の指摘を入れた：世界記録候補・3倍は機体のちがう優勝タイムの比べ・自律の区分でも一部の補助は認められていた・1年の伸びは機体と投資から「説明する専門家もいる」・優勝機の学ばせ方は未確認なので言い切らない・地面と布の言い方・4096台はやり直し・Figure の2026年9月の30軒の試験（タオル62%・会社の試験）・1X の量産開始と出荷予定・10万年は規模のたとえ・750回は試行錯誤の記録・台の上でたたむだけなら足は要らない・札の言い方。**話の筋を組み替える指摘（題と問いの言い換え・人の作業動画の章・据え置きの専用ロボット・確かめる3つの言い換え）は、運営者の判断で入れていません。それらは再び指摘しないでください。** 文番号は1回目とずれています
- 台本は全{n}文・約{chars}字。ナレーションは約11〜12分の見込み

## 検証してほしい観点

### A. 事実
A1. マラソンの数字（{R('hook','hook_wr','hook_last')}）：50分26秒・自律で走ったか・56分51秒（公認手続き中）・6分あまり・2時間40分42秒・3倍あまり。比べ方の条件（{R('promise_fair')}）が出典の範囲か
A2. 仮想の世界での練習の研究（{R('c1_sim','c1_note','c1_why')}）：ETH と NVIDIA・4096台・4分／20分・GPU 1枚・実機に移せた・2本足のロボットの2021年の話
A3. この1年で記録が縮んだ理由（{R('c1_speed')}）と、優勝機の学ばせ方が未確認であること（{R('c1_note')}）が、答え（{R('solve')}・{R('answer')}）まで保たれているか
A6. Figure（{R('c3_figure')}）・1X（{R('c3_neo')}）の言い方が、会社の発表の範囲か。2026年10月28日時点で古くなっていないか
A4. 布の研究（{R('c2_cloth')}）・π0（{R('c3_pi')}）・Figure（{R('c3_figure')}）・1X NEO（{R('c3_neo')}）・ゴールドバーグ（{R('c3_gap')}・{R('solve_twist')}）・モラベック（{R('solve_moravec')}）が出典の範囲か
A5. 「人の手を借りずに、家で毎日たたんでいる人型ロボットは見当たらない」（{R('hook_q')}）が、2026年10月時点で言えるか（家庭向けの人型ロボットの出荷の状況を含めて）

### B. 言い過ぎ（事実の範囲）
B1. 出典が言っている範囲を超えた言い切り、条件や限定の抜け（推測が事実に聞こえる所）だけを見てください。論理の組み立てや反論への備えの提案は要りません

## 回答の書式

指摘ごとに次の形で書いてください。重大なものから順に並べてください。

```
[❌ NG / ⚠️ 要注意] 文番号（例：S043）
問題：何が問題か（1〜2文）
根拠：確認した出典（ウェブの原文）または推論の筋道
修正案：差し替える文（台本の話し言葉の調子に合わせて）
```

最後に次の2点をまとめてください。
1. 事実の面で、このまま公開してよいか（はい／直してから）
2. 公開前に必ず直すべき指摘の文番号

---

## 台本が使った出典

| 主張 | 文番号 | 出典 |
|---|---|---|
| 2026-04-19 北京亦庄の人型ロボット・ハーフマラソン（21.0975km・300台超・優勝 閃電／HONOR 50分26秒・自律・遠隔操作は1.2倍で採点・電池交換・機体交換・伴走の車） | {R('hook','promise_fair','check3')} | 新華社 https://www.news.cn/sports/20260419/c91172da5ef84342b7b07fb3c2ef8f12/c.html ／北京市政府 https://english.beijing.gov.cn/latest/news/202604/t20260419_4593508.html ・ https://english.beijing.gov.cn/latest/news/202603/t20260306_4550687.html ／中国新聞網 https://www.chinanews.com.cn/cj/2026/04-19/10606411.shtml ／AP https://abcnews.com/International/wireStory/humanoid-robot-sprints-victory-beijing-beating-human-half-132179294 ／TechCrunch https://techcrunch.com/2026/04/19/robots-beat-human-records-at-beijing-half-marathon/ ／Scientific American https://www.scientificamerican.com/article/a-humanoid-robot-beat-the-human-half-marathon-record-at-a-beijing-race-but-what-did-it-actually-prove/ |
| 2025年の第1回（天工 Ultra 2時間40分42秒） | {R('hook_last')} | 新華社・Smithsonian https://www.smithsonianmag.com/smart-news/humanoid-robots-just-raced-alongside-human-runners-in-a-world-first-half-marathon-heres-how-it-went-180986469/ |
| 男子ハーフマラソン 56分51秒（ケジェルチャ・2026-08-23・世界記録候補・公認手続き中）。57分20秒（キプリモ・2026-03-08）の公認発表は2026-09-03 | {R('hook_wr')} | World Athletics https://worldathletics.org/news/report/world-half-marathon-record-buenos-aires-2026-yomif-kejelcha ・ https://worldathletics.org/news/press-releases/ratified-world-records-kiplimo-tharp-wanyonyi |
| 仮想の世界での歩く練習（4096台・平地4分未満・でこぼこ20分未満・GPU 1枚・実機 ANYmal） | {R('c1_sim')} | Rudin ら 2021 https://arxiv.org/pdf/2109.11978 |
| 2本足のロボットも2021年に仮想の練習で走れるようになっていた（研究者の発言）／1年の伸びは機体づくりと投資（専門家）／別の研究者の「思い込み」 | {R('c1_note','c1_speed','solve_twist')} | Scientific American（上と同じ記事） |
| 布の仮想の世界の難しさ・本物に近づける研究 | {R('c2_cloth')} | RGBench https://arxiv.org/html/2511.06434 |
| π0（双腕・固定・1万時間超のいろいろな作業のデータ・手の込んだ作業は1回5〜20分） | {R('c3_pi')} | https://arxiv.org/html/2410.24164v3 |
| Figure（2025-08 タオルを自律でたたむ発表／Helix 2.5・2026-09-17・初めての30軒・タオル62%・3作業で56%・安全のための介入は失敗） | {R('c3_figure')} | Figure https://www.figure.ai/news/introducing-index ・ https://www.figure.ai/news/helix-2-5-zero-shot-30-home-generalization ／humanoid.guide https://humanoid.guide/?p=18222 ／runtimewire https://runtimewire.com/article/figure-index-human-video-robot-training-data |
| 1X NEO（2026-04-30 量産開始・一般の出荷は2026年予定・覚えていない作業は担当者が遠くから導く） | {R('c3_neo')} | https://www.globenewswire.com/news-release/2026/04/30/3285118/0/en/1X-opens-NEO-Factory.html ・ https://www.businesswire.com/news/home/20251027434628/en/1X-Launches-NEO-The-Robot-Redefining-Life-at-Home ・ https://www.1x.tech/neo |
| 布を仮想で練習させて本物につなげた研究 | {R('c2_cloth')} | Cloth Funnels https://arxiv.org/html/2210.09347 |
| 2本足の Cassie が2021年に仮想の練習で走った | {R('c1_note')} | Oregon State University https://engineering.oregonstate.edu/all-stories/great-strides |
| ゴールドバーグ（10万年分・仮想の練習は走る・宙返りではうまくいく） | {R('c3_gap','solve_twist')} | UC Berkeley https://vcresearch.berkeley.edu/news/are-we-truly-verge-humanoid-robot-revolution |
| モラベック（1988年『Mind Children』の趣旨。原書は未確認） | {R('solve_moravec')} | https://en.wikipedia.org/wiki/Moravec%27s_paradox |
| エイイチの机の上（台帳750行・上カメラ1台・要所の姿勢を手で教えて再生） | {R('ei_desk','ei_desk2')} | 本人の台帳と記録（外からは確かめられない） |
| 見立て | {R('mitate1','mitate2','mitate3')} | エイイチの言葉（2026-10-19・2026-10-28 本人に聞いた答え） |

---

## 台本全文（動画で読み上げる版）
""" + "\n".join(body) + "\n"
open(f"codex_敵対的検証依頼_{NAME}.md", "w").write(md)
print("文", n, "字", chars)
````

#### 照合のメモ（別のエージェントが出典と1文ずつ突き合わせた）

```text
# 照合（2026-10-28・台本2版を、書いたのとは別のエージェントが出典と1文ずつ突き合わせた）

一番大きい指摘: 「1年で3倍速くなった理由」を仮想の世界での練習にしていた。出典（Scientific American）の専門家は、伸びは工学と投資（冷やし方・モーター）と言い、仮想の練習は走れる土台として語っている → 3版で直した

直したこと（3版）:
- S003 世界記録: 56分51秒は大会の後（8月）に出た記録で公認手続き中 → 「最高記録」「公認の手続き中」・6分あまり
- S018 条件: 「走り込み」は出典を超える → 電池・機体交換（罰則つき）・伴走の車・道順が決まっていた
- S027 細かい手: 出典なし → 「作られ始めている」に弱めた
- S030・S031: チューリッヒ工科大学と NVIDIA・GPU 1枚を積んだ計算機1台
- S034: HONOR の学ばせ方は「公表していない」→「今回調べた発表や報道には見当たらない」
- S035: 2本足のロボットも2021年に仮想の練習で走れるようになっていた（SciAm の研究者の発言）でつないだ
- S036: 「相手はほぼ地面だけ」→ 足が触れる相手は固い地面・仮想と本物のずれは残る
- 新 c1_speed: 1年の伸びは機体づくりと投資（専門家）
- 新 c2_cloth: 布を本物に近く動かす仮想の研究も進んでいる（RGBench 自体がその研究）
- S044・S060: 「中心」「しかない」を弱めた
- S048: π0 の1万時間は、いろいろな作業の合計
- S051: 1X NEO は会社自身の説明（覚えていない作業は担当者が遠くから導く）
- S052: ゴールドバーグの10万年の意味（言葉のAIの文章は人が読むと約10万年分・ロボットにはそれに近い量もない）
- S067: 「やさしい側に移った、と見る研究者」→ ゴールドバーグの発言（走る・宙返りではうまくいく、器用な手作業ではうまくいかない）
- 新: 別の研究者（ミシガン大・ディン助教）の「人より速く走るほうが難しく思えるのは思い込み」
- S071: 「先に進んでいた」→「さっきの実験も」
- 答え: 機体づくりと投資を足し、「まだ」の定義を言い直した

問題なしと確かめた所: 閃電は自律ナビ（新華社・AP・36Kr）・3倍あまり（9642秒÷3026秒＝3.19）・RGBench・Figure の発表・モラベックの趣旨・1.2倍の採点
```

#### 事実確認のメモ（出典を開いて確かめた記録）

```text
# 事実確認（2026-10-28・別のエージェントが出典を開いて確かめた）

## 2026年4月19日 北京亦庄 人型ロボット・ハーフマラソン
- 優勝 閃電（Lightning）・荣耀（HONOR）・齐天大圣队、50分26秒（正味）。100チーム超・300台超。距離21.0975km
- 遠隔操作の機体はタイムを1.2倍して採点。速さだけなら遠隔操作の HONOR 機の48分19秒が最速
- 自律は約4割（中国新聞網・China Daily「近四成」、Scientific American は38%）
- 電池交換は補給所内なら罰則なし（時間は含む）。補給所外は1回目5分・2回目10分の罰則
- 転倒・接触: スタートで1台転倒・1台が柵に衝突（AP・TechCrunch）。Scientific American は閃電が柵に当たり倒れスタッフが起こしたと書く
- 人（約1.2万人）と同日・同じ道。ただし柵や植え込みで分けた
- 要確認: 「閃電は自律ナビのみ」「10.6km で交換1回のみ」は 36Kr Japan だけ
- 出典: 新華社 https://www.news.cn/sports/20260419/c91172da5ef84342b7b07fb3c2ef8f12/c.html ／北京市政府 https://english.beijing.gov.cn/latest/news/202604/t20260419_4593508.html ・ https://english.beijing.gov.cn/latest/news/202603/t20260306_4550687.html ／中国新聞網 https://www.chinanews.com.cn/cj/2026/04-19/10606411.shtml ／China Daily https://mobile.chinadaily.com.cn/html5/2026-04/20/content_001_69e52c8eed50be540e72ebd7.htm ／AP https://abcnews.com/International/wireStory/humanoid-robot-sprints-victory-beijing-beating-human-half-132179294 ／TechCrunch https://techcrunch.com/2026/04/19/robots-beat-human-records-at-beijing-half-marathon/ ／Scientific American https://www.scientificamerican.com/article/a-humanoid-robot-beat-the-human-half-marathon-record-at-a-beijing-race-but-what-did-it-actually-prove/ ／36Kr Japan https://36kr.jp/492234/

## 2025年の第1回
- 天工 Ultra 2時間40分42秒（新華社）。出走21台・完走6台（「制限時間内4台」の報道もあり食い違い）。電池3回交換・転倒1回。前を走る人の腰の信号を追って走った（Fortune）
- 出典: https://www.smithsonianmag.com/smart-news/humanoid-robots-just-raced-alongside-human-runners-in-a-world-first-half-marathon-heres-how-it-went-180986469/ ／ https://fortune.com/article/china-first-robot-marathon-runners-trip-emit-smoke-fall-apart

## 男子ハーフマラソンの世界記録
- 公認済み 57分20秒（キプリモ・2026-03-08 リスボン・2026-09-03 公認発表）
- 56分51秒（ケジェルチャ・2026-08-23 ブエノスアイレス・公認手続き中）。10月に公認されたかは未確認
- 36Kr の「57分20秒が世界記録」は古い
- 訂正（codex 1回目）: 57分20秒の公認発表は2026-09-03で、大会の時点（4月）では公認前だった。56分51秒は「世界記録候補」と言う
- 出典: https://worldathletics.org/news/press-releases/ratified-world-records-kiplimo-tharp-wanyonyi ／ https://worldathletics.org/news/report/world-half-marathon-record-buenos-aires-2026-yomif-kejelcha
- 比べるときの注意: 電池交換・伴走スタッフと車・事前の地図と走り込み・公式記録ではない。Brooks は「宣伝の見せもの」と評した（Scientific American）

## 洗濯物
- π0（Physical Intelligence）: 双腕・固定。かごの服を出してたたみ積む。事前学習のロボットデータ1万時間超。複雑な作業は1回5〜20分。1枚あたりの時間は書かれていない https://arxiv.org/html/2410.24164v3
- Figure 2025-08-12: 人型がタオルを完全に自律でたたんだと発表。速さ・場所・成功率は非公表 https://figure.ai/news/helix-learns-to-fold-laundry
- 1X NEO: 2025-10 予約開始・2026年に家庭へ出荷予定と発表。WSJ の取材では多くの作業を VR で遠隔操作。2026-05 の記事では洗濯物は遠隔の手伝い（二次）。実際に家へ届いたかは未確認 https://www.businesswire.com/news/home/20251027434628/en/1X-Launches-NEO-The-Robot-Redefining-Life-at-Home ／ https://the-gadgeteer.com/2026/05/20/home-robots-available-2026/
- 言い方: 「人の手を借りずに、家庭で毎日洗濯物をたたんでいる人型ロボットは、公開資料では確認できない」

## 歩く・走る（仮想の世界での練習）
- Rudin ら（CoRL 2021・ETH Zurich）: Isaac Gym で4096台を同時。平地4分未満・でこぼこ20分未満（GPU 1枚 RTX A6000）。実機（ANYmal・四足）に移せた https://arxiv.org/pdf/2109.11978
- HONOR は「強化学習で走り方を学んだ」とは言っていない（シミュレーションでの試験・屋外の長時間テストには触れている）。仮想の世界での練習が理由の1つというのは専門家の推測（Scientific American の Fern）

## 布・データ
- RGBench（2025）: 布は状態が限りなく、布どうしがぶつかり重なる、シミュレータの動きが実物と合わない https://arxiv.org/html/2511.06434
- Open X-Embodiment: 22種類のロボット・21機関・527スキル https://arxiv.org/abs/2310.08864v8
- Goldberg（Science Robotics 2025-08-27）: 言葉のAIの学習文章は人が読むと約10万年分、ロボットとの間に10万年のデータの差（Berkeley の記事・二次） https://vcresearch.berkeley.edu/news/are-we-truly-verge-humanoid-robot-revolution

## モラベックのパラドックス
- 趣旨: 知能テストやチェッカーで大人並みは比較的やさしく、知覚と移動で1歳児並みは難しい。感覚と運動は進化の10億年で磨かれた（Mind Children 1988・15〜16ページ）。原書は未確認（Wikipedia・@IT の二次）
- 「走るはやさしい側に入った」はモラベック本人の言葉ではない。逆転は Brooks の発言として Scientific American に出る

## エイイチの机の上
- KIOXIA runs/pick_place_ledger_v3.csv: 750行（2026-06-18〜2026-10-22）。失敗も含めた通しの試行（2026-10-28 に数えた）
- 「要所の姿勢を手で教えて再生して撮る」: LOG349（2026-10-18）の公開記事と照らすこと（site_archive は 10-12 までで未収録）

## 2026年の進展（codex 1回目で出て、元のページで確かめた・2026-10-28）
- Figure Index（2026-08-25）: 家や職場で人が作業する動画を、報酬を払って集めるアプリ（runtimewire https://runtimewire.com/article/figure-index-human-video-robot-training-data）
- Figure Helix 2.5（公式の掲載は2026-09-17。humanoid.guide の記事は09-18）: 初めての30軒（ベイエリア）。ベッドメイク67%・タオル62%・おもちゃの片付け40%、420回で237回成功＝56%。現地での追加学習なし。安全のための人の介入は失敗。Index の事前学習なしの同等の方策は9%（humanoid.guide https://humanoid.guide/?p=18222）
- 1X（2026-04-30）: ヘイワードの工場で量産開始・年1万台。出荷先は研究開発と社内の家庭試験、一般の顧客は2026年予定（GlobeNewswire https://www.globenewswire.com/news-release/2026/04/30/3285118/0/en/1X-opens-NEO-Factory.html）
- Weave Isaac 0: 洗濯物をたたむ据え置きのロボット。ベイエリアで出荷。行き詰まると担当者がカメラ映像を見て平均5〜10秒アームを操作して戻す。8,000ドルか月450ドル（automate.org・2026年2月ごろの記事）
```

#### codex 検証結果 1回目（17件・「直してから」）

```text
# codex 敵対的検証 結果 1回目（世界記録と洗濯物）

- 日時: 2026-10-28 13:33（JST）
- 依頼文: codex_敵対的検証依頼_世界記録と洗濯物.md（md5 178594e1a06558f56c6adf233c774ba3・23,970 バイト）
- 題（依頼文の1行目）: # 敵対的検証依頼：YouTube台本「人型ロボットは人間より速く走ったのに、なぜ洗濯物はたためないのか（仮題）」
- codex: codex-cli 0.164.0-alpha.11.1
- モデル: gpt-6.1-sol
- 考える深さ: high
- ウェブ検索: あり（検索した回数 36）
- かかった時間: 7分56秒
- 使ったトークン: 172,698
- 指摘の数: 17（うち出典のリンクが付いたもの 13）
- 出典の URL: 18件（別々・文の中に張られた回数 21）

---
**判定は「直してから」です。** 謎解きの構成は残せます。ただし、2026年の進展の取りこぼしと、結論での因果関係の言い切りは修正が必要です。

2026年10月28日時点の公開資料を確認しました。企業発表は「その企業がそう発表した」ことの確認として扱い、長期の家庭運用が実証されたこととは区別しています。

**[❌ NG] S053：2026年9月のFigureの発表が抜けている**

問題：2025年8月の発表の説明としてはおおむね正しいですが、現在の到達点を示すには古すぎます。「成功率は公表されていません」も、2025年の当該発表に範囲を限定する必要があります。

根拠：Figureは2026年9月17日、未学習の30家庭で、タオルたたみ・部屋の片付け・ベッドメイクを評価したと発表しています。3作業の評価全体では成功率56％とし、タオルの成功条件、1枚につき3分の制限、人の安全介入が必要なら失敗とする基準も掲載しています。**56％はタオルだけの成功率ではありません。** [Figure「Helix 2.5」](https://www.figure.ai/news/helix-2-5-zero-shot-30-home-generalization)

修正案：
「人型では、Figureがタオルを自律でたたむ実演を公開しています。さらに2026年9月には、初めて入る30の家で、タオルたたみなどを試した結果も発表しました。ただ、家で毎日任せ続けた運用実績とは、まだ別です。」

---

**[❌ NG] S038・S065・S081：優勝機の学習方法が、途中から確定事項になっている**

問題：S034で「学ばせ方は見当たらない」と断ったのに、答えでは「仮想の練習で走れるようになった」と断定しています。Cassieの成功は、その方法が使える証拠であって、HONORがその方法で優勝した証拠ではありません。

根拠：Scientific Americanも、Lightningの基盤については **“likely”** と推定しています。また、機体づくりと投資という説明はFernの見解であり、学習方法と機体改良の寄与を分離して測った結果ではありません。S037の「仮想の練習よりも」も、比較の確度を上げすぎています。 [研究者への直接取材記事](https://www.scientificamerican.com/article/a-humanoid-robot-beat-the-human-half-marathon-record-at-a-beijing-race-but-what-did-it-actually-prove/)

修正案：
「仮想の練習は、走りを覚えさせる有力な方法です。今回の優勝機の学ばせ方は未確認ですが、この1年の速さの伸びを、機体づくりや投資の積み重ねから説明する専門家もいます。」

S065・S081でも、この確度を維持してください。

---

**[❌ NG] S063・S066・S081：本物のお手本が必要だという説明が、強すぎる**

問題：「布は仮想で練習しにくい」から「本物のお手本を集める必要がある」への推論には飛躍があります。難しさは事実ですが、実物の人間のお手本だけが解決経路ではありません。

根拠：Cloth Funnelsでは、仮想で学んだ衣服の整形・位置合わせを実機に移し、その後の折りたたみに利用しています。2026年にも、合成データや仮想での動作予測を使い、実物の布で検証した研究があります。S044の「研究も進んではいます」だけでは、既存の実機成果を弱く見せています。 [Cloth Funnels論文](https://arxiv.org/html/2210.09347)、[2026年の布操作研究](https://arxiv.org/abs/2606.24552)

修正案：
「布でも、仮想の練習を本物の動きにつなげた研究はあります。ただ、形や素材、重なり方が変わっても、安定して扱うのは難しい。実物のデータと仮想の練習をどう組み合わせるかが、まだ課題なんです。」

---

**[⚠️ 要注意] S008・S012・S022・S081：競技の好記録と、毎日の実用を比べている**

問題：「走る」と「たたむ」の差だけでなく、求めている合格条件にも差があります。片方は大会での好記録、もう片方は家庭での継続的な信頼性なので、その非対称性を答えに含める必要があります。

根拠：1回の高性能な走行が示されても、日々の安全性や失敗からの復帰まで示されたことにはなりません。逆に、家庭で毎日使える証拠が不足していても、折りたたむ技能そのものが未獲得とは限りません。これは比較の論理上の問題です。

修正案：
「走るほうは、大会で出した記録です。洗濯物のほうは、家で毎日任せられるか、という話。この条件の違いもふまえて、なぜ差があるのかを見ていきます。」

これは答えの先出しではなく、問いの条件の明示です。タイトルも「なぜ洗濯物はたためない」より、**「なぜ家の洗濯物はまだ任せられない」**が適切です。

---

**[⚠️ 要注意] S007・S013・S054・S082：「確認できない」と「その段階にない」は別**

問題：S007の限定した探索結果は言えますが、S013・S082では業界全体の到達段階を断定しています。公開された長期運用実績が見つからないことから、非公開の実現まで否定することはできません。

根拠：1Xは2026年4月に量産開始を発表しましたが、その発表での出荷先は研究施設と社内家庭試験で、一般顧客への初出荷は2026年予定でした。現在の製品説明にも、未知の作業にはExpert Modeを利用する仕組みがあります。今回確認した一次資料では、一般家庭で無介入の洗濯物たたみを長期間継続した実績までは確認できませんでした。 [1Xの生産・出荷発表](https://www.globenewswire.com/news-release/2026/04/30/3285118/0/en/1x-opens-neo-factory.html)、[NEO製品説明](https://www.1x.tech/neo)

修正案：
「2026年10月28日までに確認した公開資料では、人型ロボットに、家で、人の助けなしに洗濯物をたたみ続けてもらえると確かめられた、長期の運用実績は見つかりませんでした。」

S013・S082も、「公開資料では、その段階を確認できていない」という意味にそろえると堅実です。

---

**[⚠️ 要注意] S018・S084：大会の「自律」は、家庭で求める「無介入」と同じではない**

問題：優勝機が自律航法区分だったことは確認できます。ただし、その区分を「人の手を一切借りなかった」と受け取らせると、洗濯物側との比較が不公平になります。

根拠：大会規則の説明では、自律航法区分でも、起動、補給所での電池交換補助、緊急の追い越し・障害物回避、故障時の緊急停止について人の介入を認めています。電池交換や機体交換は「許可された条件」と「優勝機が実際に利用したもの」を分ける必要があります。 [大会規則の説明](https://www.chinanews.com.cn/cj/2026/04-19/10606411.shtml)

修正案：
「優勝機は、大会の区分では自律航法でした。ただ、この区分でも、電池交換など、一部の人の補助は認められていました。人の手を一切借りない、という意味ではありません。」

転倒映像を使う場合も、同じ「閃電」という機種名だけで優勝機の映像と断定しないでください。

---

**[⚠️ 要注意] S060・S063：750回から、必要なお手本の数は導けない**

問題：750回という本人の記録を示すことには問題ありません。ただし、試行回数を学習に必要だったデータ量のように扱い、さらに布にはもっと必要だとつなぐことはできません。

根拠：台帳は、失敗や調整を含む通しの試行記録です。学習用のお手本の本数、独立した条件の数、学習曲線とは異なります。しかもS062で挙がる問題は遮蔽であり、回数を増やすだけで解決するとは限りません。

修正案：
「固いブロック1つでも、エイイチはこれだけ試行錯誤しています。750回は、学習に必要だと分かった回数ではなく、この机の上で重ねた試行の記録です。」

S063は次のように：
「実物のお手本を集めるには、こうした撮り方や、見え方の工夫も要ります。数だけ増やせばいい、という話でもありません。」

---

**[⚠️ 要注意] S056・S063・S086：2026年のデータ収集方法を狭く描いている**

問題：「ネットにはほとんど落ちていない」は、ロボットの操作記録についてなら理解できます。しかし、人の作業動画を学習に利用する進展まで、ないように聞こえます。

根拠：Figureは2026年8月、家庭や職場で人が作業する動画を収集するIndexを発表し、9月にはその事前学習による性能改善を報告しています。企業自身の評価ですが、「ロボットを実際に動かしたお手本を集める」以外の経路として紹介すべき進展です。 [Figure「Index」](https://www.figure.ai/news/introducing-index)

修正案：
「ロボットをどう動かすかまで分かるデータは、文章ほど手軽には集まりません。人の作業動画や、仮想のデータも使って、この壁を越える方法が試されています。」

S086：
「3つ目、初めての物や置かれ方にも対応できるのか。どんなデータで学び、どんな条件で試したのかを見てください。」

---

**[⚠️ 要注意] S055〜S056：「10万年分」が、必要量の基準に聞こえる**

問題：発言の紹介としては出典に沿っています。しかし、文章を読む時間とロボットの動作時間は共通の情報量尺度ではなく、「ロボットも10万年分集めれば実用化できる」という基準にはなりません。

根拠：本人は、文章を人が読み切る時間に換算した数字として説明しています。同じインタビューでは、データを増やす方法と、工学的に作り込む方法の議論にも触れています。 [UC Berkeleyによる本人へのインタビュー](https://vcresearch.berkeley.edu/news/are-we-truly-verge-humanoid-robot-revolution)

修正案：
「ゴールドバーグさんは、言葉のAIが使う文章の規模を、人が読む時間に直して、約10万年分と説明しています。これはデータの規模の話で、ロボットにも同じ年数のお手本が必要だと分かったわけではありません。」

---

**[⚠️ 要注意] S007・S075：家庭で働く専用ロボットという強い反論が抜けている**

問題：人型に限定した問いなので直接の反証ではありませんが、家事を減らしたい視聴者には、すでにある別の形の製品も重要です。これを省くと、人型に限定して「まだできない」を作っているように見えます。

根拠：WeaveのIsaac 0は、据え置きの洗濯物たたみロボットとして、カリフォルニアへの出荷開始と家庭での稼働を会社が発表しています。ただし、自律と遠隔支援を組み合わせる製品です。したがって本稿の「無介入」の反証ではありませんが、実用化の現状として無視しにくい例です。 [Isaac 0公式説明](https://www.weaverobotics.com/isaac-0)

修正案：
「人型以外では、洗濯物をたたむ専用ロボットの出荷も始まった、と会社は発表しています。ただ、こちらも遠くから人が助ける仕組みを使っています。」

乾燥機や、たたまない収納については、一言「家事を減らす方法は、人型ロボットだけではありません」と添えれば十分です。

---

**[⚠️ 要注意] S052・S075：固定式の実験から「足は要りません」まで広げている**

問題：取り上げる固定式実験の説明は正しいですが、π0論文には移動式で洗濯物を扱う実験もあります。「たたむ動作」と「家の中で洗濯物を集めて運ぶ仕事」を分ける必要があります。

根拠：論文のVI-Dには、固定式の洗濯物たたみに加え、移動式の洗濯物たたみと乾燥機からの取り出しが載っています。固定式でできることは、家庭の仕事全体に移動能力が不要という証明ではありません。 [π0論文・VI-D](https://arxiv.org/html/2410.24164v3)

修正案：
S052：
「ここで取り上げる実験は、人型ではなく、動かない台に腕が2本ついたロボットです。」

S075：
「決まった台の上でたたむだけなら、足のない形でもできます。家の中で集めて運ぶところまで任せるかは、別に考える必要があります。」

---

**[⚠️ 要注意] S077：資金集めという見立ては、実用能力の評価の根拠にはならない**

問題：S073・S076で、本人の見立てであることは伝わっています。問題はS077の「その目で見ると」で、企業の動機についての推測が、技術評価の根拠であるかのようにつながることです。

根拠：資金調達を狙った実演でも、技術的価値はあり得ます。逆に、資金調達目的でなくても、競走の結果だけで現場の仕事を評価することはできません。S037〜S038の「投資が性能向上を支えた」という話も、企業の実演の目的を証明しません。

修正案：
「マラソンで確かめられたのは、その条件で走る力です。現場で仕事ができるかは、仕事ごとの検証が要ります。」

**S076の見立て自体を弱める必要はありません。接続を直せばよいです。**

---

**[⚠️ 要注意] S004・S019：「3倍」は優勝タイムの比較であって、同一機体の改善率ではない**

問題：計算は正しいです。ただし、「ロボットの性能が1年で3倍」という一般化には使えません。

根拠：2時間40分42秒は9,642秒、50分26秒は3,026秒で、同距離での平均速度の比は約3.19倍です。一方、前年は天工、今年はHONORの閃電であり、機体が違います。 [新華社の結果報道](https://www.news.cn/sports/20260419/c91172da5ef84342b7b07fb3c2ef8f12/c.html)

修正案：
「前年と今年の優勝タイムを比べると、平均の速さは3倍あまりです。機体や大会条件は違いますが、大きく記録が縮まったのは確かです。」

---

**[⚠️ 要注意] S003：「最高記録」と「世界記録候補」を区別したい**

問題：56分51秒と、その差が6分25秒であることは確認できます。ただし「人間の男子の最高記録」だと、公認条件を満たさなかった速いタイムまで含むように読めます。

根拠：World Athleticsは同じ記事で、2025年の56分42秒は競技条件が規則を完全には満たさず、公認できなかったと説明しています。また、出典表の「大会の時点の公認は57分20秒」は誤りで、その記録の公認発表は2026年9月3日です。 [56分51秒の公式記事](https://worldathletics.org/news/report/world-half-marathon-record-buenos-aires-2026-yomif-kejelcha)、[57分20秒の公認発表](https://worldathletics.org/news/press-releases/ratified-world-records-kiplimo-tharp-wanyonyi)

修正案：
「人間の男子では、この8月に56分51秒という世界記録候補が出ました。まだ公認の手続き中ですが、そのタイムよりも、6分あまり速かったんです。」

---

**[⚠️ 要注意] S015〜S016：4種類の札に、本人の記録と著書が収まらない**

問題：S059の台帳は「見立て」ではなく本人の記録、S068は「論文」ではなく著書です。また、研究者のインタビューでの見解を、実験で確かめられた結果と同じ表示にすると誤解を招きます。

根拠：出どころの種類と、主張の確度は別です。企業が発表した自律実演、論文の実験結果、研究者の予測は、それぞれ画面上でも区別する必要があります。

修正案：
「今日の出どころは4種類。大会や会社の発表、ニュースの報道、論文や著書などの研究の資料、そしてエイイチの記録と見立てです。札には、誰の、いつの話かも添えます。」

運用上は、S059を「エイイチの記録」、S076を「エイイチの見立て」と副表示すれば、4分類を維持できます。S037・S072は「ニュースの報道／研究者の見解」、S070は「大学のインタビュー／研究者の見解」が適切です。

---

**[⚠️ 要注意] S036・S040〜S045：地面を「毎回同じ問題」にしすぎている**

問題：「足で踏んでも布のようには変形しない」という比較は有効です。ただし、地面の条件まで毎回同じという説明は、走行制御を過小評価しています。「同じ置かれ方は二度とありません」も不要な絶対表現です。

根拠：紹介しているANYmal研究自体が、斜面、段差、障害物、摩擦の違いなどを扱っています。布の研究が示すのも、状態の多様さと予測の難しさであって、似た状態が二度と生じないことではありません。 [ANYmal論文](https://arxiv.org/html/2109.11978v3)、[RGBench論文](https://arxiv.org/html/2511.06434)

修正案：
S040：
「地面にも、坂や段差、すべりやすさの違いはあります。ただ、固い路面なら、踏むたびに布のように形が変わるわけではありません。」

S041後半：
「同じ服でも、置かれ方や重なり方が、毎回変わります。」

S045：
「地面の先生も難しい問題は出します。でも洗濯物の先生は、さわる途中で、問題の形まで変えてくるんです。」

---

**[⚠️ 要注意] S033：「転んでは起き上がる」は、学習した能力を取り違えさせる**

問題：軽い一言としては機能していますが、この実験で4096台が自力で起き上がる技能まで学んだように聞こえます。

根拠：論文では、転倒時に環境をリセットします。自己起立の実演とは異なります。 [論文・Episode Termination](https://arxiv.org/html/2109.11978v3)

修正案：
「4096台が、転んだらやり直し。また歩いて、またやり直し。体育館としては、かなりにぎやかです。」

---

確認できた点も明記します。

- **A1の中心数字は一致しています。** 50分26秒、自律航法区分、前年2時間40分42秒、遠隔操作区分の1.2倍換算は確認できました。電池・機体交換の但し書きも、規則の説明の範囲です。ただし「道順が事前に決まっている」だけでは、人間のロードレースとの差にはなりません。強調すべきは専用区画、事前の地図、補助条件です。
- **A2の研究紹介は基本的に正確です。** ETHとNVIDIA、4096台、平地4分未満、不整地20分未満、GPU1枚、実機ANYmalへの移行は本文と一致します。4分・20分は準備済みの設定での学習計算時間であり、研究開発全体の所要時間ではありません。 [研究本文](https://arxiv.org/html/2109.11978v3)
- **S035のつなぎは成立します。** Cassieが2021年に走ったことと、仮想での強化学習を実機の歩行・走行につなげたことは、開発大学の資料でも確認できます。ただし、これをHONORの学習方法の確定に使うことはできません。 [Oregon State University](https://engineering.oregonstate.edu/all-stories/great-strides)
- **S041〜S044の布の難しさ、S050〜S051のπ0の数値は、おおむね出典内です。** π0の1万時間超は複数作業の合計で、5〜20分は複雑な作業の実行時間です。必要な収集時間の下限ではありません。 [π0論文](https://arxiv.org/html/2410.24164v3)
- **S068〜S069の趣旨は確認できました。** 原書の公開OCRの該当箇所は、知能テストと1歳児の知覚・移動能力を対比しています。ただしS067は「実は、この難しさの逆転は」とすると、現在の学習方法まで1988年に説明されていたという誤読を避けられます。 [原書本文の公開OCR・p.15](https://www.scribd.com/document/678843543/8-Moravec-H-1990-Mind-Children)
- **S070のゴールドバーグの発言、S072の「思い込み」の紹介は、発言として出典に沿っています。** 現在も例外なく成立する技術的法則として扱わないことが条件です。
- **謎の答えを後半まで待たせる構成自体は問題ありません。** 冒頭で比較条件と「まだ」の意味を明示すれば、不親切にはなりません。S025・S046・S087にも、会社や国を笑い物にする問題は見当たりません。S078の5年という話も、本人の感覚として明示されています。

最後の判定です。

1. **このまま公開してよいか：直してから。** 大きく作り直す必要はありませんが、S053の更新と、S065〜S066・S081の答えの書き換えは必要です。
2. **公開前に必ず直すべき文番号：S007・S008・S012・S013・S018・S037〜S038・S053・S060・S063・S065〜S066・S081〜S082。** あわせて、S015〜S016の札の分類と、出典表の「大会時点で57分20秒が公認済み」という記述を直してください。
3. **結論そのもの：条件つきで成立。** 「走行の好記録から、家庭での器用な作業能力は推定できない」は成立します。一方、「走る＝仮想で学べる、たたむ＝実物のお手本が足りない」という二分法では説明不足です。3つの手がかりを**差を生む要因**として示し、最後に「家庭では、初めての条件や失敗にも対応し、毎日安定して完了することまで必要」と結べば、反論に強くなります。
```

#### codex 検証結果 2回目（3件・「直してから」）

```text
# codex 敵対的検証 結果 2回目（世界記録と洗濯物）

- 日時: 2026-10-28 14:30（JST）
- 依頼文: codex_敵対的検証依頼_世界記録と洗濯物.md（md5 22a0a3fed0d7809a2c46e84e6c0d4a59・26,255 バイト）
- 題（依頼文の1行目）: # 敵対的検証依頼：YouTube台本「人型ロボットは人間より速く走ったのに、なぜ洗濯物はたためないのか（仮題）」
- codex: codex-cli 0.164.0-alpha.11.1
- モデル: gpt-6.1-sol
- 考える深さ: high
- ウェブ検索: あり（検索した回数 32）
- かかった時間: 5分35秒
- 使ったトークン: 167,131
- 指摘の数: 3（うち出典のリンクが付いたもの 3）
- 出典の URL: 18件（別々・文の中に張られた回数 23）

---
**結論は「直してから」です。** 大きな数値の誤りは見つかりませんでした。残る修正は、結論での因果の断定と、地面についての一般化です。構成・たとえ・エイイチの見立てへの変更提案はしていません。

**[⚠️ 要注意] S068・S083**

問題：「本物のお手本を集める必要があるからです」は、実物のお手本の収集を必須条件として言い切っています。また、引用した研究は、家庭で毎日任せられない原因をこの要因に特定したものではありません。

根拠：RGBenchが示しているのは、布の状態・接触の複雑さと、シミュレーションと実物のずれです。一方、Cloth Funnelsは、仮想環境で学習した方策を実機に移し、衣服の整形から折りたたみにつなげています。「難しさを説明する要因」までは支持できますが、「実物のお手本が必要だから未達」という断定までは支持しません。[RGBench原論文](https://arxiv.org/html/2511.06434)、[Cloth Funnels原論文・結論](https://arxiv.org/html/2210.09347#S5)

修正案：

S068：
> たたむのがまだなのは、相手が形を変える布で、仮想の世界では練習しにくく、本物のお手本を集めるにも時間がかかることが、理由の1つだと考えられます。

S083：
> 走るのが人間を追い越したのは、仮想の世界でも練習しやすい動きの上に、機体づくりと投資が積み重なったから、と考えられます。たたむのがまだなのは、布は形が決まらず、仮想の世界で練習しにくく、本物のお手本を集めるにも時間がかかることが、理由の1つだと考えられます。

---

**[⚠️ 要注意] S041**

問題：「地面は形が変わりません」は、地面全般についての断定になっています。S037にある「布のように形が変わるわけではない」という比較が、ここで抜けています。

根拠：土・砂・雪など、踏むと変形する地面もあります。今回の説明に必要なのは、道路や研究で扱った地面と布との変形の違いであり、地面すべての不変性ではありません。ANYmalの研究も、設定した地形での学習と実機への移行を示したものです。[Rudinらの原論文](https://arxiv.org/html/2109.11978)

修正案：
> 一言で言うと、道路の地面は、布のようには形が変わりません。でも洗濯物は、さわるたびに形が変わります。

---

**[⚠️ 要注意] S054に対応する出典表**

問題：出典表のHelix 2.5の発表日「2026-09-18」は、公式ページの日付と1日違います。台本本文の「2026年の9月」は正しいため、読み上げ文の変更は不要です。

根拠：公式ページの掲載日は **September 17, 2026** です。[Figure公式発表](https://www.figure.ai/news/helix-2-5-zero-shot-30-home-generalization)

修正案：
> 出典表を「Helix 2.5・2026-09-17」に修正。

---

そのほかの主要な照合結果は、次のとおりです。

| 対象 | 確認結果 |
|---|---|
| **S003〜S006：大会とタイム** | 300台超、50分26秒、自律航法区分での優勝、前年2時間40分42秒は一致。56分51秒との差は**6分25秒**、優勝タイムから求めた平均速度の比は**約3.19倍**です。機体が違うという限定も適切です。[新華社](https://www.news.cn/sports/20260419/c91172da5ef84342b7b07fb3c2ef8f12/c.html)、[中国新聞網](https://www.chinanews.com.cn/cj/2026/04-19/10606411.shtml) |
| **S005：人間の記録** | 2026年8月23日の56分51秒と、公認手続きの対象という説明は公式発表に一致します。9月3日の公式発表でも手続き中とされ、その後の公認発表は今回の検索では見つかりませんでした。[World Athletics・大会報告](https://worldathletics.org/news/report/world-half-marathon-record-buenos-aires-2026-yomif-kejelcha)、[9月3日の公認発表](https://worldathletics.org/news/press-releases/ratified-world-records-kiplimo-tharp-wanyonyi) |
| **S020〜S022・S086：競技条件** | 電池交換、罰則つき機体交換、伴走車、自律区分で許容された限定的な人工介入、遠隔操作区分の1.2倍係数は記載と一致します。「認められた条件」として述べており、優勝機が全部利用したとは言っていない点も適切です。[北京市政府](https://english.beijing.gov.cn/latest/news/202604/t20260419_4593508.html)、[競技規則を紹介した中国新聞網の記事](https://www.chinanews.com.cn/cj/2026/04-19/10606411.shtml) |
| **S031〜S036：仮想環境の研究** | ETH ZurichとNVIDIA、4096台、平地4分未満、不整地20分未満、GPU1枚、実機への移行は一致。Cassieが2021年に仮想環境での学習を使って実機で走った説明も一致します。[Rudinら原論文](https://arxiv.org/html/2109.11978)、[オレゴン州立大学](https://engineering.oregonstate.edu/all-stories/great-strides) |
| **S035・S038〜S039・S067・S083前半** | 優勝機の具体的な学習方法を確認済みとする一次資料は、今回も確保できませんでした。学習方法を未確認とするS035と、「考えられます」とした結論は両立しています。機体づくりと投資による説明、S074の「思い込み」は、記事中の研究者本人の発言に沿っています。[Scientific Americanの取材記事](https://www.scientificamerican.com/article/a-humanoid-robot-beat-the-human-half-marathon-record-at-a-beijing-race-but-what-did-it-actually-prove/) |
| **S042〜S045・S051〜S053** | 布の形・自己接触・実物との差についての説明は論文の範囲内です。π0には、かごから衣服を取り出してたたみ積む**固定式双腕の実験が実際にあり**、S053・S077の説明は成立します。1万時間超は複数作業の合計、5〜20分は複雑な作業の所要時間という整理も一致します。[RGBench](https://arxiv.org/html/2511.06434)、[π0原論文・VI-D](https://arxiv.org/html/2410.24164v3#S6.SS4) |
| **S054〜S056：Figure・1X** | Figureの2025年8月の自律タオルたたみ、2026年9月の未知の30軒での会社試験は一致。1Xの4月30日の量産開始、顧客向け出荷の2026年予定、未知の作業に遠隔の担当者を使う説明も一致します。現在の注文ページも2026年の米国配送開始を掲げています。[Figure・2025年発表](https://www.figure.ai/news/helix-learns-to-fold-laundry)、[Figure・30軒の試験](https://www.figure.ai/news/helix-2-5-zero-shot-30-home-generalization)、[1Xの工場発表](https://www.globenewswire.com/news-release/2026/04/30/3285118/0/en/1X-opens-NEO-Factory.html)、[NEO注文ページ](https://www.1x.tech/order) |
| **S057〜S058・S072：ゴールドバーグ** | 10万年は文章を人が読む時間に換算した規模の説明です。台本が「同じ年数のお手本が必要と判明したわけではない」と限定したのは適切です。走行・宙返りと器用な手作業についての発言紹介も、本人へのインタビューに沿っています。[UC Berkeleyのインタビュー](https://vcresearch.berkeley.edu/news/are-we-truly-verge-humanoid-robot-revolution) |

**S010の「公開資料では見当たりませんでした」は、今回の調査でも維持できます。** 家庭での自律作業の実演や試験はありますが、「遠隔操作や人の手助けなしで、毎日洗濯物をたたみ続ける人型ロボット」という条件を満たす継続運用の公開記録は確認できませんでした。ただし、これは公開資料上の確認結果であり、存在しないことの証明ではありません。現在のS010は、その区別を保っています。[Figureの試験報告](https://www.figure.ai/news/helix-2-5-zero-shot-30-home-generalization)、[NEOの自律性・遠隔支援の説明](https://www.1x.tech/neo)

確認上の留保は2点です。

- **S054の62％**：公式本文で30軒・全作業56％・全タオルの完了を成功とする条件は確認できましたが、62％を載せた一次資料の図画像は、この環境では直接判読できませんでした。**62％を一次資料で完全照合済みとはしていません。**
- **S069〜S071のモラベック**：本人のサイトで著者・書名・1988年刊行は確認できましたが、原書の該当本文までは直接確認できていません。今回、新たな誤りの根拠は見つかっていません。[モラベック本人の書誌ページ](https://frc.ri.cmu.edu/~hpm/book88/MC.details.html)

エイイチの発言・750回については、ご指定どおり外部検証の対象にしていません。S061は本人の試行錯誤の記録、S078〜S080は本人の見立て・予想として伝わっており、言い換えは不要です。

1. **事実の面で、このまま公開してよいか：直してから。**
2. **公開前に必ず直す文番号：S041・S068・S083。** あわせて出典表のS054対応日付を修正し、S054の62％は公式図1で最終照合してください。
```

#### 台本の最終版 narration.py（11版・97文）

```python
# -*- coding: utf-8 -*-
# 台本「人型ロボットは人間より速く走ったのに、なぜ洗濯物はたためないのか」（仮題）— 謎解きの型の1本目
#   2026-10-28 11版。エイイチの指示「おれの声を作って入れたい。今ある誰かの声を流用でいい」。エイイチの言葉4つを、ハコブくんの前置き＋エイイチの声（槙原の声を流用）に分けた。
#     言葉は本人の答えのとおり（口調だけ話し言葉に）。声は voice_eleven/ハコブ_11版/（ハコブ）と voice_eleven/エイイチ/（槙原）
#   2026-10-28 10版。場面の名前を分けた（hook_time・hook_answer・map2・solve_run・solve_fold）
#   2026-10-28 9版。エイイチの提案で、冒頭の感想の前に紹介の1文（ei_intro）を足し、ここでエイイチ（ドット絵）が初めて登場する。名前の札も出す。
#     声は voice_eleven/ハコブ_足し後/（文7を足して番号を付け直した写し）。元の ハコブ/ は残す
#   2026-10-28 8版。1文目「家の洗濯物には、まだ勝てていない」は意味が分かりにくい（エイイチ）→「…いるのに、家の洗濯物を任せられるロボットは、まだ見当たらない」。声は文0だけ作り直す
#   2026-10-28 7版。codex 2回目（事実確認だけ・「直してから」・3件）を受けた: 地面は「道路の地面は布のようには」・答えの2か所を「理由の1つだと考えられます」・出典表の Helix 2.5 の日付を 2026-09-17 に。
#     62%は公式ページの図を codex が読めなかった（humanoid.guide でタオル62%を確認済み・二次）
#   2026-10-28 6版。エイイチの指示「台本の最初をもっと人を惹きつける内容に。まだ固すぎ」。冒頭〜早とちりの言い回しとテンポだけを直した（事実と筋は5版のまま）:
#     逆説の一行から入る・作り話のようですが本当の話・視聴者に聞く・犯人は足でも手でもない（山場の予告）・約束と条件を短く・成績表のひと言・早とちりを2文に
#   2026-10-28 5版。エイイチの指示「codex は事実確認をベースに。内容を変えるのはやめて（多少はいい）」。codex の提案で筋を組み替えた4版はやめ（_旧版/_narration_4版_codexで組み替え.py）、
#     3版の筋のまま、codex 1回目の事実の指摘だけを入れた: 世界記録候補・3倍は機体のちがう優勝タイムの比べ・自律の区分でも一部の補助は認められていた・
#     1年の伸びは機体と投資から「説明する専門家もいる」・優勝機の学ばせ方は未確認なので「走れる土台は仮想の練習」を言い切らない・地面と布の言い方・4096台はやり直し・
#     Figure は2026-09 に初めての30軒で試しタオル62%と発表（会社の試験で、毎日任せた記録とは別）・1X は2026-04 量産開始・一般の出荷は2026年予定・
#     10万年は規模のたとえ・750回は試行錯誤の記録・足は要らないは台の上でたたむだけ・見立てのあとのつなぎ・札は記録と見立て／論文や本
#     入れなかった（筋が変わるため）: 題と問いの言い換え・人の作業動画の章・据え置きの専用ロボット・確かめる3つの3つ目の言い換え
#   2026-10-28 3版。別のエージェントの照合（_照合_20261028.md）を受けた: 1年で速くなった理由は仮想の練習ではなく機体づくりと投資（SciAm の専門家）。仮想の練習は走れる土台。
#     2本足の Cassie（2021）でつなぐ・地面の言い方・電池と機体交換と伴走の車・HONOR は「見当たらない」・ETH と NVIDIA・GPU 1枚・π0 の1万時間はいろいろな作業の合計・
#     1X は会社自身の説明・ゴールドバーグの10万年の意味・やさしい側に移ったはゴールドバーグの発言に・布の仮想の研究も進んでいる・ディン助教の「思い込み」・答えで「まだ」の定義を言い直す
#   2026-10-28 2版。エイイチの実感（2節26）を4つ入れた。C節の読み替え（冒頭で数字と謎・答えは山場）はエイイチが了承。
#     エイイチの言葉（言い回しだけ整え、中身は足していない）:
#       1 ニュースを見て「ロボットの性能はすごく上がっているけど、能力は仕事に関係なさそうだね（少なくとも直接は）」
#       2 机の上「上カメラだけなので、アームやグリッパーでブロックが隠れたりして、掴む精度や確率を上げられなくて苦労した」
#       3 「どの家庭でもということになるには5年くらいはかかりそうかなと感じています」
#       4 「中国の人型ロボットの派手な動きは出資を集める意図が強く、現場で仕事ができるかは別」（強く主張してよい、とエイイチ）
#   2026-10-28 1版。エイイチが題材A（世界記録と洗濯物）に決め、「この台本から作ってみて」と指示。
#   型: 参考動画（海外ワイパラジオ・GMO の回）を分析して決めた謎解きの型。冒頭で変な事実（謎）を出し、答えは山場（全体の75〜80%）で出す。
#     C節の「冒頭30秒で答えか数字を出す」は、この型では「冒頭で数字と謎を出し、答えは山場」と読む（エイイチに確認中）。1節の「先に結論」は置かない。
#     地図（たとえ）は1つだけ: ロボットの学校。走る＝体育、たたむ＝家庭科。手がかりは3つ（練習する場所・相手の形・お手本の数）。
#     出どころの札は4種類（大会や会社の発表／報道／研究の論文／エイイチの見立て）。札は画面の右上に出す（scenes.py で）。
#   エイイチ（ドット絵・右下の小窓・声なし）が出る場面: ei_intro・ei_react（初登場の紹介と、ニュースへの感想＝腕組み・名前の札）、ei_desk*（現場の証人・自分で確かめた所＝うなずく→指さす）、mitate*（見立て＝腕組み→ひらめく）。
#     ほかの場面には出さない（2026-10-28 エイイチと決めた: 出るのは、自分で確かめた所・現場の証言・見立ての3つだけ）。
#   ★まだのこと:
#     - エイイチの実感の一言（2節26）: 台本を見てもらったあとに3〜5問聞いて入れる。いまは入れていない（Claude が想像で書かない）
#     - 見立ての2つ目: 本人に聞いてから。いまは「人型である必要はない派」（見立て帳 2026-10-19）だけを使っている
#     - 別のエージェントの照合（事実・言い過ぎ）と codex は、この版のあと
#   要確認（照合で必ず見る）:
#     - 閃電が「自律で」走ったか（36Kr Japan だけが「自律ナビのみ」と書いている）。速さだけなら遠隔操作の HONOR 機が48分19秒で最速、1.2倍の補正で閃電が優勝
#     - ei_desk2 の「要所の姿勢を手で教えて再生して撮る」は LOG349（2026-10-18）の記事と照らす（site_archive は 10-12 までで、まだ入っていない）
#     - 1X NEO の「洗濯物は人が遠くから手伝う」は二次（the Gadgeteer 2026-05・WSJ の取材）
#     - ゴールドバーグさんの10万年は二次（UC Berkeley の記事）。原文は Science Robotics 2025-08-27
#   数字と出典（2026-10-28 に別のエージェントが開いて確かめた。詳しくは _事実確認_20261028.md）:
#     - 2026-04-19 北京亦庄 人型ロボット ハーフマラソン: 21.0975km・300台超・100チーム超・優勝 閃電（HONOR）50分26秒・遠隔操作は1.2倍で採点・自律は約4割
#       新華社 https://www.news.cn/sports/20260419/c91172da5ef84342b7b07fb3c2ef8f12/c.html ／北京市政府 https://english.beijing.gov.cn/latest/news/202604/t20260419_4593508.html ／中国新聞網・China Daily・AP・TechCrunch・Scientific American
#     - 2025年の第1回: 天工 Ultra 2時間40分42秒（新華社）。160.7分÷50.4分＝約3.2倍
#     - 男子ハーフマラソンの世界記録: 56分51秒（ケジェルチャ・2026-08-23 ブエノスアイレス・World Athletics は公認手続き中）。公認済みは57分20秒（キプリモ・2026-03-08）
#       56:51−50:26＝6分25秒（6分あまり）。56分51秒は大会の後（8月）に出た世界記録候補で公認手続き中。57分20秒（2026-03-08）の公認発表は2026-09-03
#     - Rudin ら 2021（ETH Zurich・CoRL）: 4096台を同時・平地4分未満・でこぼこ20分未満・GPU 1枚・実機（ANYmal・四足）に移せた https://arxiv.org/pdf/2109.11978
#     - 布のシミュレーションの難しさ: RGBench（2025） https://arxiv.org/html/2511.06434
#     - π0（Physical Intelligence）: 双腕・固定・事前学習のロボットデータ1万時間超・複雑な作業は1回5〜20分 https://arxiv.org/html/2410.24164v3
#     - Figure 2025-08-12: タオルを完全に自律でたたんだと発表（速さ・成功率は非公表） https://figure.ai/news/helix-learns-to-fold-laundry
#     - 1X NEO: 2025-10 予約開始（家庭向け）。報道で洗濯物は遠隔の手伝い
#     - ゴールドバーグ: 10万年分のデータの差 https://vcresearch.berkeley.edu/news/are-we-truly-verge-humanoid-robot-revolution
#     - モラベック『Mind Children』1988年（趣旨。原書は未確認・概要欄に書く）
#     - Scientific American（専門家の見方・Brooks の「見せもの」・仮想の世界での練習が理由の1つという推測）
#     - エイイチの机の上: KIOXIA runs/pick_place_ledger_v3.csv が750行（2026-06-18〜2026-10-22。失敗も含めた通しの試行）。2026-10-28 に数えた
# 何の動画か（5行・video_rules.md 2節16）
#   1. 謎: 人型ロボットがハーフマラソンで人間の世界記録より速く走った。なのに、家で洗濯物を任せられる人型ロボットはまだない。なぜ？
#   2. 手がかり1 練習する場所: 走るのは仮想の世界で何千台も同時に練習できる（相手は地面）
#   3. 手がかり2 相手の形: 布は形が毎回変わり、仮想の世界で正しく動かしにくい
#   4. 手がかり3 お手本の数: だから本物のお手本が要り、集めるのに本物の時間がかかる（机の上の証人）
#   5. 解決: 人に簡単なことほどロボットには難しい（モラベック）。走るはやさしい側に移り始め、手で扱うは難しい側に残る。動画を見たら確かめる3つ
# 話すのはハコブくん。エイイチは三人称で呼ぶ（video_rules.md 3-1）
#
# 各要素: (場面の名前, 表情, 字幕の文, 後ろの間[秒])  間を省略すると 0.35 秒
# 字幕の文の中の「｜」: 1文を読み上げたまま、字幕だけをそこで次の1枚に替える
FACES = ("base", "smile", "surprise", "doubt", "think", "trouble", "joy", "wink")

SEGS = [
 # 0 謎
 ("hook", "surprise", "人間の世界記録より速く走るロボットがいるのに、家の洗濯物を任せられるロボットは、まだ見当たらない。"),
 ("hook", "smile", "作り話のようですが、今年、本当にあった話です。", 1.2),
 ("hook_race", "base", "2026年の4月、北京。人型ロボットが300台以上集まって、ハーフマラソンを走りました。"),
 ("hook_time", "surprise", "優勝したロボットのタイムは、50分26秒。21キロあまりを、です。"),
 ("hook_wr", "doubt", "人間の男子の世界記録候補は、この8月に出た56分51秒。まだ公認の手続き中ですが……ロボットのほうが、6分あまり速いんです。"),
 ("hook_last", "base", "しかも1年前の大会の優勝は、2時間40分42秒。機体はちがいますが、優勝タイムで比べると、平均の速さは3倍あまりです。"),
 ("hook_joke", "trouble", "ハコブくんは、走るのは最初からあきらめています。", 1.2),
 ("ei_intro", "smile", "ここで、もう1人紹介させてください。この番組を作っている、エイイチです。"),
 ("ei_react", "think", "このニュースを見たエイイチの感想は……"),
 ("ei_react", "think", "ロボットの性能は、すごく上がっているけど、その能力は、仕事には関係なさそうだね。少なくとも、直接は。", 1.2),
 ("hook_turn", "doubt", "じゃあ、ここで1つ聞かせてください。あなたの家の洗濯物、このロボットに任せられると思いますか。", 1.2),
 ("hook_answer", "think", "答えは、まだ、です。｜今日までに確かめた公開資料では、｜人の手を借りずに、家で毎日洗濯物を｜たたみ続けている、人の形をしたロボットは、見当たりませんでした。"),
 ("hook_q2", "surprise", "人間より速く走れるのに、洗濯物は任せられない。｜この逆転、ちょっと不思議じゃないですか。", 1.8),
 # 1 自己紹介
 ("title", "smile", "Pixels to Motors。案内役のハコブくんです。"),
 ("title", "base", "この番組では、フィジカルAIのニュースや実機の記録から、現場で使える形を考えます。"),
 ("title_eiichi", "smile", "エイイチは、本業のデザイナーをしながら、ロボティクスの研究と開発をしています。｜その中で分かったことと、そこから考えた見立てを、ハコブくんがお伝えします。", 1.8),
 # 2 今日の謎
 ("question", "base", "今日は、この謎を解いていきます。走るのは人間を追い越したのに、なぜ、たたむのは、まだなのか。"),
 ("define", "base", "ここで言う、まだ、は、家で、人の手を借りずに、毎日任せられるところまでは来ていない、という意味です。"),
 ("teaser", "wink", "先に言っておくと、犯人は、ロボットの足でも、手でもありません。", 1.2),
 # 3 聞くときの約束
 ("promise_cards", "base", "謎を解く前に、1つだけ約束を。今日の話は、出どころを、画面の左上に札で出します。"),
 ("promise_cards", "smile", "大会や会社の発表、ニュース、論文や本、そしてエイイチの記録と見立て。どこまで信じるかは、札を見て決めてください。", 1.2),
 ("promise_fair", "base", "それから、ロボットのタイムは、人の記録と同じ条件ではありません。"),
 ("promise_fair", "base", "電池の交換や、罰則つきの機体の交換が認められ、後ろには伴走の車。自律で走る区分でも、一部の人の補助は認められていました。"),
 ("promise_fair", "smile", "それでも、記録が大きく縮んだのは確かです。ここを手がかりにします。", 1.8),
 # 4 地図（たとえは1つだけ）
 ("map", "think", "たとえを1つだけ置かせてください。ロボットの学校です。走るのは体育、洗濯物をたたむのは家庭科。"),
 ("map2", "smile", "同じ学校の生徒が、体育では世界記録を追い越したのに、家庭科ではまだ、先生の手を借りている。｜成績表にすると、なかなか極端です。"),
 ("toc", "base", "この差を、3つの手がかりで解いていきます。1つ目は、練習する場所。2つ目は、相手の形。3つ目は、お手本の数です。"),
 ("toc", "smile", "特に2つ目は、洗濯物のほうが一枚上手、という話です。最後に、エイイチの見立てを話します。", 1.8),
 # 5 ハコブくんの早とちり
 ("hayatochiri", "joy", "とはいえ、ハコブくんは最初、手のほうが足より部品が細かいからだ、と思いました。"),
 ("hayatochiri2", "trouble", "……でも、細かく動くロボットの手は、もう作られ始めています。問題は、その手の動かし方を、どうやって覚えさせるか、なんです。", 1.8),
 # 6 手がかり1 練習する場所
 ("c1", "base", "1つ目の手がかり、練習する場所です。", 1.2),
 ("c1", "base", "一言で言うと、体育の練習は、コンピューターの中でできます。"),
 ("c1_sim", "think", "スイスのチューリッヒ工科大学とNVIDIAの研究では、コンピューターの中の仮想の世界に、4本足のロボットを4096台並べて、同時に歩く練習をさせました。"),
 ("c1_sim", "surprise", "平らな地面なら、4分足らずで歩き方を覚え、でこぼこの地面でも、20分足らずでした。使ったのは、画像を処理する部品を1枚積んだ、計算機1台です。"),
 ("c1_sim", "base", "そして、覚えた歩き方を、本物のロボットに移して、動かせました。"),
 ("c1_joke", "smile", "4096台が、転んだらやり直し。また歩いて、またやり直し。体育館としては、かなりにぎやかです。"),
 ("c1_note", "base", "ただ、これは4本足のロボットの研究です。｜マラソンで優勝した会社が、どう学ばせたかも、今回調べた発表や報道には見当たりませんでした。"),
 ("c1_note", "base", "それでも、2本足のロボットも、2021年には、仮想の世界での練習を使って走れるようになっていた、と開発した大学は伝えています。"),
 ("c1_why", "think", "走るとき、足が触れる相手は、地面です。坂や段差、すべりやすさのちがいはあっても、踏むたびに、布のように形が変わるわけではありません。計算で再現しやすいんです。", 1.2),
 ("c1_speed", "doubt", "では、この1年で記録が大きく縮んだのは、なぜか。モーターや冷やし方といった機体づくりと、投資の積み重ねから説明する専門家もいます。"),
 ("c1_speed", "think", "走りを覚えさせる練習のしかたと、速さを伸ばした機体づくり。この2つは、分けて覚えておいてください。", 1.8),
 # 7 手がかり2 相手の形
 ("c2", "base", "2つ目の手がかり、相手の形です。", 1.2),
 ("c2", "base", "一言で言うと、道路の地面は、布のようには形が変わりません。でも洗濯物は、さわるたびに形が変わります。"),
 ("c2_cloth", "think", "Tシャツをつかんで持ち上げると、袖が垂れて、すそがねじれて、布どうしが重なります。同じ服でも、置かれ方や重なり方は、毎回変わります。"),
 ("c2_cloth", "base", "2025年の研究では、布は取りうる形が限りなくあり、布どうしが何度もぶつかって重なるので、仮想の世界で正しく動かすのが難しい、とされています。"),
 ("c2_cloth", "base", "仮想の布の動きが、本物の布と合わないことも、課題に挙げられています。"),
 ("c2_cloth", "base", "布を本物に近く動かす仮想の世界を作る研究も、進んではいます。ただ、課題はまだ残っている、というのが、この研究の見方です。"),
 ("c2_joke", "smile", "地面の先生も、難しい問題は出します。でも洗濯物の先生は、解いている途中で、問題の形まで変えてきます。"),
 ("c2_joke", "wink", "しかも、正解のたたみ方も、家ごとにちがいます。", 1.2),
 ("c2_end", "base", "だから、たたむ練習では、本物の布の前でお手本を集めて、覚えさせる方法が使われています。", 1.8),
 # 8 手がかり3 お手本の数（今日いちばん大事）
 ("c3", "base", "3つ目の手がかり、お手本の数です。今日いちばん大事なところです。", 1.2),
 ("c3", "base", "一言で言うと、本物のお手本は、集めるのに、本物の時間がかかります。"),
 ("c3_pi", "think", "アメリカのPhysical Intelligenceという会社は、2本の腕のロボットに、かごの服を取り出して、たたんで積ませました。"),
 ("c3_pi", "base", "論文によると、洗濯物に限らず、いろいろな作業を合わせて1万時間を超える、ロボットの動きのデータで、先に学ばせています。｜そして、手の込んだ作業は、1回に5分から20分かかっています。"),
 ("c3_pi", "base", "形は人型ではなく、動かない台に、腕が2本ついたロボットです。"),
 ("c3_figure", "base", "人型では、Figureという会社が、2025年の8月に、タオルを自律でたたむ様子を発表しました。｜そして2026年の9月には、初めて入る30の家で試して、タオルたたみの成功率は62%だった、と発表しています。"),
 ("c3_figure", "base", "ただ、これは会社自身の試験の結果で、家で毎日任せ続けた記録とは、まだ別です。"),
 ("c3_neo", "base", "家庭向けの人型ロボット、1X社のNEOは、2026年の4月に工場での量産を始め、一般のお客さんへの出荷は2026年の予定、と発表しています。覚えていない作業は、会社の担当者が遠くから導く仕組みだと、会社自身が説明しています。"),
 ("c3_gap", "think", "アメリカの研究者、ケン・ゴールドバーグさんは、言葉のAIが学んだ文章は、人が読むと約10万年分になる。ロボットには、それに近い量の動きのデータすらない、と話しています。｜これはデータの規模のたとえで、同じ年数のお手本が要る、と分かったわけではありません。"),
 ("c3_gap", "base", "言葉のAIは、ネットにある文章で学べます。でも、物を扱う動きのお手本は、ネットにはほとんど落ちていません。", 1.2),
 # 証人: エイイチの机の上（エイイチが右下に出る）
 ("ei_desk", "base", "ここで、現場の証人を呼びます。エイイチの机の上です。"),
 ("ei_desk", "base", "エイイチは、小さなロボットアームに、ブロックをつかんで箱に置かせる練習を続けています。"),
 ("ei_desk", "think", "台帳に残っている、つかんでから置くまでの通しの試行は、6月から10月までで750回。失敗も含めた、試行錯誤の記録です。"),
 ("ei_desk", "base", "固くて形の変わらないブロック1つでも、これだけの回数を重ねています。"),
 ("ei_desk2", "base", "そしていまは、アームに覚えさせるお手本を集めるのに、アームを手で動かして要所の姿勢を教え、それを再生して撮る、というやり方を試しています。"),
 ("ei_desk2", "base", "いちばん苦労したことを、エイイチに聞くと……"),
 ("ei_desk2", "trouble", "カメラが上の1台だけなので、アームやグリッパーでブロックが隠れたりして、つかむ精度や確率を上げられなくて、苦労したよ。"),
 ("c3_end", "base", "洗濯物なら、形が変わるぶん、出会う場面はもっと多くなります。そのお手本を、どう集めるか。いま、各社が工夫しているところです。", 1.8),
 # 9 謎が解ける
 ("solve", "think", "さて、3つの手がかりがそろいました。冒頭の謎を解きます。"),
 ("solve_run", "base", "走れるようになった土台には、相手が形の変わらない地面で、仮想の世界でも練習しやすいことがある、と考えられます。そして、この1年で記録が縮んだのは、機体づくりと投資の積み重ね、と見る専門家もいます。"),
 ("solve_fold", "base", "たたむのがまだなのは、相手が形を変える布で、仮想の世界では練習しにくく、本物のお手本を集めるにも時間がかかることが、理由の1つだと考えられます。", 1.2),
 ("solve_moravec", "think", "実は、この難しさの逆転は、40年近く前から指摘されてきました。"),
 ("solve_moravec", "base", "ロボットの研究者、ハンス・モラベックさんは、1988年の本で、こんな趣旨のことを書いています。"),
 ("solve_moravec", "base", "コンピューターに、大人並みの知能テストを解かせるのは、比較的やさしい。でも、1歳の子ども並みに、見て動く力を持たせるのは、難しい。"),
 ("solve_twist", "surprise", "そしていま、ゴールドバーグさんも、仮想の世界の練習は、走ることや宙返りではかなりうまくいくが、器用な手作業ではうまくいかないようだ、と話しています。"),
 ("solve_twist", "base", "難しい側に残っているのが、手で物を扱うこと。洗濯物は、その代表です。"),
 ("solve_twist", "think", "アメリカの別の研究者は、人より速く走るほうが、洗濯物をたたむより難しく思えるのは、人の思い込みだ、とも話しています。", 1.8),
 # 10 見立て（エイイチが右下に出る）
 ("mitate", "base", "ここからは、エイイチの見立てです。", 1.2),
 ("mitate1", "think", "エイイチは、ロボットが人型である必要はない、という考えです。"),
 ("mitate1", "base", "実際、さっきの洗濯物の実験も、動かない台に、腕が2本の形でした。決まった台の上でたたむだけなら、足は要りません。"),
 ("mitate2", "base", "そしてエイイチは、はっきりこう見ています。"),
 ("mitate2", "base", "中国の人型ロボットの派手な動きは、出資を集める意図が強い。現場で仕事ができるかは、別の話だよ。"),
 ("mitate2", "think", "マラソンで確かめられたのは、その条件で走る力です。現場で仕事ができるかは、仕事ごとに確かめる必要があります。"),
 ("mitate3", "base", "では、家の洗濯物を任せられる日は、いつ来るのか。エイイチに聞きました。"),
 ("mitate3", "base", "どの家庭でも、ということになるには、5年くらいはかかりそうかなと感じています。"),
 ("mitate_end", "base", "走るのが速くなったニュースと、家で洗濯物を任せられる日は、別のものさしで見る必要があります。", 1.8),
 # 11 謎の答えと、持ち帰る3つ
 ("answer", "base", "では、今日の謎に答えます。"),
 ("answer", "base", "走るのが人間を追い越したのは、仮想の世界でも練習しやすい動きの上に、機体づくりと投資が積み重なったから、と考えられます。｜たたむのがまだなのは、布は形が決まらず、仮想の世界で練習しにくく、本物のお手本を集めるにも時間がかかることが、理由の1つだと考えられます。"),
 ("answer", "base", "ここでの、まだ、は、家で、人の手を借りずに、毎日任せられる段階には来ていない、という意味でした。", 1.2),
 ("check3", "smile", "最後に、人型ロボットのすごい動画を次に見たとき、確かめる3つを渡します。"),
 ("check3", "base", "1つ目、自分で動いているのか、人が遠くから操作しているのか。マラソンでも、操作したロボットのタイムは、1.2倍にして比べられていました。"),
 ("check3", "base", "2つ目、何回やって、何回できたのか。うまくいった1回だけの動画かもしれません。"),
 ("check3", "base", "3つ目、相手は形の変わる物か。形の変わる物なら、本物のお手本をどれだけ集めたかを見てください。", 1.2),
 ("hakobu_end", "smile", "ちなみにハコブくんは、病院の廊下は走りません。たたむのも、まだ練習中です。", 1.8),
 # 12 アウトロ
 ("outro", "smile", "この動画が役に立ったら、高評価とチャンネル登録をお願いします。"),
 ("outro", "base", "ロボットの開発や導入の相談は、概要欄の連絡先から、エイイチに直接どうぞ。"),
 ("outro", "wink", "コメントは、エイイチが全部読んでいます。それではまた。", 1.2),
]

# エイイチの声で読む文（槙原の声を流用・2026-10-28 エイイチの指示）。ハコブくんの口は動かさない
EI_LINES = [i for i, seg in enumerate(SEGS) if seg[2].startswith((
    "ロボットの性能は、すごく上がっているけど",
    "カメラが上の1台だけなので",
    "中国の人型ロボットの派手な動きは",
    "どの家庭でも、ということになるには",
))]

# 「エイイチ」を残す文（自己紹介・目次の最後・見立ての入り・アウトロの2文のほかに、名前が要る文）。文の頭で探す（video_rules.md 3-1）
NAME_OK = [i + 1 for i, seg in enumerate(SEGS) if seg[2].startswith((
    "大会や会社の発表、ニュース、論文や本、そしてエイイチ",
    "ここで、現場の証人を呼びます",
    "エイイチは、小さなロボットアームに",
    "エイイチは、ロボットが人型である必要はない",
    "このニュースを見たエイイチの感想は",
    "ここで、もう1人紹介させてください",
    "いちばん苦労したことを、エイイチに聞くと",
    "そしてエイイチは、はっきりこう見ています",
    "では、家の洗濯物を任せられる日は",
))]

# 読み上げ用の読み（仮音声 Open JTalk 用。字幕は元の表記のまま）
READ = [
 ("Pixels to Motors", "ピクセルズ トゥー モーターズ"),
 ("YouTube", "ユーチューブ"),
 ("SimPy", "シムパイ"),
 ("Python", "パイソン"),
 ("Unity", "ユニティ"),
 ("フィジカルAI", "フィジカルエーアイ"),
 ("AI", "エーアイ"),
 ("1人", "ひとり"), ("2人", "ふたり"), ("1つ", "ひとつ"), ("2つ", "ふたつ"), ("3つ", "みっつ"),
 ("2,100", "にせんひゃく"), ("3,000", "さんぜん"),
 ("栄一", "えいいち"),
 ("Physical Intelligence", "フィジカル インテリジェンス"), ("Figure", "フィギュア"), ("1X", "ワンエックス"), ("NEO", "ネオ"),
 ("4096台", "よんせんきゅうじゅうろくだい"), ("Tシャツ", "ティーシャツ"),
 ("「", ""), ("」", ""), ("『", ""), ("』", ""), ("｜", ""), ("…", ""),
]

# ElevenLabs の声で読み間違えた語だけ、読みを直す（tts_eleven.py が使う。字幕は変えない）
ELEVEN_READ = [
    ('エイイチ', '栄一'),   # video_rules.md 3-1（2026-10-12 決定）
    ('額だけ', 'がくだけ'),
    ('裏表', 'うらおもて'),
    ('R2R2R', 'リアルツーレンダーツーリアル'),
    ('SIer', 'エスアイヤー'),
    ('ロボットの側', 'ロボットのがわ'),
    ('4コママンガ', 'よんコマまんが'),
    ('OpenAI', 'オープンエーアイ'),
    ('Claude Code', 'クロード コード'),
    ('Claude', 'クロード'),
    ('描く', 'えがく'), ('描き', 'えがき'),
    ('物差し', 'ものさし'), ('力制御', 'ちからせいぎょ'), ('人型', 'ひとがた'),
    ('Mac', 'マック'),
    ('SimPy', 'シムパイ'),
    ('Python', 'パイソン'),
    ('Unity', 'ユニティ'),
    # この回で先回りして足す読み（--try で確かめる）
    ('Physical Intelligence', 'フィジカル インテリジェンス'),
    ('Figure', 'フィギュア'),
    ('1X', 'ワンエックス'),
    ('NEO', 'ネオ'),
    ('4096台', 'よんせんきゅうじゅうろくだい'),
    ('一枚上手', 'いちまいうわて'),
    ('二度と', 'にどと'),
]

# 間延び対策：ひと息が長い文だけ、読み上げ用に読点を足す（字幕は変えない）
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
```

### 冒頭は3回書き直した

声を作ったあとの確認で、冒頭に直しが3回入りました。

1. 「台本の最初をもっと人を惹きつけるような内容に変えてください。まだ固い内容にしすぎです」。事実と筋は5版のまま、冒頭から早とちりまでの言い回しとテンポだけを直しました（逆説の一行から入る・作り話のようですが本当の話・視聴者に聞く・犯人は足でも手でもない、の予告）
2. 1文目「家の洗濯物には、まだ勝てていない」は意味が分かりにくい。「人間の世界記録より速く走るロボットがいるのに、家の洗濯物を任せられるロボットは、まだ見当たらない」に
3. 「53秒あたりでエイイチの感想はとなるから、ここでおれが登場するような流れにしたらどうかな？出だしで出したいかな」。感想の前に「ここで、もう1人紹介させてください。この番組を作っている、エイイチです」を足し、ここでドット絵が真ん中に大きく出る場面（ei_intro）にしました

【画像】LOG395_02_ei_intro.jpg エイイチの登場の場面。紙色の画面の真ん中に、枠つきでドット絵が大きく出て、下に「エイイチ／この番組を作っている人」

文を足すと、声の mp3 の番号がずれます。足した文だけを ElevenLabs で作り、番号を付け直した写し（voice_eleven/ハコブ_足し後）を作って取り込みました。元のフォルダは残します。

### 本人の声：番組の別の声を流用して、4文だけ入れた

> おれの声を作って入れたい。今ある誰かの声を流用でいいよ！

本人の声の複製は使わない決まり（video_rules.md 3-1）なので、マンガのショートで看護師さんやエンジニアの声に使っている自作の声のうち、槙原の声（Voice ID Sryf5xKmMsQChU3HsLhZ）を当てました。入れたのは本人の言葉そのままの4文です。

1. ロボットの性能は、すごく上がっているけど、その能力は、仕事には関係なさそうだね。少なくとも、直接は。
2. カメラが上の1台だけなので、アームやグリッパーでブロックが隠れたりして、つかむ精度や確率を上げられなくて、苦労したよ。
3. 中国の人型ロボットの派手な動きは、出資を集める意図が強い。現場で仕事ができるかは、仕事ごとに確かめる必要があります。
4. どの家庭でも、ということになるには、5年くらいはかかりそうかなと感じています。

narration.py では、これらの文を `EI_LINES`（文の頭で探す）に入れ、声を作るときは `--voice` を替えて `--lines` で番号を指定します。書き出し（assemble.py）はこの番号の文の間、ハコブくんの口の計算から声を外します。

```python
# narration.py の末尾（EI_LINES）
EI_LINES = [i for i, seg in enumerate(SEGS) if seg[2].startswith((
    "ロボットの性能は、すごく上がっているけど",
    "カメラが上の1台だけなので",
    "中国の人型ロボットの派手な動きは",
    "どの家庭でも、ということになるには",
))]
```

Mac で動かした声づくりのコマンドは次のとおりです（API キーは Mac の中だけ）。

```
read -s ELEVENLABS_API_KEY && export ELEVENLABS_API_KEY
python3 ../_制作ベース/tts_eleven.py --voice gWJpc8whMBqnF7Y0kc9f --name ハコブ_11版 --lines 8 65 80 83
python3 ../_制作ベース/tts_eleven.py --voice Sryf5xKmMsQChU3HsLhZ --name エイイチ --lines 9 66 81 84
```

#### 声を作る tts_eleven.py（Mac で動かす・_制作ベース）

```python
"""ハコブくんの声（ElevenLabs）で、台本を1文ずつ音声にする。エイイチの Mac で動かす（API キーを Claude に渡さないため）。

準備（1回だけ）
  1. ElevenLabs の有料プランに入る（無料プランの音声は商用に使えない）
  2. Voice Design で声を作って保存し、その声の Voice ID を控える（Voices の一覧で声を開くと出る）
  3. ターミナルで API キーを入れる（キーは画面やファイルに残さない）:  export ELEVENLABS_API_KEY=（キー）

使い方（動画の作業フォルダで。例: 動画/AIエージェントの取り違え/）
  python3 ../_制作ベース/tts_eleven.py --voice VOICE_ID --name 候補A --lines 0-12
    --lines   作る文の番号（0 から。「0-12」「5,8,9」のように書く。省略するとすべて）
    --model   eleven_v4（既定。2026-10-12 に決定）／eleven_multilingual_v2／eleven_v3
    --seed    同じ値なら、なるべく同じ読み方になる（既定 7）
    --try     台本ではなく、試しの文を作る（「｜」で区切って何文でも。例: --try "エイイチは…。｜栄一は…。"）
              出力は voice_eleven/{名前}/試し_01.mp3 … と、どの文かの一覧 試し.txt
出力: voice_eleven/{名前}/{番号}.mp3 と、作った設定の記録 voice_eleven/{名前}/設定.json
このあと Claude が tts_import.py で 48kHz の wav にして、口の動きと字幕に使う。
使う文字数（クレジット）は、文の字数の合計。1本約4,100字。作り直した分も数える
"""
import argparse, json, os, sys, time, urllib.request, urllib.error
sys.path.insert(0, '.')
from narration import SEGS
try:
    from narration import parse
except ImportError:
    def parse(s):
        return s[0], "base", s[1], (s[2] if len(s) > 2 else 0.35)
try:
    from narration import ELEVEN_READ   # ElevenLabs が読み間違えた語だけ、ここで読みを直す（字幕は変えない）
except ImportError:
    ELEVEN_READ = []

ap = argparse.ArgumentParser()
ap.add_argument('--voice', required=True)
ap.add_argument('--name', required=True)
ap.add_argument('--lines', default='')
ap.add_argument('--model', default='eleven_v4')   # 2026-10-12 エイイチが v4 に決めた（冒頭14文で v2 と聞き比べ）
ap.add_argument('--seed', type=int, default=7)
ap.add_argument('--stability', type=float, default=0.55)
ap.add_argument('--similarity', type=float, default=0.75)
ap.add_argument('--try', dest='trial', default='')
args = ap.parse_args()
key = os.environ.get('ELEVENLABS_API_KEY')
if not key:
    sys.exit('ELEVENLABS_API_KEY が入っていません。ターミナルで export ELEVENLABS_API_KEY=（キー） を実行してから動かしてください')


def nums(spec, n):
    if not spec:
        return list(range(n))
    out = []
    for part in spec.split(','):
        if '-' in part:
            a, b = part.split('-'); out += list(range(int(a), int(b) + 1))
        else:
            out.append(int(part))
    return [i for i in out if 0 <= i < n]


def speak_text(t):
    t = t.replace('｜', '').replace('「', '').replace('」', '')
    for a, b in ELEVEN_READ:
        t = t.replace(a, b)
    return t


texts = [parse(s)[2] for s in SEGS]
outdir = os.path.join('voice_eleven', args.name)
if args.trial:   # 試しの文だけを作る（台本の読みの直し ELEVEN_READ は使わない。書いたとおりに読ませて聞き比べる）
    os.makedirs(outdir, exist_ok=True)
    lines = [t for t in args.trial.split('｜') if t]
    with open(os.path.join(outdir, '試し.txt'), 'w', encoding='utf-8') as f:
        for k, t in enumerate(lines, 1):
            f.write(f'試し_{k:02d}: {t}\n')
    for k, t in enumerate(lines, 1):
        body = {'text': t, 'model_id': args.model, 'seed': args.seed,
                'voice_settings': {'stability': args.stability, 'similarity_boost': args.similarity}}
        req = urllib.request.Request(
            f'https://api.elevenlabs.io/v1/text-to-speech/{args.voice}?output_format=mp3_44100_128',
            data=json.dumps(body).encode(), headers={'xi-api-key': key, 'Content-Type': 'application/json'})
        try:
            with urllib.request.urlopen(req, timeout=120) as r:
                open(os.path.join(outdir, f'試し_{k:02d}.mp3'), 'wb').write(r.read())
        except urllib.error.HTTPError as e:
            sys.exit(f'試し_{k:02d} で止まりました: {e.code} {e.read().decode(errors="ignore")[:300]}')
        print(f'試し_{k:02d} {t}')
    print(f'できあがり: {outdir}  使った文字数 約{sum(len(t) for t in lines)}字')
    sys.exit(0)
os.makedirs(outdir, exist_ok=True)
json.dump(dict(vars(args), time=time.strftime('%Y-%m-%d %H:%M')), open(os.path.join(outdir, '設定.json'), 'w'),
          ensure_ascii=False, indent=1)
used = 0
for i in nums(args.lines, len(SEGS)):
    if not texts[i]:
        continue
    prev = next((speak_text(texts[j]) for j in range(i - 1, -1, -1) if texts[j]), None)
    nxt = next((speak_text(texts[j]) for j in range(i + 1, len(texts)) if texts[j]), None)
    body = {'text': speak_text(texts[i]), 'model_id': args.model, 'seed': args.seed,
            'voice_settings': {'stability': args.stability, 'similarity_boost': args.similarity}}
    if args.model.startswith('eleven_multilingual'):   # 前後の文を渡すと、文のつながりの抑揚が自然になる（対応を確かめたモデルだけ）
        body['previous_text'] = prev
        body['next_text'] = nxt
    req = urllib.request.Request(
        f'https://api.elevenlabs.io/v1/text-to-speech/{args.voice}?output_format=mp3_44100_128',
        data=json.dumps(body).encode(), headers={'xi-api-key': key, 'Content-Type': 'application/json'})
    try:
        with urllib.request.urlopen(req, timeout=120) as r:
            open(os.path.join(outdir, f'{i:03d}.mp3'), 'wb').write(r.read())
    except urllib.error.HTTPError as e:
        sys.exit(f'{i:03d} で止まりました: {e.code} {e.read().decode(errors="ignore")[:300]}')
    except urllib.error.URLError as e:
        sys.exit(f'{i:03d} で止まりました（ElevenLabs につながらない）: {e.reason}')
    used += len(body['text'])
    print(f'{i:03d} {body["text"][:30]}')
print(f'できあがり: {outdir}  使った文字数 約{used}字')
```

### 読みが直らない文は、種を変えるか言い換える

確認用で「1:30 の人型（ひとがた）をちゃんと言えてない」と指摘が出ました。読みの辞書（ELEVEN_READ）には前から `('人型', 'ひとがた')` が入っていて、ほかの文では通っていたのに、この文（S011）だけ抑揚が崩れていました。同じ文を作り直しても、ほぼ同じ声が返ってきました。

> 1:30の人型のひとがたの遠征変わってなくない？

原因は tts_eleven.py が毎回同じ種（`--seed 7`）を使っていることです。同じ文・同じ設定なら同じ読みになるので、「作り直し」は直しになりません。種を 21 と 42 に変えて2通り作っても「だめ」だったので、この文だけ「人の形をしたロボット」に言い換え、字幕も同じ言葉にしました。

- ねらい：読みが崩れた文を、同じ文の作り直しではなく、確実に変わる手で直す
- 変わったこと：直す順を「種を変える → 言い換える」にし、video_rules.md の 1-4 に書いた
- 見込める効果：「作り直したのに変わらない」で往復する回数が減る

### 画面：札は左上、エイイチは右下に大きく

画面はパターン2（大文字型）＋動きあり。出どころの札は最初、右上のロゴの下に置いていましたが、ロゴと競るので左上に移しました（「右上のロゴの下の情報は左に引っ越して」）。札を左に移したので、台本の「画面の右上に札で出します」も「左上」に直し、その1文だけ声を作り直しました。

【画像】LOG395_04_fuda.jpg 札の約束の場面。「出どころの札（画面の左上に出します）」の下に、黒・青・灰の枠・オレンジの4つの札が縦に並ぶ

エイイチの小窓は、枠線と名前の吹き出しを外し（「右端に表示する時にはカードの枠線とエイイチをテキスト吹き出しはいらないよ」）、大きさは300pxから420pxにしました。

> おれの画像も少し大きくていいね。実際にはハコブくんより背が高いし

【画像】LOG395_06_ei_desk2.jpg 現場の証人の場面。自分の机の上のアームの映像の上に黒い板で「上カメラ1台／アームや指でブロックが隠れる」。右下にドット絵のエイイチ

### 口と目を声で動かす ei_talk.py

> 話している時はおれの口や目が動くようにしてください。

ハコブくんと同じように、声の大きさで口を動かします。やり方は、100ドットの絵の口の所だけを描いた透明な絵を3枚作り（閉じる・いつもの笑顔・大きく開く）、声の大きさを0.1秒ごとに測って段を選び、motion_kit の `data-a="fade"` で重ねていく、です。1段ずつしか変えないので、閉じた口から大きく開いた口へ一気には飛びません。目は、話している間は1.6〜2.6秒おき、話していない間は3.3秒おきにまばたきします。

【画像】LOG395_10_mouth3.png 口の3段。左から閉じる・いつもの笑顔・大きく開く。元の絵の口の線と歯だけを肌の色で消し、その上に口を描く

最初の版は、閉じた口を作るときに口のまわりを一色の肌色で塗ったので、顔に四角い跡が出ました。元の口の線（黒）と歯（白）だけを肌の色に置き換える形に直すと、まわりの影が残って自然になりました。歯の所が透明なままだと、背景に映像がある場面で透けるので、顔の中の小さな穴は白で埋めています。

#### ei_talk.py（口と目を動かす部品）

```python
# エイイチ（ドット絵）が話している間、口と目を動かす部品（2026-10-28 エイイチの指示「話している時はおれの口や目が動くように」）
# 口は3段（閉じる・いつもの笑顔・大きく開く）を、声の大きさで 0.1 秒ごとに選ぶ（1段ずつしか変えない）。
# 目は、話し始めと、話している間ときどきまばたきする。
# どれも 100 ドットの絵の「その部分だけ」を描いた透明な PNG を、時間で重ねていく（motion_kit の data-a="fade"）。
import os, io, base64, wave
import numpy as np
from PIL import Image

HERE = os.path.dirname(os.path.abspath(__file__))
INK = (1, 1, 1, 255)
TEETH = (250, 250, 246, 255)
INSIDE = (70, 22, 18, 255)
TONGUE = (177, 67, 33, 255)

# 口の両端（左x, 右x, 上y）。100 ドットの絵の座標
MOUTH = {'udegumi': (39, 52, 41), 'yubisasu': (39, 52, 41), 'unazuku': (36, 47, 43), 'hirameku': (38, 49, 42)}


def _load(pose, b=False):
    return np.array(Image.open(os.path.join(HERE, f"src/ei/{pose}{'_b' if b else ''}.png")).convert('RGBA'))


def fill_teeth(a):
    """顔の中の透明な穴（歯の所）を白で埋める。背景に映像があると透けて見えるため"""
    from scipy import ndimage
    t = a[..., 3] < 128
    lab, n = ndimage.label(t)
    edge = set(np.unique(np.concatenate([lab[0], lab[-1], lab[:, 0], lab[:, -1]])))
    for k in range(1, n + 1):
        if k in edge:
            continue
        m = lab == k
        if m.sum() < 80:
            a[m] = TEETH
    return a


def _uri(a):
    b = io.BytesIO(); Image.fromarray(a.astype(np.uint8)).save(b, 'PNG')
    return 'data:image/png;base64,' + base64.b64encode(b.getvalue()).decode()


def _skin(a, xl, xr, yt):
    """顔のいちばん多い肌の色（口のまわりの、明るい色）"""
    from collections import Counter
    reg = a[yt - 6:yt + 6, xl - 3:xr + 4].reshape(-1, 4)
    c = Counter(tuple(int(v) for v in px) for px in reg if px[3] > 200 and px[0] > 220 and 120 < px[1] < 200)
    return c.most_common(1)[0][0]


def mouth_patches(pose):
    """口だけを描いた透明な絵 3枚（0 閉じる・1 いつもの・2 開く）"""
    a = fill_teeth(_load(pose))
    xl, xr, yt = MOUTH[pose]
    sk = _skin(a, xl, xr, yt)
    y0, y1 = yt, yt + 5
    out = []
    for lv in range(3):
        p = np.zeros_like(a)
        if lv == 1:
            p[y0:y1 + 1, xl:xr + 1] = a[y0:y1 + 1, xl:xr + 1]
        else:
            # 元の口の線と歯だけを肌の色で消す（まわりの影は残す）
            reg = a[y0:y1 + 1, xl:xr + 1].copy()
            rg = reg[..., :3].astype(int)
            ink = (rg.max(2) < 90) | (abs(rg[..., 0] - rg[..., 1]) < 40)   # 黒い線・白や灰の歯
            reg[ink] = sk
            p[y0:y1 + 1, xl:xr + 1] = reg
            p[yt, xl] = p[yt, xr] = INK
            p[yt + 1, xl + 1:xr] = INK
            if lv == 2:
                p[yt + 2, xl + 1] = p[yt + 2, xr - 1] = INK
                p[yt + 2, xl + 2:xr - 1] = TEETH
                p[yt + 3, xl + 2] = p[yt + 3, xr - 2] = INK
                p[yt + 3, xl + 3:xr - 2] = INSIDE
                p[yt + 4, xl + 3] = p[yt + 4, xr - 3] = INK
                p[yt + 4, xl + 4:xr - 3] = TONGUE
                p[yt + 5, xl + 4:xr - 3] = INK
        out.append(_uri(p))
    return out


def eye_patches(pose):
    """目の所だけの絵（開いた目・閉じた目）"""
    o, c = _load(pose), _load(pose, True)
    d = np.argwhere((o != c).any(2))
    if not len(d):
        return None
    y0, y1, x0, x1 = d[:, 0].min() - 1, d[:, 0].max() + 1, d[:, 1].min() - 1, d[:, 1].max() + 1
    po, pc = np.zeros_like(o), np.zeros_like(o)
    po[y0:y1 + 1, x0:x1 + 1] = o[y0:y1 + 1, x0:x1 + 1]
    pc[y0:y1 + 1, x0:x1 + 1] = c[y0:y1 + 1, x0:x1 + 1]
    return _uri(po), _uri(pc)


def base_uri(pose, b=False):
    return _uri(fill_teeth(_load(pose, b)))


def envelope(i, step=0.1):
    """tts/{i:03d}.wav の声の大きさ（step 秒ごと・0〜1）"""
    w = wave.open(os.path.join(HERE, f'tts/{i:03d}.wav'))
    sr, n, ch, sw = w.getframerate(), w.getnframes(), w.getnchannels(), w.getsampwidth()
    x = np.frombuffer(w.readframes(n), dtype=np.int16 if sw == 2 else np.int32).astype(np.float32)
    if ch > 1:
        x = x.reshape(-1, ch).mean(1)
    x /= np.abs(x).max() + 1e-9
    h = int(sr * step)
    r = np.array([np.sqrt(np.mean(x[k:k + h] ** 2)) for k in range(0, len(x) - h, h)])
    return r / (np.percentile(r, 95) + 1e-9)


def talk_layers(pose, i, t0, step=0.1):
    """場面の頭から t0 秒にエイイチの文 i が始まるときの、口と目の重ね（img の並び）"""
    m = mouth_patches(pose)
    env = envelope(i, step)
    seq, lv = [], 1
    for k, v in enumerate(env):
        want = 0 if v < 0.18 else (1 if v < 0.55 else 2)
        if want != lv:
            lv += 1 if want > lv else -1
            seq.append((round(t0 + k * step, 2), lv))
    end = round(t0 + len(env) * step, 2)
    seq.append((end, 1))   # 話し終わったら、いつもの笑顔に戻す
    h = ''
    for t, l in seq:
        h += f'<img src="{m[l]}" data-a="fade" data-t="{t}" data-d="0.01">'
    e = eye_patches(pose)
    if e:
        o, c = e
        bt, last = t0 + 0.05, end
        while bt < last - 0.3:
            h += f'<img src="{c}" data-a="fade" data-t="{round(bt, 2)}" data-d="0.01"><img src="{o}" data-a="fade" data-t="{round(bt + 0.13, 2)}" data-d="0.01">'
            bt += 1.6 + (int(bt * 7) % 5) * 0.25
    return h, (t0, end)


from functools import lru_cache
mouth_patches = lru_cache(None)(mouth_patches)
eye_patches = lru_cache(None)(eye_patches)
base_uri = lru_cache(None)(base_uri)


def mouth_seq(i, t0, step=0.1):
    """口の段の切り替え [(秒, 段)] と、話し終わりの秒"""
    env = envelope(i, step)
    seq, lv = [], 1
    for k, v in enumerate(env):
        want = 0 if v < 0.18 else (1 if v < 0.55 else 2)
        if want != lv:
            lv += 1 if want > lv else -1
            seq.append((round(t0 + k * step, 2), lv))
    end = round(t0 + len(env) * step, 2)
    seq.append((end, 1))
    return seq, end


def blink_times(t0, end):
    out, bt = [], t0 + 0.05
    while bt < end - 0.3:
        out.append(round(bt, 2)); bt += 1.6 + (int(bt * 7) % 5) * 0.25
    return out
```

### 指さしは大事な所だけ

> ずっと指さしてるのはおかしいので、指差すときは大事な時だけにしてください。

> 変な顔の時があるので修正（口が曲がってる）

見立ての場面では、最初はポーズを場面ごとに固定していました（指さす・うなずく・ひらめく）。指さしを「出資を集める意図が強い」と言い切る所の約3秒と、「別のものさしで」の頭の約3秒に限り、ふだんは腕組みにしました。口が曲がって見えたのは、うなずく絵の元の口が左右でずれていて、その上に話す口を重ねたためです。うなずく絵は話す場面には使わないことにしました。

絵を途中で替えるとき、最初は新しい絵を上に重ねるだけにしていたので、新しい絵の透明な所（腕組みの絵の、指さしの手があった所）から前の絵の手が見えていました。絵ごとにまとまり（div）を作り、替える時刻に前のまとまりを消して（`data-a="out"`）次を出す形にしました。motion_kit.py に `out`（消える）を足しています。

```javascript
// motion_kit.py の JS に足した1行
else if (a === 'out') { o = 1 - E(p); }   // 消える（2026-10-28 エイイチのドット絵の絵の入れ替えで足した）
```

【画像】LOG395_07_mitate2.jpg 見立ての場面。「派手な動きは／出資集め」の文字と、右下で指をさすエイイチ。字幕は「中国の人型ロボットの派手な動きは、出資を集める意図が強い。」

#### scenes.py（場面の図・札・エイイチの小窓）

```python
# -*- coding: utf-8 -*-
# 動画「人型ロボットは人間より速く走ったのに、なぜ洗濯物はたためないのか（仮題）」の場面（謎解きの型の1本目）
PATTERN = 2   # 画面パターン2（大文字型・video_rules.md 4-4c）。2026-10-28 エイイチが決定（大文字型＋動きあり）
MOVE = True   # 画面型の動き（4-4d）を使う
# 画面の文字は「名前・数字・一言」だけ。中身は声と字幕に任せる
# 他社のロボット・大会の映像や写真・ロゴは使わない（許可がないため）。図はコードで描いた模式図だけ
# 謎解きの型（2026-10-28）:
#   - 出どころの札（左上）: 大会や会社の発表（黒）／ニュース（青）／論文や本（灰の枠）／エイイチの記録と見立て（オレンジ）
#   - エイイチ（ドット絵・声なし）: ei_intro で真ん中に大きく登場 → ei_react・ei_desk*・mitate* で右下の小窓。ほかの場面には出さない
#     ドット絵は 100 ドットの絵を等倍の整数倍で広げる（ぼかさない）。まばたきは閉じた目の絵を 0.15 秒だけ重ねる
# 強弱（4-4d）: 強＝叩きつけ・入れ替え（hook・hook_time・hook_answer・question・teaser・map2・c2_joke・solve・solve_fold・answer）
#   中＝数え上げ（c1_sim・c3_figure）・エイイチの小窓（ぽん・まばたき）・机の上の映像
import os as _os, sys as _sys, json as _json, base64 as _b64
_here = _os.path.dirname(_os.path.abspath(__file__))
for _c in (_os.environ.get("P2M_BASE", ""), _os.path.join(_here, "..", "base"), _os.path.join(_here, "..", "_制作ベース")):
    if _c and _os.path.exists(_os.path.join(_c, "scene_kit.py")):
        _sys.path.insert(0, _c); break
from scene_kit import *
from scene_kit import _p2page
from motion_kit import use_motion

T1 = "<b>1</b>練習する場所"
T2 = "<b>2</b>相手の形"
T3 = "<b>3</b>お手本の数"
T4 = "<b>4</b>エイイチの見立て"

# --- 場面ごとの、文の始まりの秒（声の長さから）---
_idx = _json.load(open(_os.path.join(_here, 'tts/index.json'))) if _os.path.exists(_os.path.join(_here, 'tts/index.json')) else []
_LINES = {}
for _o in _idx:
    _d = _LINES.setdefault(_o['scene'], [])
    _t0 = (_d[-1][0] + _d[-1][1] + _d[-1][2]) if _d else 0.0
    _d.append((_t0, _o['dur'], _o['pause']))


def at(scene, k=0, f=0.0):
    """その場面の k 番目の文の、読み上げの f 割の所（秒）"""
    L = _LINES.get(scene)
    if not L:
        return 0.3
    k = min(k, len(L) - 1)
    return round(L[k][0] + L[k][1] * f, 2)


def scene_len(scene):
    L = _LINES.get(scene)
    return (L[-1][0] + L[-1][1] + L[-1][2]) if L else 4.0


# --- 出どころの札（左上）---
FUDA_CSS = """
.fuda{position:absolute;left:140px;top:96px;display:flex;align-items:center;gap:14px;font-size:30px;font-weight:700;color:#0D0D0D}
.fuda .k{padding:6px 18px;border-radius:999px;font-size:28px;font-weight:900}
.fuda .k.hap{background:#0D0D0D;color:#fff}
.fuda .k.news{background:#1A6C98;color:#fff}
.fuda .k.ken{border:3px solid #888888;color:#555}
.fuda .k.ei{background:#C4471F;color:#fff}
"""
FUDA_NAME = {"hap": "大会や会社の発表", "news": "ニュース", "ken": "論文や本", "ei": "エイイチの記録と見立て"}


def fuda(kind, who):
    return f'<style>{FUDA_CSS}</style><div class="fuda"><span class="k {kind}">{FUDA_NAME[kind]}</span><span>{who}</span></div>'


# --- エイイチ（ドット絵）---
def _uri(p):
    return 'data:image/png;base64,' + _b64.b64encode(open(_os.path.join(_here, p), 'rb').read()).decode()


import ei_talk as _talk
EI = {k: (_talk.base_uri(k), _talk.base_uri(k, True)) for k in ('udegumi', 'unazuku', 'yubisasu', 'hirameku')}
# エイイチが話す文（narration.py の EI_LINES）→ (場面, 場面の中で何番目の文か, 文番号)
import importlib.util as _ilu
_sp = _ilu.spec_from_file_location('_narr_here', _os.path.join(_here, 'narration.py'))
_nm = _ilu.module_from_spec(_sp); _sp.loader.exec_module(_nm)
_EIL = getattr(_nm, 'EI_LINES', [])
_EI_SPEAK = {}
_cnt = {}
for _o in _idx:
    _k = _cnt.get(_o['scene'], 0); _cnt[_o['scene']] = _k + 1
    if _o['i'] in _EIL:
        _EI_SPEAK.setdefault(_o['scene'], []).append((_k, _o['i']))

EI_CSS = """
.eiw{position:absolute;right:10px;bottom:0px;width:420px;height:420px;overflow:hidden}
.eiw img{position:absolute;left:0;top:8px;width:420px;height:420px;image-rendering:pixelated}
.ein{position:absolute;right:40px;bottom:346px;width:300px;text-align:center;font-size:30px;font-weight:900;color:#0D0D0D}
.ein span{display:inline-block;background:#F5F5F0;border:3px solid #D6D6D1;border-radius:999px;padding:4px 20px}
"""


def _blinks(start, end):
    t, out = start, []
    while t < end - 0.4:
        out.append(round(t, 2)); t += 3.3
    return out


def ei_wipe(pose, scene, pop=None, name=None, poses=None):
    """右下の小窓。pop=秒 で、ぽんと出る。poses=[(秒, 絵)] で途中で絵を替える（指さしは大事な所だけ。2026-10-28 エイイチの指示）。
    話している間は口と目を声に合わせて動かし、話していない間はまばたきだけする。
    絵ごとにまとまり（div）を作り、替える時刻に前のまとまりを消して（out）、次を出す（fade）。絵の透明な所から前の絵が見えないように"""
    seq_p = sorted(poses or [(0, pose)])
    if seq_p[0][0] > 0:
        seq_p = [(0, pose)] + seq_p
    L = scene_len(scene) + 1
    segs = [(t, seq_p[k + 1][0] if k + 1 < len(seq_p) else L, p) for k, (t, p) in enumerate(seq_p)]
    spans, mouth, blinks = [], [], []
    for k, i in _EI_SPEAK.get(scene, []):
        t0 = at(scene, k, 0.0)
        sq, end = _talk.mouth_seq(i, t0)
        spans.append((t0, end)); mouth += sq
        blinks += [(b, 0.13) for b in _talk.blink_times(t0, end)]
    mouth.sort()
    blinks += [(b, 0.15) for b in _blinks((pop or 0) + 1.3, scene_len(scene)) if not any(a0 - 0.2 <= b <= a1 + 0.2 for a0, a1 in spans)]
    out = ''
    for s0, s1, p in segs:
        ev = []
        lv = ([l for (t, l) in mouth if t <= s0] or [1])[-1]
        if lv != 1 and p in _talk.MOUTH:
            ev.append((s0, f'<img src="{_talk.mouth_patches(p)[lv]}">'))
        for t, l in mouth:
            if s0 < t < s1 and p in _talk.MOUTH:
                ev.append((t, f'<img src="{_talk.mouth_patches(p)[l]}" data-a="fade" data-t="{t}" data-d="0.01">'))
        e = _talk.eye_patches(p) if p != 'unazuku' else None
        for b, d in blinks:
            if e and s0 <= b and b + d < s1:
                ev.append((b, f'<img src="{e[1]}" data-a="fade" data-t="{b}" data-d="0.01">'))
                ev.append((round(b + d, 2), f'<img src="{e[0]}" data-a="fade" data-t="{round(b + d, 2)}" data-d="0.01">'))
        ev.sort(key=lambda x: x[0])
        inner = f'<img src="{EI[p][0]}">' + ''.join(h for _, h in ev)
        if s0 > 0:
            inner = f'<div style="position:absolute;inset:0" data-a="fade" data-t="{s0}" data-d="0.01">{inner}</div>'
        if s1 < L:
            inner = f'<div style="position:absolute;inset:0" data-a="out" data-t="{s1}" data-d="0.01">{inner}</div>'
        out += inner
    a = f' data-a="pop" data-t="{pop}" data-d="0.35"' if pop is not None else ''
    nm = f'<div class="ein"{a}><span>{name}</span></div>' if name else ''
    return f'<style>{EI_CSS}</style>{nm}<div class="eiw"{a}>{out}</div>'


def add(page_html, *parts):
    return page_html.replace('</body>', ''.join(parts) + '</body>', 1)


S = {}
MOTION = {}

# 0 謎
S["hook"] = p2_word(['世界記録より速い', '<span class="red">洗濯物はまだ</span>'], kicker="2026年の、ちょっと不思議な話", kc="muted", size=150)
S["hook_race"] = add(p2_num("300", "台以上", kicker="2026年4月 北京｜人型ロボットのハーフマラソン", sub="21.0975km"), fuda("hap", "大会の発表（新華社など）"))
S["hook_time"] = add(p2_num("50:26", "", kicker="優勝したロボットのタイム", sub="自律で走る区分"), fuda("hap", "大会の結果（2026年4月）"))
S["hook_wr"] = add(p2_pair("50:26", "56:51", da="ロボット（優勝）", db="人間の男子<br>（世界記録候補・公認手続き中）", ca="red", cb="", mid="／", size=170), fuda("hap", "World Athletics（2026年8月）"))
S["hook_last"] = add(p2_pair("2:40:42", "50:26", da="2025年の優勝", db="2026年の優勝", ca="", cb="red", mid="→", size=150, sub="機体はちがう｜平均の速さは3倍あまり"), fuda("hap", "大会の結果（2025・2026）"))
S["hook_joke"] = p2_word(['走るのは', '<span class="blue">あきらめた</span>'], kicker="ハコブくん", kc="muted", size=170)
# エイイチ、登場（真ん中に大きく）
EI_BIG = """<style>.eib{position:absolute;left:50%;top:120px;width:520px;height:520px;margin-left:-260px;border-radius:40px;overflow:hidden;background:#F5F5F0;border:6px solid #D6D6D1}
.eib img{position:absolute;left:0;top:10px;width:520px;height:520px;image-rendering:pixelated}
.eibn{position:absolute;left:420px;right:420px;top:660px;text-align:center;font-size:72px;font-weight:900}
.eibn small{display:block;font-size:40px;font-weight:700;color:#888;margin-top:6px}</style>"""
_o, _c = EI['udegumi']
_bl = ''.join(f'<img src="{_c}" data-a="fade" data-t="{b}" data-d="0.01"><img src="{_o}" data-a="fade" data-t="{b + 0.15}" data-d="0.01">' for b in _blinks(1.6, scene_len('ei_intro')))
S["ei_intro"] = page(EI_BIG + f'<div class="eib" data-a="pop" data-t="0.15" data-d="0.4"><img src="{_o}">{_bl}</div><div class="eibn" data-a="up" data-t="0.6">エイイチ<small>この番組を作っている人</small></div>')
MOTION["ei_intro"] = dict(type='html', html=S["ei_intro"])
S["ei_react"] = add(p2_word(['性能は、すごい', '<span class="red">仕事とは別？</span>'], kicker="このニュースを見たエイイチの感想", kc="muted", size=140, sub="少なくとも直接は、仕事に関係なさそう"),
                    fuda("ei", "エイイチの感想"), ei_wipe('udegumi', 'ei_react', pop=0.1))
MOTION["ei_react"] = dict(type='html', html=S["ei_react"])
S["hook_turn"] = p2_quiz(['あなたの洗濯物', '任せられる？'], pill="聞かせてください", size=150)
S["hook_answer"] = p2_word(['まだ'], kicker="今日までに確かめた公開資料では", kc="muted", size=300, sub="人の手を借りずに、家で毎日たたみ続ける<br>人型ロボットは、見当たらない")
S["hook_q2"] = p2_word(['人より速いのに', '<span class="red">任せられない</span>'], kicker="この逆転、ちょっと不思議", kc="muted", size=150)
# 1 自己紹介（自分のアームの映像）
O = {
 "title": overlay('<div class="lt"><img class="a" src="' + LOGO + '"><div class="b">フィジカルAI解説</div><div class="c">案内役：ハコブくん（AI音声）</div></div>'),
 "title_eiichi": overlay('<div class="lt"><img class="a" src="' + LOGO + '"><div class="b">エイイチ</div><div class="c">デザイナー／ロボティクスの研究・開発</div></div>'),
 "outro": overlay('<div class="lt"><img class="a" src="' + LOGO + '"><div class="b">相談は概要欄の連絡先から</div><div class="c">高評価・チャンネル登録／コメントはエイイチが全部読んでいます</div></div>'),
}
VIDEO = {
 "title": ("src/day124_crop.mp4", 4.5, False),
 "title_eiichi": ("src/day124_crop.mp4", None, False),
 "outro": ("src/day124_crop.mp4", 18.0, False),
}
# 2 今日の謎
S["question"] = p2_quiz(['走るは追い越した', 'たたむは、なぜまだ？'], pill="今日の謎", size=130)
S["define"] = p2_word(['家で・人の手なしで', '<span class="blue">毎日</span>'], kicker="ここで言う、まだ", kc="muted", size=130, sub="任せられるところまでは来ていない")
S["teaser"] = p2_word(['犯人は', '<span class="red">足でも手でもない</span>'], kicker="先に言っておくと", kc="muted", size=140)
# 3 聞くときの約束（4種類の札を大きく見せる）
_cards = ''.join(f'<div style="margin:22px 0"><span class="k {k}" style="display:inline-block;line-height:1.25;font-size:64px;padding:12px 44px">{FUDA_NAME[k]}</span></div>' for k in ("hap", "news", "ken", "ei"))
S["promise_cards"] = _p2page(f'<style>{FUDA_CSS}</style><div class="p2wrap"><div class="p2k muted">出どころの札（画面の左上に出します）</div><div class="fuda" style="position:static;display:block;text-align:center">{_cards}</div></div>')
S["promise_fair"] = add(p2_list([("1", "電池の交換"), ("2", "機体の交換"), ("3", "伴走の車"), ("4", "一部の補助")], kicker="ロボットの条件（人の記録とはちがう）", size=96),
                        fuda("news", "大会の規則（中国新聞網など）"))
# 4 地図（たとえは1つだけ）
S["map"] = p2_pair("体育", "家庭科", da="走る", db="洗濯物をたたむ", ca="blue", cb="red", mid="／", kicker="たとえ｜ロボットの学校", size=170)
S["map2"] = p2_pair("5", "1", da="体育", db="家庭科", ca="blue", cb="red", mid="／", kicker="成績表にすると（たとえ）", size=220)
S["toc"] = p2_list([("1", "練習する場所"), ("2", "相手の形"), ("3", "お手本の数"), ("4", "エイイチの見立て")], kicker="3つの手がかり", size=100)
# 5 ハコブくんの早とちり
S["hayatochiri"] = p2_word(['手のほうが', '部品が細かい？'], kicker="ハコブくんの推理", kc="blue", size=150)
S["hayatochiri2"] = p2_word(['問題は', '<span class="red">覚えさせ方</span>'], kicker="細かく動く手は、もう作られ始めている", kc="muted", size=160)
# 6 手がかり1 練習する場所
S["c1"] = chapter2("1つ目", "練習する場所", "体育の練習は、コンピューターの中でもできる")
SRC_RUDIN = "出典：Rudin ら（ETH Zurich・NVIDIA）CoRL 2021"
S["c1_sim"] = add(p2_num("4096", "台", kicker="仮想の世界で、同時に歩く練習", sub="4本足｜平地4分足らず・でこぼこ20分足らず｜計算機1台", tag=T1, src=SRC_RUDIN), fuda("ken", "論文（2021年）"))
S["c1_joke"] = p2_word(['転んだら', '<span class="blue">やり直し</span>'], kicker="4096台の体育館", kc="muted", size=170, tag=T1)
S["c1_note"] = add(p2_pair("2本足も", "優勝機は？", da="2021年に仮想の練習で走った", db="学ばせ方は見当たらない", ca="blue", cb="red", mid="／", size=140, tag=T1),
                   fuda("hap", "オレゴン州立大学／大会の報道"))
S["c1_why"] = p2_word(['相手は', '<span class="blue">地面</span>'], kicker="計算で再現しやすい", kc="muted", size=180, sub="坂・段差・すべりやすさのちがいはある", tag=T1)
S["c1_speed"] = add(p2_pair("練習のしかた", "機体づくり", da="走りを覚えさせる", db="モーター・冷やし方・投資", ca="blue", cb="red", mid="と", kicker="この1年で記録が縮んだのは", size=120, sub="分けて考える", tag=T1),
                    fuda("news", "Scientific American（専門家の見方）"))
# 7 手がかり2 相手の形
S["c2"] = chapter2("2つ目", "相手の形", "洗濯物は、さわるたびに形が変わる")
S["c2_cloth"] = add(p2_word(['同じ服でも', '<span class="red">毎回ちがう形</span>'], kicker="袖が垂れ・すそがねじれ・布が重なる", kc="muted", size=150,
                            sub="仮想の世界で正しく動かすのが難しい", tag=T2, src="出典：RGBench（2025）"), fuda("ken", "論文（2025年）"))
S["c2_joke"] = p2_word(['問題の形まで', '<span class="red">変えてくる</span>'], kicker="洗濯物の先生", kc="muted", size=150, sub="正解のたたみ方も、家ごとにちがう", tag=T2)
S["c2_end"] = p2_pair("仮想の練習", "本物のお手本", da="", db="", ca="blue", cb="red", mid="＋", kicker="どう組み合わせるか", size=105, tag=T2)
# 8 手がかり3 お手本の数
S["c3"] = chapter2("3つ目", "お手本の数", "今日いちばん大事なところ")
S["c3_pi"] = add(p2_num("1万", "時間超", kicker="Physical Intelligence（π0 の論文）", sub="いろいろな作業を合わせた動きのデータ｜動かない台に腕2本", tag=T3, src="出典：π0（arXiv 2410.24164）"),
                 fuda("ken", "論文（2024年）"))
S["c3_figure"] = add(p2_num("62", "%", kicker="Figure の発表（2026年9月）｜初めて入る30の家", sub="タオルたたみ｜会社自身の試験・毎日任せた記録とは別", tag=T3), fuda("hap", "Figure の発表"))
S["c3_neo"] = add(p2_word(['量産は', '<span class="blue">始まった</span>'], kicker="1X社 NEO（2026年4月の発表）", kc="muted", size=160, sub="一般の出荷は2026年予定｜覚えていない作業は遠隔で導く", tag=T3), fuda("hap", "1X の発表"))
S["c3_gap"] = add(p2_num("10万", "年分", kicker="言葉のAIが学んだ文章を、人が読む時間に直すと", sub="ゴールドバーグさん｜データの規模のたとえ", tag=T3), fuda("news", "UCバークレーのインタビュー"))
S["c3_end"] = p2_word(['数だけでは', '<span class="red">足りない</span>'], kicker="撮り方・見え方の工夫も要る", kc="muted", size=160, tag=T3)
# 証人: エイイチの机の上（自分のアームの映像の上に黒い板。エイイチは右下）
CARD_CSS = """.card{position:absolute;left:420px;top:170px;width:1080px;padding:44px 64px;border-radius:30px;background:rgba(8,8,8,.86);color:#fff;text-align:center}
.card .ck{font-size:42px;font-weight:700;color:#bbb;margin-bottom:12px}.card .cb{font-size:170px;font-weight:900;line-height:1.05}
.card .cb small{font-size:80px;color:#C4471F;margin-left:10px}.card .cs{font-size:44px;font-weight:700;color:#bbb;margin-top:16px}
.cap{position:absolute;left:96px;top:80px;background:rgba(13,13,13,.78);color:#fff;font-size:30px;font-weight:700;padding:12px 24px;border-radius:10px}"""


def desk(scene, cards, pose, pop=None):
    body = f'<style>{CARD_CSS}</style>'
    for i, (t, k, b, s) in enumerate(cards):
        # 2枚目からは板を不透明にして、前の板の文字が透けないようにする（2026-10-28 確認用で透けていた）
        st = ' style="background:#080808"' if i else ''
        body += f'<div class="card"{st} data-a="pop" data-t="{t}" data-d="0.35"><div class="ck">{k}</div><div class="cb">{b}</div><div class="cs">{s}</div></div>'
    body += fuda("ei", "エイイチの記録（机の上の mechArm 270-Pi）").replace('class="fuda"', 'class="fuda" style="color:#fff"') + ei_wipe(pose, scene, pop=pop)
    return overlay(body)


DESK_BG = dict(file='src/day124_crop.mp4', ss=6.0, dim=0.55, blur=0, cy=0.5)
S["ei_desk"] = add(p2_word(['現場の', '<span class="red">証人</span>'], kicker="エイイチの机の上", kc="muted", size=160, tag=T3), fuda("ei", "エイイチの記録"), ei_wipe('udegumi', 'ei_desk'))
MOTION["ei_desk"] = dict(type='html', bg=DESK_BG, html=desk('ei_desk', [
    (0.2, "ここで、現場の証人", "机の上", "ブロックをつかんで箱に置く練習"),
    (at('ei_desk', 2, 0.0), "6月〜10月｜通しの試行", "750<small>回</small>", "失敗も含めた、試行錯誤の記録"),
], 'udegumi', pop=0.2))
S["ei_desk2"] = add(p2_word(['上カメラ', '<span class="red">1台</span>'], kicker="エイイチの苦労", kc="muted", size=160, tag=T3), fuda("ei", "エイイチの記録"), ei_wipe('udegumi', 'ei_desk2'))
MOTION["ei_desk2"] = dict(type='html', bg=dict(DESK_BG, ss=14.0), html=desk('ei_desk2', [
    (0.2, "いま試しているお手本の集め方", '<span style="font-size:130px">手で教えて再生</span>', "要所の姿勢を教え、再生して撮る"),
    (at('ei_desk2', 1, 0.0), "エイイチの苦労", '<span style="font-size:130px">上カメラ1台</span>', "アームや指でブロックが隠れる"),
], 'udegumi'))
# 9 謎が解ける
S["solve"] = p2_word(['謎を', '<span class="red">解きます</span>'], kicker="3つの手がかりがそろいました", kc="muted", size=190)
S["solve_run"] = p2_pair("練習しやすい", "機体と投資", da="相手は地面（仮想の世界）", db="この1年の伸び", ca="blue", cb="blue", mid="＋", kicker="走るが追い越したのは（と考えられる）", size=100)
S["solve_fold"] = p2_pair("練習しにくい", "お手本に時間", da="布は形が変わる", db="本物を集める", ca="red", cb="red", mid="＋", kicker="たたむが、まだなのは（理由の1つ）", size=100)
S["solve_moravec"] = add(p2_pair("知能テスト", "見て動く", da="比較的やさしい", db="1歳児並みでも難しい", ca="blue", cb="red", mid="／", kicker="ハンス・モラベック（1988年の本の趣旨）", size=140), fuda("ken", "本（1988年）"))
S["solve_twist"] = add(p2_pair("走る・宙返り", "器用な手作業", da="仮想の練習でうまくいく", db="まだうまくいかない", ca="blue", cb="red", mid="／", kicker="ゴールドバーグさん", size=100, sub="速く走るほうが難しく思えるのは、人の思い込み（別の研究者）"),
                        fuda("news", "インタビュー・報道"))
# 10 見立て（エイイチは右下）
S["mitate"] = add(chapter2("最後に", "見立て", "エイイチの考え"), ei_wipe('udegumi', 'mitate', pop=0.3))
MOTION["mitate"] = dict(type='html', html=S["mitate"])
# 指さし・ひらめきは大事な所だけ、少しの間（2026-10-28 エイイチの指示「ずっと指さしてるのはおかしい」）
EI_POINT = {
    "mitate2": [(at('mitate2', 1, 0.0), 'yubisasu'), (round(at('mitate2', 1, 0.0) + 2.8, 2), 'udegumi')],   # 「出資を集める意図が強い」と言い切る所
    "mitate_end": [(0.3, 'hirameku'), (3.2, 'udegumi')],   # 「別のものさしで」
}
for _n, _p, _pg in (
    ("mitate1", 'udegumi', p2_word(['人型で', '<span class="blue">なくていい</span>'], kicker="エイイチの見立て", kc="muted", size=160, sub="台の上でたたむだけなら、足は要らない", tag=T4)),
    ("mitate2", 'udegumi', p2_word(['派手な動きは', '<span class="red">出資集め</span>'], kicker="エイイチの見立て｜中国の人型ロボット", kc="muted", size=160, sub="現場で仕事ができるかは、仕事ごとに確かめる", tag=T4)),
    ("mitate3", 'udegumi', p2_num("5", "年くらい", kicker="どの家庭でも任せられるまで", sub="エイイチの感覚", tag=T4)),
    ("mitate_end", 'udegumi', p2_word(['別の', '<span class="blue">ものさし</span>で'], kicker="走るニュースと、家の洗濯物", kc="muted", size=170, tag=T4)),
):
    S[_n] = add(_pg, fuda("ei", "エイイチの見立て"), ei_wipe(_p, _n, poses=EI_POINT.get(_n)))
    MOTION[_n] = dict(type='html', html=S[_n])
# 11 答えと、持ち帰る3つ
S["answer"] = p2_pair("練習しやすい<br>＋機体と投資", "形が変わる<br>＋お手本に時間", da="走る", db="たたむ", ca="blue", cb="red", mid="／", kicker="今日の謎の答え", size=96, sub="まだ＝家で、人の手を借りずに、毎日")
S["check3"] = p2_list([("1", "自分で動く？"), ("2", "何回中何回？"), ("3", "お手本の数は？")], kicker="すごい動画を見たら、確かめる3つ", size=110)
S["hakobu_end"] = p2_word(['たたむのも', '<span class="blue">練習中</span>'], kicker="ハコブくん", kc="muted", size=170)

# 動きのある場面（紙の図）
MOTION.update({
 "hook": dict(type='slam', at=(0, 0.3)),                                      # 強
 "hook_time": dict(type='slam', at=(0, 0.45)),                                # 強
 "hook_answer": dict(type='slam', at=(0, 0.1)),                               # 強
 "question": dict(type='slam', at=(0, 0.45)),                                 # 強
 "teaser": dict(type='slam', at=(0, 0.45)),                                   # 強
 "map2": dict(type='reveal', left_at=(0, 0.35), at=(0, 0.6)),                 # 強
 "c1_sim": dict(type='count', counts=[('4096', 4096, (0, 0.3), (0, 0.8))]),   # 中
 "c2_joke": dict(type='slam', at=(0, 0.5)),                                   # 強
 "c3_figure": dict(type='count', counts=[('62', 62, (1, 0.3), (1, 0.75))]),   # 中
 "solve": dict(type='slam', at=(0, 0.5)),                                     # 強
 "solve_fold": dict(type='reveal', left_at=(0, 0.2), at=(0, 0.6)),            # 強
 "answer": dict(type='reveal', left_at=(1, 0.05), at=(1, 0.55)),              # 強
})
use_motion(MOTION, VIDEO, O, _here, MOVE)
```

#### sound.py（BGM と効果音の置き方）

```python
# 音の置き方（audio_mix.py が読む。書き方は audio_mix.py の先頭）
# 2026-10-28 「世界記録と洗濯物」: 「何台入れたら店は変わる」の sound.py を写した（同じ曲・同じ決まり）。謎解きの型の1本目
#   足したもの: エイイチ（ドット絵）が初めて出る所にぽん（se_pop）、「犯人は足でも手でもない」にちん（se_ding）
#   章の音（ポロロン）の場面を、この回の章（今日の謎・手がかり3つ・謎が解ける・見立て・答え・アウトロ）に合わせた

# 大きさ: 話している間はナレーションより23dB小さく、間は16dB小さく
BGM = [
    dict(file='sound/bgm_明るいB_2.mp3', start=0, end=None, level=-23, gap=-16, fade_in=0.6, fade_out=3.0),
]

SE = [
    # (文番号（0から）, 文の頭から何秒後, 音, ナレーションより何dB)
    (7, 0.0, 'se_pop', -8),     # ei_intro: エイイチが右下にぽんと出る
    (18, 0.0, 'se_ding', -10),  # teaser: 犯人は、足でも手でもない
]

# 場面が切り替わるたびに「ホワーン」（se_rise）。同じ人・同じ映像が続く所は鳴らさない
SCENE_SE = dict(file='se_rise', level=-6, offset=-0.15, skip=['title_eiichi', 'ei_react', 'ei_intro', 'teaser'])

# 大きな流れの変わり目は、ホワーンの代わりに別の音（自己紹介はキラリン・ほかはポロロン）
CHAPTER_SE = dict(file='se_chapter_marimba', files={'title': 'se_chapter_glock'}, level=-8, offset=-0.3,
                  scenes=['title', 'question', 'c1', 'c2', 'c3', 'solve', 'mitate', 'answer', 'outro'])
```

### 確認用で見つかった4つの不具合

**字幕の縁取りの穴。** 「む」の輪や「。」の中に、縁取りの黒で埋まらない白い点が残っていました（「「む」の黒ふちのゴミを削除して（他の文字でも見受けられます）」）。2026-10-19 に決めた「縁取りの中の穴は黒で埋める」が、本編の字幕にはまだ入っていませんでした。render.py に `fill_holes` を足し、字幕の画像を書いた直後に、画面の端とつながらない小さな透明な所を縁取りの色で塗ります。

【画像】LOG395_13_sub_hole_before.png 直す前の字幕「なぜ、たたむのは、まだなのか。」。「む」の輪と「。」の中に白い点が残っている

【画像】LOG395_14_sub_hole_after.png 直した後の同じ字幕。輪の中が黒で埋まっている

```python
# render.py に足した fill_holes
def fill_holes(path, ink=(13, 13, 13), maxarea=400):
    """縁取りの中の穴（「。」「む」の輪など）を縁取りの色で埋める（2026-10-19 の決まり・2026-10-28 に字幕へ入れた）。
    縁取りに囲まれた透明な所（画面の端とつながらない・小さい所）だけを塗る"""
    import numpy as _np
    from PIL import Image as _Im
    from scipy import ndimage as _nd
    a = _np.array(_Im.open(path).convert('RGBA')).astype(_np.float32)
    al = a[..., 3] / 255.0
    lab, n = _nd.label(al < 0.98)
    if not n:
        return
    edge = set(_np.unique(_np.concatenate([lab[0], lab[-1], lab[:, 0], lab[:, -1]]))) | {0}
    sz = _nd.sum(_np.ones_like(al), lab, range(1, n + 1))
    keep = _np.array([0] + [(k not in edge and sz[k - 1] <= maxarea) for k in range(1, n + 1)])
    m = keep[lab].astype(bool)
    if not m.any():
        return
    for c in range(3):
        a[..., c][m] = a[..., c][m] * al[m] + ink[c] * (1 - al[m])
    a[..., 3][m] = 255
    _Im.fromarray(a.clip(0, 255).astype(_np.uint8)).save(path)
```

**札の重なり。** 4つの札を縦に並べる場面で、札どうしが重なっていました（「全部重なっっているのを修正」）。札の行の高さを決めていなかったためで、`display:inline-block` と行の高さを入れて間をあけました。

**ハコブくんの口。** エイイチの声の間はハコブくんの口を止める決まりを assemble.py に入れていましたが、最初の確認用では効いていませんでした。`from narration import EI_LINES` が、作業フォルダではなく `_制作ベース` の見本の narration.py を読むことがあったためです。ファイルの場所を指定して読む形に直しました。

**動きの場面の指紋。** 動きの場面（motion_kit.py が書き出す mp4）を作り直しても、全体の書き出しで前の断片が使われていました。assemble.py は断片のファイル名に中身の指紋を入れて作り直しを省きますが、指紋に映像の中身が入っていませんでした。映像の大きさと更新時刻を指紋に足しました。

```python
# assemble.py の直した所
# ハコブくん以外の声（narration.py の EI_LINES）の文は、口を動かさない（2026-10-28「世界記録と洗濯物」）
# 作業フォルダの narration.py を名前で読む（_制作ベースにも同じ名前の見本があり、import だとそちらを読むことがある）
import importlib.util as _ilu
_sp = _ilu.spec_from_file_location('_narr_here', os.path.join(os.getcwd(), 'narration.py'))
_nm = _ilu.module_from_spec(_sp); _sp.loader.exec_module(_nm)
EI_LINES = list(getattr(_nm, 'EI_LINES', []))
print('ハコブくんの口を止める文:', EI_LINES)
mouth_pcm = pcm.astype(np.float32) / 32768.0
for o in idx:
    if o['i'] in EI_LINES:
        a0 = int(o['start'] / FPS * SR); a1 = int((o['start'] + o['frames']) / FPS * SR)
        mouth_pcm[a0:a1] = 0
params = hk.animate(timeline, mouth_pcm)
```

```python
# assemble.py の job() の指紋に足した2行
    if VIDEO.get(o['scene']) and os.path.exists(VIDEO[o['scene']][0]):   # 映像の中身が変わったら作り直す（動きの場面を書き出し直しても、前の断片が使われていた。2026-10-28）
        _st = os.stat(VIDEO[o['scene']][0]); fp.append((_st.st_size, int(_st.st_mtime)))
```

### よその映像の使い方を決めた

作業の途中で、ほかのチャンネルが Unitree の宣伝映像や ABC7 の報道映像を背景にずっと流している動画を見せられ、「規約的にどうなんですか」と聞かれました。答えは、引用の条件（主従・明瞭な区分・必然性・出所・改変しない）を満たしにくく、YouTube の「再利用されたコンテンツ」の決まりで収益化を断られやすい、でした。

> 自分のはベースにしつつもスポットで他の映像も使いたいね7:3くらいの割合かな

video_rules.md に「6-1 よその映像の使い方」を足しました。自分の映像を土台に、よその映像はスポットで 7:3 くらい。使ってよいのは、会社が配っている素材を利用条件の範囲で使う、引用の条件を満たして短く画面の中の窓で見せる、の2通りだけ。背景にずっと流さない。使ったクリップは台帳に1行ずつ書く。この動画では、大会や会社のロボットの映像は使わず、自分の机の上の映像だけを使っています。

### サムネイルとタイトル

サムネイルは2案作りました。案Aは自分の机の上のアームの写真、案Bはコードで描いたトラックとタオルの山（生成AIの画像は使っていません）。エイイチは案Bを選びました。アームの写真は「走る」とも「たたむ」とも関係がなく、文字だけで引っぱる形になっていたためです。

【画像】LOG395_11_thumbA.png サムネイル案A。自分の机の上のロボットアームの写真の上に「人間の世界記録より速いのに／走れるのに／洗濯物はまだ／謎を解く」、右下にハコブくんと「なぜ？」の札

【画像】LOG395_12_thumbB.png サムネイル案B（採用）。コードで描いたオレンジのトラックと青いタオルの山、右上にストップウォッチ。文字は案Aと同じ

タイトルは3案から「走るのは人間超え、たたむのはまだ。人型ロボットの謎を3つの手がかりで解く」に決まりました。

#### サムネイルの背景（コードで描いた HTML）

```html
<!doctype html><html><head><meta charset="utf-8"><style>
*{margin:0}body{width:1920px;height:1080px;background:#F5F5F0;font-family:'Noto Sans CJK JP',sans-serif;overflow:hidden;position:relative}
</style></head><body>
<svg width="1920" height="1080" viewBox="0 0 1920 1080">
 <defs><linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#F5F5F0"/><stop offset="1" stop-color="#E9E9E2"/></linearGradient></defs>
 <rect width="1920" height="1080" fill="url(#sky)"/>
 <!-- 右: トラック（遠近）-->
 <g transform="translate(0,0)">
  <path d="M700,1080 L1920,1080 L1920,560 L1300,560 Z" fill="#C4471F" opacity=".92"/>
  <path d="M760,1080 L1920,1080 L1920,600 L1330,600 Z" fill="none"/>
  <g stroke="#F5F5F0" stroke-width="6" opacity=".85">
   <path d="M1300,560 L700,1080" /><path d="M1455,560 L1005,1080"/><path d="M1610,560 L1310,1080"/><path d="M1765,560 L1615,1080"/>
  </g>
  <g stroke="#F5F5F0" stroke-width="5" opacity=".6"><path d="M1240,620 L1920,620"/><path d="M1150,700 L1920,700"/><path d="M1020,810 L1920,810"/><path d="M850,950 L1920,950"/></g>
 </g>
 <!-- 右上: ストップウォッチ -->
 <g transform="translate(1600,250)">
  <rect x="-30" y="-178" width="60" height="40" rx="8" fill="#0D0D0D"/>
  <circle r="150" fill="#fff" stroke="#0D0D0D" stroke-width="16"/>
  <circle r="118" fill="none" stroke="#D6D6D1" stroke-width="4"/>
  <g stroke="#0D0D0D" stroke-width="8" stroke-linecap="round"><path d="M0,0 L0,-95"/><path d="M0,0 L62,38"/></g>
  <circle r="12" fill="#C4471F"/>
 </g>
 <!-- 左: たたんだタオルの山 -->
 <g transform="translate(900,600)">
  <g fill="#1A6C98"><rect x="0" y="300" width="560" height="120" rx="24"/><rect x="0" y="300" width="560" height="40" rx="20" fill="#15587C"/></g>
  <g fill="#F5F5F0"><rect x="30" y="190" width="520" height="110" rx="22" stroke="#0D0D0D" stroke-width="8"/><rect x="30" y="190" width="520" height="34" rx="17" fill="#D6D6D1"/></g>
  <g fill="#1A6C98"><rect x="10" y="80" width="540" height="110" rx="22"/><rect x="10" y="80" width="540" height="34" rx="17" fill="#15587C"/></g>
  <!-- 上にくしゃっとした1枚 -->
  <path d="M60,80 C120,-40 260,-20 330,30 C400,-30 520,0 540,60 C560,90 520,100 480,86 C420,110 300,100 240,96 C180,120 90,110 60,80 Z" fill="#F5F5F0" stroke="#0D0D0D" stroke-width="8" stroke-linejoin="round"/>
  <path d="M130,70 C190,40 260,60 300,45" fill="none" stroke="#0D0D0D" stroke-width="5" stroke-linecap="round" opacity=".5"/>
 </g>
</svg></body></html>
```

#### thumb.py（サムネイルの文言）

```python
# サムネイルの文言と背景（thumbnail.py が読む）。2026-10-28「世界記録と洗濯物」（謎解きの型の1本目）
# 案A: 背景はエイイチの机の上のアーム（自前の映像 DAY124 の1コマ）。案B: コードで描いた「トラックとタオル」（サムネ素材/code_走るとたたむ.html）。生成AIの画像は使っていない
import os
PHOTO = os.environ.get('THUMB_BG', 'サムネ素材/code_走るとたたむ.png')   # 2026-10-28 エイイチが案Bに決定
PHOTO_POS_FULL = '50% 50%'
HAKOBU = True
LABEL = 'なぜ？'
KICKER = '人間の世界記録より速いのに'
LINES = ['走れるのに', '<span class="red">洗濯物はまだ</span>', '謎を解く']
VARIANTS = ['photo']
SIZE_L1, SIZE_L2, SIZE_L3 = 170, 230, 150
TXT_TOP = 70
HK_BOTTOM = -300
LABEL_BOTTOM = 158
LABEL_RIGHT = 450
LABEL_TAIL = 'bubble'
LABEL_FS = 60
```

### 概要欄と投稿文

概要欄には、ナレーションが AI 音声であることに加えて、「エイイチの声も AI 音声で、本人の声ではなく番組で使っている別の声を当てている」「右下のドット絵は生成AIで作った絵をもとに手で直したもの」「大会や会社のロボットの映像は使っていない」を書きました。目次は15個、字数は3,903字です。

#### 概要欄_下書き.md

```text
<!--
YouTube の概要欄の下書き（2026-10-28「世界記録と洗濯物」・謎解きの型の1本目）。{t:文番号} は、その文が始まる時間に置きかわる（文番号は 0 から数える tts の番号）。
python3 <_制作ベース>/description.py で 概要欄.txt を作り、それを貼る。
エイイチの声は 槙原の声（ElevenLabs の自作の声）を流用。ドット絵は ChatGPT で作った絵を元に手で直した。
-->
2026年4月、北京。人型ロボットのハーフマラソンで、優勝したロボットのタイムは50分26秒。人間の男子の世界記録候補（56分51秒・公認手続き中）より速いタイムです。なのに、家で洗濯物を任せられる人型ロボットは、今日までに確かめた公開資料では、まだ見当たりません。走るのは人間を追い越したのに、なぜ、たたむのは、まだなのか。この逆転を、3つの手がかりで解いていきます。

今日の謎：走るのは人間を追い越したのに、なぜ、たたむのは、まだなのか

先に答え：犯人は、ロボットの足でも手でもありません。走る相手は形の変わらない地面で、コンピューターの中で何千台も同時に練習できる。たたむ相手は形の変わる布で、仮想の世界で練習しにくく、本物のお手本を集めるのに時間がかかる。それが理由の1つだと考えられます。

この動画の3つの手がかり
・練習する場所：コンピューターの中で、4,096台が同時に歩く練習
・相手の形：地面は変わらない。布は、さわるたびに形が変わる
・お手本の数：1万時間のデータでも、まだ足りない

▼目次
0:00 世界記録より速いのに、洗濯物はまだ
{t:7} エイイチ、登場
{t:13} この番組について
{t:16} 今日の謎
{t:19} 出どころの札と、ロボットの条件
{t:24} たとえ：ロボットの学校
{t:30} 手がかり1 練習する場所
{t:41} 手がかり2 相手の形
{t:50} 手がかり3 お手本の数
{t:60} 現場の証人：エイイチの机の上
{t:68} 謎を解く
{t:77} エイイチの見立て
{t:86} 今日の謎の答え
{t:89} すごい動画を見たら、確かめる3つ
{t:94} エンディング

▼この動画で扱う範囲
・ロボットのタイムは、人の記録と同じ条件ではありません。大会では電池の交換、罰則つきの機体の交換、伴走の車が認められ、自律で走る区分でも一部の人の補助は認められていました。遠隔操作の機体は1.2倍で採点されています
・56分51秒は、大会のあと（2026年8月）に出た世界記録候補で、公認手続き中です。公認済みの記録は57分20秒（2026年3月）です
・「まだ」は、家で、人の手を借りずに、毎日任せられるところまでは来ていない、という意味です。研究や会社の試験で、タオルをたためた例はあります
・この1年でロボットのタイムが縮んだ理由は、1つに決まっていません。機体づくりと投資の積み重ねで説明する専門家もいます。優勝したロボットの学ばせ方は、公開資料では確かめられませんでした
・走るとたたむの難しさの説明は、研究者の発言と論文の範囲で言っています。「理由の1つ」であって、全部の理由ではありません
・エイイチの机の上の750回は、本人の台帳の行数です（2026年6月〜10月・失敗も含めた通しの試行）。外からは確かめられません
・見立ての節は、エイイチの考えです。新しい事実が出たら変わります

▼出典
・人型ロボットのハーフマラソン（2026年4月19日 北京亦荘・300台超・優勝 閃電 50分26秒）：新華社 https://www.news.cn/sports/20260419/c91172da5ef84342b7b07fb3c2ef8f12/c.html ／北京市政府 https://english.beijing.gov.cn/latest/news/202604/t20260419_4593508.html ／AP https://abcnews.com/International/wireStory/humanoid-robot-sprints-victory-beijing-beating-human-half-132179294
・2025年の第1回（優勝 2時間40分42秒）：Smithsonian https://www.smithsonianmag.com/smart-news/humanoid-robots-just-raced-alongside-human-runners-in-a-world-first-half-marathon-heres-how-it-went-180986469/
・男子ハーフマラソンの世界記録候補 56分51秒（2026年8月・公認手続き中）：World Athletics https://worldathletics.org/news/report/world-half-marathon-record-buenos-aires-2026-yomif-kejelcha
・専門家の見方（1年の伸びは機体と投資・2本足も2021年に仮想で走った・思い込み）：Scientific American https://www.scientificamerican.com/article/a-humanoid-robot-beat-the-human-half-marathon-record-at-a-beijing-race-but-what-did-it-actually-prove/
・仮想の世界で4,096台が同時に歩く練習（Rudin ら 2021・ETH Zurich・NVIDIA）：https://arxiv.org/pdf/2109.11978
・2本足の Cassie が2021年に仮想の練習で走った：Oregon State University https://engineering.oregonstate.edu/all-stories/great-strides
・布の仮想の世界の難しさ（RGBench 2025）：https://arxiv.org/html/2511.06434
・布を仮想で練習させて本物につなげた研究（Cloth Funnels）：https://arxiv.org/html/2210.09347
・π0（Physical Intelligence・1万時間超のデータ・腕2本の固定の機体）：https://arxiv.org/html/2410.24164v3
・Figure（2025年8月 タオルを自律でたたむ発表／2026年9月 Helix 2.5・初めて入る30の家・タオル62%）：https://www.figure.ai/news/helix-learns-to-fold-laundry ・ https://www.figure.ai/news/helix-2-5-zero-shot-30-home-generalization
・1X NEO（2026年4月 量産開始・一般の出荷は2026年予定）：https://www.globenewswire.com/news-release/2026/04/30/3285118/0/en/1X-opens-NEO-Factory.html ・ https://www.1x.tech/neo
・ケン・ゴールドバーグさんの発言（10万年分のデータの差）：UC Berkeley https://vcresearch.berkeley.edu/news/are-we-truly-verge-humanoid-robot-revolution
・ハンス・モラベック『Mind Children』（1988年）の趣旨。原書は未確認：https://en.wikipedia.org/wiki/Moravec%27s_paradox

▼この番組について
「フィジカルAI解説｜Pixels to Motors」は、フィジカルAIのニュースや実機の記録から、現場で使える形を考える番組です。
エイイチは、本業のデザイナーをしながら、ロボティクスの研究と開発をしています。その中で分かったことと、そこから考えた見立てを、案内役のハコブくんがお伝えします。
この回から、ニュースの謎を手がかりで解いていく形で作っています。話の出どころは、画面の左上の札で出しています（大会や会社の発表・ニュース・論文や本・エイイチの記録と見立て）。

・ナレーションは AI 音声（ElevenLabs）です。話しているのは Pixels to Motors のキャラクター、ハコブくんです
・エイイチの声も AI 音声（ElevenLabs）です。本人の声ではなく、番組で使っている別の声を当てています
・右下のエイイチのドット絵は、生成AIで作った絵をもとに手で直したものです
・BGM は ElevenLabs Music で作った曲、効果音はコードで作った音です
・画面の映像は、エイイチの机の上のロボットアーム（mechArm 270-Pi）を撮ったものです。大会や会社のロボットの映像は使っていません

▼ロボットの開発・導入のご相談
メール：pixelstomotors@adaptdesign.jp

▼リンク
Webサイト：https://pixelstomotors.com
GitHub：https://github.com/PixelstoMotors
X：https://x.com/adaptdesignjp
LinkedIn：https://www.linkedin.com/in/eiichi-shimazu

チャンネル登録・高評価もよろしくお願いします。コメントは、エイイチが全部読んでいます。

#フィジカルAI #人型ロボット #ロボットマラソン
```

### 動画の中で確かめる3つ

動画の最後で、人型ロボットのすごい動画を次に見たときに確かめる3つを渡しています。

1. 自分で動いているのか、人が遠くから操作しているのか
2. 何回中何回できたのか
3. お手本の数は、どれだけ集めたのか

【画像】LOG395_08_check3.jpg 動画の終わりの場面。「すごい動画を見たら、確かめる3つ」の下に「1 自分で動く？ 2 何回中何回？ 3 お手本の数は？」

この3つは、謎解きの答えをそのまま裏返したものです。走れるのに、たためない理由が「練習する場所・相手の形・お手本の数」なら、次の動画を見るときに確かめるのもその3つになります。

### 保存した場所

- 作り方のファイル（narration.py・scenes.py・ei_talk.py・sound.py・thumb.py・make_docs.py・codex の依頼と結果・台本・概要欄）: iCloud `動画/世界記録と洗濯物/`
- 動画（アップロード用・確認用）: KIOXIA `videos/世界記録と洗濯物/`
- 動画の作り方の決まり: `_制作ベース/video_rules.md`（94回目・1-4 謎解きの型・6-1 よその映像の使い方）
- X の予約の文: GitHub `PixelstoMotors/r2r2r-content` の `sns/VIDEO_world-record-and-laundry_sns_posts.json`
