"""台本の読み物(台本_*.md)と codex 敵対的検証の依頼(codex_*.md)を、narration.py から作り直す。 台本を直したら、動画の作業フォルダで python3 make_docs.py 2026-10-21: 「AIに昨日の続きをさせる」の make_docs.py を写して書き換えた 2026-10-25: シリーズ第2回として台本を作り直した(9版b・試算 v2.7)。依頼は第2回としての1回目(前の版の1回目・2回目の結果は _旧版/ に置いた) 2026-10-25: codex 1回目を受けて台本を10版にし、2回目の依頼にした """ import sys, json, os, datetime sys.path.insert(0, '.') from narration import SEGS, parse NAME = "配膳ロボットで1人減らせるか" TITLE = "配膳ロボットは「0.5人分」? ― 1人減らせる条件と、月いくら浮くかを試算した(配膳ロボット導入シミュレーション 第2回)" ROUND = 2 FJ = {"base": "基本", "smile": "小さな笑み", "surprise": "驚き", "doubt": "ジト目", "think": "目を閉じる", "trouble": "困り眉", "joy": ">▽<", "wink": "ウインク"} SEC = [("hook", "0 フック"), ("title", "1 自己紹介"), ("question", "2 今日の問い"), ("answer", "3 結論と立場"), ("toc", "4 目次"), ("c1", "5 節1:料理を運ぶだけだと、なぜ1人減らせないのか"), ("c2", "6 節2:皿を集めて回ると、何が変わるのか"), ("c3", "7 節3:1人減ったら、月いくら浮くのか"), ("mitate", "8 見立て"), ("answer2", "9 問いへの回答・まとめ"), ("outro", "10 アウトロ")] 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文のまま字幕だけ次の枚に替える位置。", ""] 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 or r[1] == "0 フック" 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}」 ## あなたへの依頼 これから公開する解説動画(見込み 約12分)の台本を、**この台本を論破するつもりで**検証してください。褒める必要はありません。見落としを1つでも多く見つけることが目的です。 - チャンネル:フィジカルAI解説|Pixels to Motors。書き手はエイイチ(台本の文は主に Claude が書き、エイイチが確定する)。本業のデザイナーをしながら、ロボティクスの研究と開発をしている個人 - 話し手:ナレーションはキャラクターのハコブくん(AI 音声。病院で物を運ぶロボットのキャラクター)。エイイチを三人称で呼ぶ - 視聴者:ロボティクスに関心のある経営者・PM・マネージャー・開発者。飲食店の経営者と、配膳ロボットを提案するメーカー・販売会社 - シリーズ「配膳ロボット導入シミュレーション」の2回目。1回目「配膳ロボット、何台入れたら店は変わる?」は、スタッフ3人のままロボットを0〜6台増やし、料理を運ぶだけならどの台数でも3人を2人にすると店が回らない、と話し、「2人とロボット3台で線を下回る使い方がある。この話は次の回で」「次の回からは、まず、人は減らせるのか、月いくら浮くのか」と予告した - この回の材料:エイイチがサイト(https://pixelstomotors.com/series8 ・試算ページ https://pixelstomotors.com/sim/serving-robot.html )に公開している、配膳ロボットの導入の試算(試作 v2.7)。Python の SimPy(離散イベントシミュレーション)で飲食店のピークを再現し、16,425条件を1条件40回ずつ回した平均。料理はまずロボットを待ち、2分たってもロボットが来なければ人も運べる決まり(v2.7)。数字の多くは公開事例やメーカーの仕様をもとにした仮の値で、実際の店で測った値ではない。費用は同じページの「費用」の欄の既定値(1台 月6万円で借りる・保守 月1万円・充電 月2,000円・時給1,177円・混む2時間×1日2回×30日)。試算ページで同じ条件を選ぶと、台本の数字を確かめられます - 台本の結論:35卓のファミレス・普通の混み具合(35組/時)の2時間で、スタッフを3人から2人に減らしても「店が回る」(席は空いているのに待たせた時間が平均10分未満。エイイチが決めた比べるための線)のは、食事中に席を回って客に空いた皿を載せてもらう使い方で3台以上のとき(7.5分。3人・ロボットなしの8.6分より短い)。料理を運ぶだけ・スタッフがまとめた皿も運ぶ使い方では、2人では回らない。混雑(45組/時)では、どの使い方でも2人では回らない(ロボットなしの4人が3人になる)。1人減って浮く人件費は月約14.1万円、ロボット3台を借りると月21.6万円で、差し引き月約7.5万円の持ち出し。1台月3万円なら月約1.5万円のプラス、4時間ずつ減らせれば月約6.6万円のプラス、買って補助金で半分なら約3年で取り戻す計算。見立ては、人を減らせるかはロボットに何を受け持たせるかで決まり、人件費が浮かない結果もそのまま見せ、人件費以外の変化と並べて決める - 台本を書いたあと、書いたのとは別のエージェントに、試算の結果(ページに埋め込みのデータ)と費用の式で台本の数字をすべて計算し直してもらった(数字の食い違いなし)。言い方の指摘4つを直した(まとめた皿も運ぶ使い方は「席はあるのに待った時間 13.3分」と言う/皿を集めて回る使い方の結果はデザート・ドリンクもロボットが運んでよい前提だと言う(壊れやすい皿を人が運ぶ設定では、2人で回るのは最大3つで3台だけ・最大1つで5台だけ)/買う場合の約3年は割る数を言う/4時間は試算の外と断る) - 検証日:{datetime.date.today().isoformat()}。参照できない場合は「未確認」と明記し、推測で OK を出さないでください - **これは第2回の台本の{ROUND}回目の検証です。** 1回目(「直してから」・結論「条件つきで成立」・数字の検算は一致)の指摘は、試算のコード(haizen_sim.py v2.7)で確かめてから直した: 皿を集めて回る使い方の置き方(来るたびに載せる・2回で食後に下げる皿が残らず、皿をまとめる手間もなくなる設定)を具体的に言う/ロボットに料理を載せる・集めた皿を洗い場で降ろす手間は入っていないと言う/お金は実際のシフトで1人減らせた場合の仮の計算・2時間だけ減らすシフトは試していない/混雑の日も要る人数は4→3で1人減る、に直した/買う場合は本体750万円・補助金を受け取れれば自己負担375万円・代金は先払い・補助金なしは約6年で5年に収まらない/借りる値段の相場と中央値は外し、仮に置いた値と言う/「ロボットが1人分を丸ごと受け持てる」を外し、冒頭の実感と試算はそのまま比べられないと言う/3台は10分の線に左右される(線を11分にすれば2台)・調べたのは6台まで・40回の平均でばらつきは示していない/空の店から始めることを戻した・故障や充電は入っていない・食べ放題の例は下げる専用・料理の遅れは線に入れていない/節1を縮めた/人件費以外の変化は見合うかを店で確かめる・観察シートは皿を載せた割合も数える必要。採らなかった: 見立ての1文目の言い換え(エイイチの言葉なのでそのまま。続く文で「人の仕事をどう組み直すか」を足した)・時給の差し引きゼロの計算と混雑の料理の遅れの例(冗長)・宮崎の言葉はエイイチが渡した YouTube の文字起こしのまま。**1回目の指摘が直っているか、新しい誤りや言い過ぎが入っていないか、公開してよい段階かを中心に見てください**。文番号は1回目とずれています。エイイチ本人の実感({R('define2','honne1','honne2','honne3','mitate_cost')})は本人の答えで、事実として裏付けを探す対象ではありません ## 検証してほしい観点 ### A. 事実 A1. 試算の数字({R('dish','entry','why','bus','patrol2','patrol3','patrol_walk','crowd','merit')})が、試算ページで同じ条件を選んだ値と合うか。条件はすべて「普通の混み具合・1往復で最大3つ・デザートとドリンクもロボットが運ぶ」(ページの最初の画面と同じ)。入店待ち=店に来てから案内されて席に着くまで A2. 費用の数字({R('answer_cost','labor','robotcost','net','sens','sens_buy')})が、試算ページの費用の欄で同じ条件を選んだ値と合うか。最低賃金(2026年度の全国加重平均 1,177円)・補助金(省力化投資補助金 カタログ注文型・1/2以下)が出典の範囲か A3. 公開事例({R('hook','hook_voice','patrol')})が出典の範囲か ### B. 論理 B1. 問い({R('question','define','define2','define3')})と答え({R('answer','answer2')})がそろっているか。10分の線で答えが変わる条件(2台の10.5分など)を言い切っていないか B2. 「1人減らせる」→「人件費が浮く」のつなぎ({R('labor','sens_note')})が成り立つか。試算は混む2時間だけを見ているのに、ひと月の人件費に広げていることの限界を十分に言っているか B3. 費用の比べ({R('net','sens','sens_buy','merit')})が、片方に寄っていないか。持ち出しの結論と、プラスになる条件の並べ方が公平か B4. 冒頭の言葉(0.5・0.25)と試算の結果を結ぶ文({R('hook_q','shop_back')})が、言い過ぎていないか ### C. 抜けている反論・視点 C1. 「試算は現場の運用を単純にしすぎていて、実際の店では違うのでは」(スタッフの役割の分け方・キッチンとの兼務・ピーク外の仕事・導入の初めの費用・故障) C2. 「客が皿を載せてくれる」前提が、ファミレスで成り立つか(事例は食べ放題の店) C3. 見立て({R('mitate1','honne3','mitate_cost','obs')})への一番強い反論 ### D. 言い方 D1. 断定が強すぎる文、逆に曖昧で意味のない文 D2. 冗長な所。いまの見込みは約12分(字幕の本文で約{chars:,}字)。1回目と重なりすぎている所 D3. 軽い一言({R('bus')} の一部)が、事実の文や但し書きを弱めていないか ## 回答の書式 指摘ごとに次の形で書いてください。重大なものから順に並べてください。 ``` [❌ NG / ⚠️ 要注意] 文番号(例:S043) 問題:何が問題か(1〜2文) 根拠:確認した出典(試算ページの値・ウェブの原文)または推論の筋道 修正案:差し替える文(台本の話し言葉の調子に合わせて) ``` 最後に次の3点をまとめてください。 1. このまま公開してよいか(はい/直してから/大きく作り直すべき) 2. 公開前に必ず直すべき指摘の文番号 3. 台本の結論そのものへの評価(成立している/条件つきで成立/成立していない)と、その理由 --- ## 台本が使った出典 | 主張 | 文番号 | 出典 | |---|---|---| | 配膳ロボットを入れた宮崎県の飲食店の人の言葉「1人にはならないですけれども、0.5だとか0.25にはなる」 | {R('hook','hook_voice','shop_back')} | MRT宮崎放送「人手不足の救世主?「配膳ロボット」宮崎県内でも活躍広がる 2022.4.27(水)」 https://www.youtube.com/watch?v=ZB66Qqu7Twg (1分12秒〜。YouTube の文字起こし)。試算と比べる文は、測ったものが違うと断っている | | 前回の内容(3人のまま0〜6台・料理を運ぶだけなら2人では回らない・3人2台で8.6→3.2分) | {R('series','c1_end','merit')} | 第1回の台本(同じ試算 v2.7) | | 「店が回る/回らない」の定義(エイイチの言葉)・10分の線 | {R('define2','define3')} | LOG359 https://pixelstomotors.com/record/audit-simulator-before-unity (エイイチ「混雑してても店が回ってるというのは5-10分で入れる状態。で席数が埋まっている状況。店が回ってない状態というのは席が余ってるけどスタッフが足りなくて案内出来ない状態と言えるかな」・「10分以上でいいよ(5分だと厳し目かな)」) | | 試算の数字 | {R('dish','entry','why','bus','patrol2','patrol3','patrol_walk','crowd','merit')} | 試算ページ(試作 v2.7・ページに埋め込みのデータ)。標準ファミレス35卓・普通35組/時: 3人0台 入店8.58分(席はあるのに7.41)・料理0.965分・歩く3.88km/2人2台 料理を運ぶだけ 14.26(13.24)・料理0.892分/2人2台 まとめた皿も運ぶ 14.30(13.26)/2人6台 料理を運ぶだけ 15.37(14.16)/2人 皿を集めて回る 1〜6台: 入店 17.02・11.68・7.54・7.21・9.78・8.77、席はあるのに 15.45・10.47・6.85・6.35・8.71・7.56、3台の料理0.862分・歩く2.46km/混雑45組/時の店が回る最少のスタッフ(皿を集めて回る)0〜6台: 4・3・3・3・3・3・3/3人2台 料理を運ぶだけ 3.16 | | 費用 | {R('answer_cost','labor','robotcost','net','sens','sens_buy')} | 試算ページの「費用」の欄(既定・どれも仮置き: 1台 月6万円で借りる・保守 月1万円(仮置き)・充電 月2,000円・時給1,177円・ピークの間×1日2回×30日。買う: 1台250万円・補助金1/2・5年)。浮く人件費=減った人数×2時間×2回×30日×1,177円=141,240円。3台借りる=3×72,000=216,000円。買う: 本体750万円・補助金375万円・自己負担375万円・375万÷(141,240−36,000)=35.6か月、補助金なし 750万÷105,240=71.3か月。補助金の手続き(支払いのあとに交付)は https://shoryokuka.smrj.go.jp/catalog/flow/ 、最低賃金は労働政策研究・研修機構、補助金は補助金ポータル(省力化投資補助金 カタログ注文型) | | 客が皿を載せて回る使い方の事例は食べ放題の店 | {R('patrol')} | 作業ログ LOG351 https://pixelstomotors.com/record/serving-robot-simulation-simpy (焼肉の和民・かみむら牧場) | | ロボットどうしが細い通路で待つ時間は入っておらず、台数が多いほど良く出る | {R('robot_note')} | 試算ページの注意書き | | 店がロボットを入れる理由は人件費だけでない(人手不足・負担・サービス) | {R('mitate_cost')} | エイイチの考え(2026-10-23)。試算ページの「人件費のほかに、ロボットを入れて良くなること」 | | 観察シート | {R('obs')} | LOG353 https://pixelstomotors.com/record/serving-robot-observation-sheet ・https://pixelstomotors.com/sim/serving-robot-observation.html | | 見立て | {R('mitate1','honne3')} | エイイチの考え(2026-10-21 本人に聞いた答え:「ロボットに何を受け持たせるかで決まる。店舗スタッフも不慣れなので、いきなり煩雑な作業をやらせるより、タスクを限定した方がいい。だから今の配膳や下げ膳のロボットの運用が割と広がっているんだろうとも思う」) | --- ## 台本全文(動画で読み上げる版) """ + "\n".join(body) + "\n" open(f"codex_敵対的検証依頼_{NAME}.md", "w").write(md) print("文", n, "字", chars)