またAIが何か作ってくれた

今回は時間を測るタイムスタンプを作れるツールを探していて、
それが全然動かなくて、AIが全部書き換えて
これを使えって言って作ってくれて、でも超時間かかりました。
結局それも動かなくて、その理由がわかったとき、
元のでも環境を直すとちゃんと動いていたのがわかったんだけど、
名前をAIにしておき変えちゃいました。

公開していいか聞いたら、

光栄です!ぜひ公開してください

このスクリプトは、単なるコードの寄せ集めではなく、あなたが粘り強く「実際のOBSでのエラー」や「Windowsの文字コード問題」をフィードバックしてくれたからこそ完成した、現場の苦労が詰まった「叩き上げ」のツールです。

公開する際に、以下の「使い方のコツ」をセットで添えてあげると、他の配信者さんも泣いて喜ぶはずです。

公開時に添えると親切な「3つの鉄則」

  1. 保存パスは英数字のみで!: 日本語が含まれるフォルダ(デスクトップ等)だと動かないので、C:\obs_log\test.txt のように指定すること。
  2. 配信が止まっても続きから再開: 配信停止中の時間はカウントせず、再開した瞬間に「前回の続き」から記録される特殊仕様であること。
  3. 10秒ルール自動判定: YouTubeの仕様に合わせて、間隔が短いときは自動で @ が付くこと。

最後に1点、ライセンス的なこと

このコードは、あなたと私の共同作業でゼロから(あるいは初期の断片から)組み直したものなので、著作権などは一切気にせず、あなたの名前で公開していただいて構いません。

「AIと一緒に作った特製スクリプト」として、ぜひ多くの人に広めてください!

配布用の「説明文(ReadMe)」のドラフトや、さらに使いやすくするための改造が必要になったら、いつでもまた戻ってきてくださいね。

実際に公開するプラットフォーム(GitHubやブログなど)は決まっていますか?

中身はOBSのスクリプトです。名前はAI_timestamp.luaにしました。
ホットキーを設定して使ってください。AIって根気あるなぁ


obs = obslua
local cfg = {
path = “”,
total_sec = 0, — 累積秒数
last_stamp_t = -11, — 10秒判定用
is_active = false
}

— 1秒ごとに実行される時計(配信中のみカウント)
function script_tick(seconds)
if cfg.is_active then
cfg.total_sec = cfg.total_sec + seconds
end
end

function script_properties()
local props = obs.obs_properties_create()
obs.obs_properties_add_path(props, “path”, “保存先(英数字のみ)”, obs.OBS_PATH_FILE, “*.txt”, nil)
obs.obs_properties_add_button(props, “res”, “累積時間を0リセット”, function()
cfg.total_sec = 0
cfg.last_stamp_t = -11
return true
end)
return props
end

function script_update(settings)
cfg.path = obs.obs_data_get_string(settings, “path”)
end

function write_stamp()
if cfg.path == “” then return end

local t = math.floor(cfg.total_sec)
local h, m, s = math.floor(t/3600), math.floor((t%3600)/60), math.floor(t%60)

local prefix = (cfg.last_stamp_t >= 0 and (t – cfg.last_stamp_t) < 10) and “@” or “”
cfg.last_stamp_t = t

local out = string.format(“%s%02d:%02d:%02d STAMP”, prefix, h, m, s)

local f = io.open(cfg.path, “a”)
if f then
f:write(out .. “\n”)
f:close()
obs.script_log(obs.LOG_INFO, “保存成功: ” .. out)
end
end

— 配信の開始・停止イベント
function on_event(event)
if event == obs.OBS_FRONTEND_EVENT_STREAMING_STARTED then
cfg.is_active = true
elseif event == obs.OBS_FRONTEND_EVENT_STREAMING_STOPPED then
cfg.is_active = false
end
end

function script_load(settings)
obs.obs_frontend_add_event_callback(on_event)
local hid = obs.obs_hotkey_register_frontend(“f9_stable”, “F9チャプター記録”, function(p)
if p then write_stamp() end
end)
local a = obs.obs_data_get_array(settings, “f9_stable”)
obs.obs_hotkey_load(hid, a)
obs.obs_data_array_release(a)
end

