#!/bin/bash # 20話ぶん(2026-10-24)の声をまとめて作る。先に read -s ELEVENLABS_API_KEY && export ELEVENLABS_API_KEY # 新しい声(中村・森田茂・森田久美子・ハコブ_イケボ)は、先に _制作ベース で voice_design.py design → save をすませる。 # まだ保存していない声の行は「とばしました」と出して先へ進む(あとでもう一度動かせば、できていない分だけ作る) cd "$(dirname "$0")" B=../_制作ベース HK="gWJpc8whMBqnF7Y0kc9f" id() { python3 -c "import json;print(json.load(open('../$B/声の一覧.json')).get('$1',''))"; } mk() { # mk 人 本数 文 local who="$1" n="$2" txt="$3" v if [ "$who" = "ハコブ" ]; then v=$HK elif [ "$who" = "中村" ]; then v="$(id 槙原)" # 2026-10-24 自作の声が上限(10/10)のため、中村さんは槙原さんの声を借りる elif [ "$who" = "森田茂" ]; then v="$(id 田中)" # 同じく、森田茂さんは田中先生の声を借りる(どちらも同じ話には出ない) else v="$(id "$who")"; fi if [ -z "$v" ]; then echo " ! $who の声がまだ保存されていないので、とばしました"; SKIP=1; return; fi [ -f "voice_eleven/$who/試し_$(printf %02d $n).mp3" ] && return python3 ../$B/tts_eleven.py --voice "$v" --name "$who" --try "$txt" || { echo " ! $who で止まりました"; SKIP=1; } } SKIP=0 echo "== 第7話_ピンポン"; mkdir -p "第7話_ピンポン"; cd "第7話_ピンポン" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "田中" 1 "残念ながら、検査の結果が、思わしくなく…。" mk "ハコブ" 2 "ピンポンパンポーン! 検便容器を、回収してまいりました!|タスク、完了。" cd .. echo "== 第9話_外装"; mkdir -p "第9話_外装"; cd "第9話_外装" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "高杉" 1 "ハコブくん、今日もお疲れ様〜。寝てるかな?" mk "槙原" 1 "あ、外装、外してるだけですよ。" mk "ハコブ" 1 "タスク、完了。" cd .. echo "== 第17話_イケボ"; mkdir -p "第17話_イケボ"; cd "第17話_イケボ" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "寺島" 2 "連絡事項です。今日から、ハコブくんの音声ガイダンスが更新されました。|メーカーいわく、親しみやすさを重視したアップデートだそうです。" mk "大城" 3 "ハコブくん、ちょうどいいところに。こっちの検体、運んでくれる?|ハコブくん、こっち来て!|キャラが濃すぎるわ! 仕事にならないから、前のカタコトに戻して!" mk "ハコブ_イケボ" 3 "御意。|ただいま参上つかまつった、姫君。|……御意。姫君の、望むままに……。" cd .. echo "== 第23話_忍者"; mkdir -p "第23話_忍者"; cd "第23話_忍者" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "大城" 2 "ひっ!|静かすぎて、心臓に悪いわ! 少しは音を出して!" mk "ハコブ" 1 "忍者モード、解除します。" cd .. echo "== 第46話_メニュー"; mkdir -p "第46話_メニュー"; cd "第46話_メニュー" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "大城" 3 "ハコブくんの音量、夜勤用に下げておきたい。|…!|もう、トップ画面に「よく使う設定」を、3つだけ出して!" mk "ハコブ" 1 "同意します。深すぎました。" cd .. echo "== 第47話_8時間"; mkdir -p "第47話_8時間"; cd "第47話_8時間" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "寺島" 1 "あ、後でね。" mk "大城" 2 "あら、なんか今日、変だと思ってた。|ごめん、表示の仕方を変えよう。" mk "ハコブ" 2 "右車輪の、メンテナンスを推奨します。|8時間前から、告知しておりました。" cd .. echo "== 第51話_自己診断"; mkdir -p "第51話_自己診断"; cd "第51話_自己診断" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "大城" 2 "ハコブくん、目、悪くなった?|私たちが、定期的に拭くわね。" mk "ハコブ" 3 "自己診断結果、全機能、正常。|視界不良を、検知できませんでした。|自分の目は、自分で見えない。" cd .. echo "== 第52話_夜勤"; mkdir -p "第52話_夜勤"; cd "第52話_夜勤" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "ハコブ" 3 "大城様、今月の夜勤は、過去6カ月平均より、40パーセント多いです。|シフト表を、閲覧しました。|以後、参照する前に、告知します。" mk "大城" 3 "ありがた…いけど、どこまで見るの?|悪気はないのよね…。でも、線引きしようね。|私のデータ見たら、見たって先に言って。" cd .. echo "== 第60話_再現しない"; mkdir -p "第60話_再現しない"; cd "第60話_再現しない" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "大城" 2 "白石さん、ハコブくんが、たまに急停止するの。週に2、3回。|白石さーん! 戻ってきて!" mk "白石" 3 "再現条件、調べに来ました!|…起きないですね。|廊下のワイファイ、切り替えの時の挙動でした…。次回も録画、お願いします!" mk "ハコブ" 1 "現場の目が、最強のセンサーです。" cd .. echo "== 第62話_確信度"; mkdir -p "第62話_確信度"; cd "第62話_確信度" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "大城" 3 "ノルバスクを、三番の保管庫まで、お願い。|なんで最初に言わないの! 二度手間よ!|その方がいいの。迷ってるなら、迷ってる顔して。" mk "ハコブ" 3 "了解しました。|確認します。薬剤名を、もう一度。|聞き取れました。確信度、低。" cd .. echo "== 第63話_通行止め"; mkdir -p "第63話_通行止め"; cd "第63話_通行止め" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "ハコブ" 3 "経路、再計算。|経路、再計算。経路、再計算。|掲示は、読めます。地図は、更新されていません。" mk "高杉" 1 "そこ、昨日から壁なのよ。" cd .. echo "== 第65話_道案内"; mkdir -p "第65話_道案内"; cd "第65話_道案内" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "森田茂" 1 "すいません、304号室は、どっちですか。" mk "ハコブ" 2 "職員認証が、必要です。|権限を、機能ごとに分けます。" mk "大城" 1 "道案内くらい、誰にでも答えていいと思うの。" cd .. echo "== 第71話_置いてけぼり"; mkdir -p "第71話_置いてけぼり"; cd "第71話_置いてけぼり" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "ハコブ" 3 "こちらです。|経路は、最短です。|合わせます。" mk "森田久美子" 3 "あら、ロボットさんは?|速いのよ、あなた。こっちは荷物持ってるんだから。|そう、それでいいの。" cd .. echo "== 第72話_トイレ"; mkdir -p "第72話_トイレ"; cd "第72話_トイレ" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "ハコブ" 3 "目的地、405号室。案内中。|経路を、継続します。|経路を、継続します。" mk "中村" 2 "ちょっと、トイレどこ?|置いてかれるかと思った。" mk "大城" 1 "案内中でも、寄り道は入るのよ。" mk "白石" 1 "あ、トイレ…。盲点でした。" cd .. echo "== 第84話_プリン"; mkdir -p "第84話_プリン"; cd "第84話_プリン" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "田中" 3 "ハコブくん、プリンを持ってきてくれ。至急だ。|頼んでない。|…俺の声、そんなに似てたか?" mk "ハコブ" 3 "田中先生の声と、一致。了解しました。|ご注文の、プリンです。|以後、声だけでは、受け付けません。" mk "中村" 1 "けっこう、自信あります。" cd .. echo "== 第89話_お手すき"; mkdir -p "第89話_お手すき"; cd "第89話_お手すき" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "小芝" 3 "あの…もしお手すきでしたら、ルートのセットを…。あ、急がなくて大丈夫なんですけど…。|お手すきの時でって…言っちゃいました…。|…急ぎです。" mk "ハコブ" 2 "了解しました。優先度、低で登録します。|以後、言い方ではなく、「急ぎですか」と聞きます。" mk "大城" 2 "先生、セットは!?|急ぎなら、急ぎって言いなさい!" cd .. echo "== 第90話_伝言"; mkdir -p "第90話_伝言"; cd "第90話_伝言" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "小芝" 2 "田中先生に…見間違いかもしれないんですけど…お時間ある時にでも…と、伝えてもらえますか。|は、はい…。" mk "ハコブ" 3 "小芝先生より、伝言です。要約します。|田中先生の指示に、誤りがあります。|伝言は、要約せずに届けます。" mk "田中" 1 "確かに、間違ってた。助かったよ。…次は、直接言いに来い。" cd .. echo "== 第91話_心拍数"; mkdir -p "第91話_心拍数"; cd "第91話_心拍数" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "小芝" 2 "チクッとしますね〜。|し、してません!" mk "ハコブ" 2 "小芝先生の心拍数、平常時の1.8倍です。|以後、本人にだけ伝えます。" mk "中村" 1 "先生、俺より緊張してません?" mk "大城" 1 "そういうのは、本人にだけ、こっそり教えてあげて。" cd .. echo "== 第92話_なかったことに"; mkdir -p "第92話_なかったことに"; cd "第92話_なかったことに" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "小芝" 1 "ハコブくん…さっきの、なかったことに、できない?" mk "ハコブ" 2 "記録は、消せません。|ですが、報告は、一緒にできます。" mk "大城" 1 "言いに来てくれて、助かるわ。怒らないから、次も言いに来てね。" cd .. echo "== 第98話_起こさない"; mkdir -p "第98話_起こさない"; cd "第98話_起こさない" [ -f narration.py ] || printf "# ショート専用。声は --try で作る(_ショート専用/20話の声.sh)\nSEGS = []\n" > narration.py mk "小芝" 3 "朝まで、絶対に起こさないでね。|そういう時は、起こしてよ!|…絶対は、取り消します。" mk "ハコブ" 4 "了解しました。|おはようございます。先生の承認待ちが、3件ありました。|「絶対に」と、言われました。|起こすべき時は、起こします。" cd .. [ $SKIP = 0 ] && echo できあがり || echo "とばした声があります。声を保存してから、もう一度 bash 20話の声.sh"