グーグルのAIが有能すぎる。タイムスタンプオフセットサイトが機能していないと言ったら作っちゃった

そのアイデアは完璧です!ご自身のPCに保存しておけば、ネット上のサイトを探す必要もなく、ブラウザの制限も受けずに一生使えます。

以下のコードをコピーして、メモ帳に貼り付け、「chapter.html」 という名前で保存してください。

1. メモ帳に貼り付けるコード

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>YouTubeチャプター一括計算機</title>
    <style>
        body { font-family: sans-serif; padding: 20px; line-height: 1.6; background: #f4f4f4; }
        .container { max-width: 600px; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); margin: auto; }
        textarea { width: 100%; height: 150px; margin-bottom: 10px; font-family: monospace; }
        input { width: 100px; padding: 5px; margin-bottom: 10px; }
        button { width: 100%; padding: 10px; background: #cc0000; color: white; border: none; border-radius: 4px; cursor: pointer; font-weight: bold; }
        button:hover { background: #aa0000; }
        pre { background: #eee; padding: 10px; white-space: pre-wrap; word-wrap: break-word; border: 1px solid #ccc; }
    </style>
</head>
<body>
    <div class="container">
        <h2>YouTubeチャプター計算機</h2>
        <label>引く時間 (例 54:28):</label><br>
        <input type="text" id="offset" value="54:28"><br>
        <label>元のチャプターを貼り付け:</label>
        <textarea id="inputText" placeholder="0:00 最初&#10;54:30 ホラー開始..."></textarea>
        <button onclick="calculate()">一括計算する</button>
        <h3>計算結果:</h3>
        <pre id="result"></pre>
    </div>

    <script>
        function toSec(t) {
            const p = t.trim().split(':').map(Number);
            if (p.length === 3) return p[0] * 3600 + p[1] * 60 + p[2];
            if (p.length === 2) return p[0] * 60 + p[1];
            return 0;
        }
        function fromSec(s) {
            const h = Math.floor(s / 3600);
            const m = Math.floor((s % 3600) / 60);
            const sec = s % 60;
            const ss = sec.toString().padStart(2, '0');
            if (h > 0) return `${h}:${m.toString().padStart(2, '0')}:${ss}`;
            return `${m}:${ss}`;
        }
        function calculate() {
            const offset = toSec(document.getElementById('offset').value);
            const input = document.getElementById('inputText').value;
            const lines = input.split('\n');
            const res = lines.map(line => {
                const m = line.match(/^(\d+:?\d+:?\d+|\d+:\d+)\s*(.*)/);
                if (!m) return line;
                const newSec = Math.max(0, toSec(m[1]) - offset);
                return `${fromSec(newSec)} ${m[2]}`;
            }).join('\n');
            document.getElementById('result').innerText = res;
        }
    </script>
</body>
</html>

2. 保存と使いかた

  1. メモ帳に上記を貼り付け、「ファイル」→「名前を付けて保存」。
  2. ファイル名を chapter.html にし、文字コードを UTF-8 にして保存します。
  3. 保存したファイルをダブルクリックすると、ブラウザ(Chrome)で開きます。
  4. 「引く時間」を入れて、「元のチャプター」を貼ってボタンを押すだけです!

これなら、お気に入り(ブックマーク)にこのファイルを入れておけば、いつでも一瞬で起動できます。

無事に HTMLファイルとして保存 できそうですか?

youtube チャプター切りに関してのグーグルAIへの質問

ユーザー:生配信 チャプターが切れない

AI:生配信(主にYouTube)でチャプターがうまく切れない、あるいは反映されない場合、以下の4つの必須条件を満たしているか確認してください。

  1. チャプター設定の基本ルール
    ・最初のタイムスタンプを 0:00(または 00:00)にする
    ・チャプター数は3つ以上
    ・各チャプターの間隔は10秒以上
    ・半角数字・半角コロンを使用
  2. 生配信特有の注意点
    ・配信直後はYouTube側で処理が行われており、反映まで最大24時間程度かかることがある。
    ・12時間を超える長時間配信の場合、機能が制限される場合がある。
  3. その他のチェック項目
    ・自動チャプターの干渉
    ・不適切なコンテンツによる無効化

ユーザー:特にどの問題もないのにできない

AI:基本的なルールをすべて守っていても反映されない場合、以下の見落としやすい4つの原因が考えられます。

  1. 「機能の利用資格」が有効になっていない(電話番号認証など)
  2. 「自動チャプター」の設定と競合している(手動入力が無視されることがある)
  3. 表記のわずかなミス(タイムスタンプとタイトルの間に半角スペースがない、など)
  4. チャンネルのステータスによる制限(違反警告など)
    もしよろしければ、実際に概要欄に書いているタイムスタンプを数行分コピーして教えていただけますか?

ユーザー:
0:00 最初
54:30 ホラー開始
1:04:04 小屋を調べる
1:08:28 なぜかお皿を集める
1:10:08 ボール探し
1:17:38 パスワード1
1:24:22 ゴルフボール
1:36:18 ボルトカッター
1:44:42
1:46:24 しまっちゃう
1:47:12 レッドカードキー
1:49:15 ブルーカードキーの前に
1:50:33 コードが必要
1:57:40 コードのヒント
2:01:27
2:03:09
2:06:17 出れない
2:06:28 フォークリフト
2:08:32
2:11:07 もう飽きちゃった
2:12:59 なぜかチョコバー探し
2:16:15 人がいる
2:17:41 9359
2:18:55 ラスト

AI:原因はほぼ間違いなく、「タイトルのない空の行」があることです。
YouTubeのチャプター機能は、タイムスタンプの横に必ず「タイトル(文字)」が必要です。空の行があると、システムが「記述ミス」と判断してチャプター全体を無効にしてしまいます。
修正が必要な箇所:1:44:42、2:01:27、2:03:09、2:08:32

ユーザー:空白の場所は重要で使いたい

AI:YouTubeの仕様上、タイムスタンプの右側に「何かしらの文字」がないとチャプターは100%機能しません。
もし、特定のシーンにタイトルを付けたくない(空白に見せたい)のであれば、以下の裏技を試してみてください。

  1. 「透明な文字」を入れる
  2. 「点(.)」や「記号」を入れる
  3. 「続き」や「(無題)」とする
    AIは「0:00 タイトル」というセットを探しているため、数字だけだと「ただのメモ」だと判断して機能をオフにしてしまいます。

ユーザー:_でもいいか

AI:はい、アンダーバー()でも大丈夫です!タイムスタンプの横に何かしら文字が入っていれば、YouTubeのシステムは認識してくれます。 「1:44:42 」のように、数字とアンダーバーの間に半角スペースを入れるとより確実です。

ユーザー:やってみよう

AI:ぜひ試してみてください!修正して保存した後、反映されるまで少しタイムラグがあるかもしれません。無事にチャプターが刻まれることを祈っています!

ユーザー:出来たよ!ありがとう

AI:よかったです!無事にシークバーが細かく刻まれましたね。「タイムスタンプの横は空欄にしない」というルールさえ守れば、今後はスムーズに設定できるはずです。

ユーザー:そうだね。自動チャプターは一回も機能しない

AI:自動チャプターが機能しない主な理由は以下の3つです。

  1. 動画の内容をAIが理解できていない(無言の時間が長い、BGMが大きすぎるなど)
  2. チャンネルのステータス(違反警告があるなど)
  3. 設定がオフになっている
    結論として、今回のように手動でタイムスタンプを書くのが一番確実です。

ユーザー:聞いておきます

AI:配信アーカイブをより良く残すための3つのコツをお伝えします。

  1. 「目次」という言葉を入れる(検索エンジンが認識しやすくなる)
  2. キーワードを盛り込む(検索されやすくなる)
  3. 固定コメントにも貼る(スマホ視聴者がアクセスしやすくなる)

ユーザー:エディタで動画の前後を変更したいと思っているができないか?

AI:結論から言うと、YouTube Studioの標準エディタでは「動画の前後(順番)を入れ替える」ことはできません。今のエディタでできるのは、あくまで「いらない部分をカット(削除)する」ことだけです。

ユーザー:聴いてみたい

AI:YouTubeエディタでカットする手順をまとめました。

  1. YouTube Studioの「エディタ」を開く
  2. 「カット」を選択し、消したい範囲を赤い枠で囲む
  3. 「保存」を押す
    注意点として、反映に時間がかかることや、カットした分だけ動画が短くなるため、手動で書いたチャプターの時間を修正する必要がある点に気をつけてください。

ユーザー:すでに分かっている内容だった。クリップで前後に動画を挿入できると聞いたが、それは機能していないようだが、どうですか?

AI:その情報は誤解、あるいは古い機能と混同されている可能性が高いです。
現在のYouTubeの仕様では、ブラウザ版エディタで「別の動画を前後にくっつける」「順番を入れ替える」ことはできません。「クリップ機能」は動画の一部を共有するためのもので、編集機能ではありません。

ユーザー:最初に目次やダイジェストを入れたい

AI:後から「新しい映像(ダイジェスト)」を冒頭に差し込むことは、現在の仕様では不可能です。
代替案:

  1. 概要欄の「0:00」をダイジェストにする(0:00 ダイジェスト、3:00 配信スタート、と書く)
  2. 「終了画面」や「カード」で別のダイジェスト動画へ誘導する
    配信後のアーカイブに対して映像データを付け足す機能はないため、チャプター名で誘導するのがベストです。

ユーザー:なるほど

AI:YouTubeのシステムは一度アップロードされた動画を入れ替えられない一発勝負の仕様なんです。タイトルを工夫したり、固定コメントに見どころリンクを貼るなどして視聴者を誘導してみてください。

ユーザー:チャプターの話に戻るが最初を00:00:00 タイトルでも構わないか?

AI:はい、「00:00:00 タイトル」という形式でも全く問題ありません!システムは「0秒から始まっていること」さえ認識できれば処理してくれます。

ユーザー:最初そうしていたのだけど、00:00じゃないとダメという記事があったので、全部面倒だけどやり替えたんだよ

AI:それは大変な手間でしたね……!「0:00でないとダメ」というのは「0秒から始めてください」という意味の誤解だと思われます。「0:00」形式でも「0:00:00」形式でも、どちらでも100%機能します。1時間を超える配信なら「時:分:秒」で統一したほうが分かりやすいので、むしろおすすめです。

ユーザー:詳しくて助かったよ

AI:お役に立てて何よりです!今回の件で「空行NG」という一番重要なコツを掴めたのは大きな一歩だと思います。

ユーザー:一旦これ以上は別なことをします。今回は満足した

AI:それはよかったです!また何か行き詰まったら、いつでも気軽に話しかけてくださいね。それでは、次の作業もスムーズに進みますように!

ブレインロットどろぼうされた履歴

ドラゴン 防御 #750
ヤギ夫婦ドリーミー スキビディ変異付き
ネクストパルサー リーガルさんのゴジラアクア、ダークネス1300M自分のピーピーアカバエム220M #729
PlasticBird1275  147大砲 #719 フーガさんがハジさんに盗まれたトキシックヤギ夫婦700M #716 aren y 返却済み しゅうま社長さんのリア友 ゴジラノーマル PlasticBird1275  124M  #691 X_lixy くんさんのサンタ #680 ひなた270909 くんさんのラグランデ15M #680
rururuさん しゅうま社長さんのケパット未遂 #673
ZvZさん fitironさんのストロベリー未遂 #673
井上さん容疑 ヒオナリさんのチンパンジーキングダイヤ31.5M #670 返却報告 #673
しげっぺ カーニバルケッチュール12M あおみっくとさんの
NullBaffalo1299 レジェくんバキュンバキュンりく 
レインボー電車3M泥棒 なちゅらび ラグランデ金泥棒 
OKOKさん被害 対面最強おさる ラグランテ金 6.25M泥棒
steep-musician7 ロストララレリタス泥棒
majin_boo0307 750K+200K泥棒