1.解決したい課題
ライブ配信を分析する際、「沈黙の長さ」だけを指標にすると配信の本質を取り違える場合がある。沈黙には大きく 2 種類ある:
- ガン見系の沈黙: 配信者の話・展開に視聴者が集中して見入っており、コメントを書く余裕がない。直後に大きな反応が爆発する。
- 離脱系の沈黙: 視聴者が興味を失って配信から離れている。沈黙後も反応がない。
両者は「コメ無し」という見た目は同じだが、配信者にとって意味が真逆である。前者は配信者の腕を示すハイライト、後者は改善すべきポイント。沈黙そのものではなく、沈黙の「質」を判定する必要がある。
2.手法の概要
処理は 2 段階:
- 沈黙ゾーン検出: 連続するコメントの間隔(gap)を計算し、
thresholdMs(既定 60 秒)以上ならゾーンとして記録。 - 質判定: 沈黙終了時刻から
windowMs(例: 30 秒)以内のコメ数を数え、engaged(5 以上)/neutral(2-4)/departed(0-1)を割り当てる。
質判定は opt-in。opts.quality を渡さなければ 'unknown' 固定で純粋な沈黙検出のみ動作する。
3.アルゴリズム詳細
3-1. パラメータ
| パラメータ | 既定 | 意味 |
|---|---|---|
thresholdMs | 60_000 | 沈黙と見做す最小間隔 |
quality.windowMs | 0(質判定オフ) | 沈黙終了後の反応観測時間 |
3-2. ステップ
capturedAtが有効なコメントのみ抽出し昇順ソート(破壊しない)- i = 1 から末尾まで隣接ペア (prev, cur) の gap を計算
- gap < threshold なら次へ。gap ≥ threshold なら以下のゾーン情報を記録:
startAt= prev.capturedAtendAt= cur.capturedAtdurationMs= gapquality= 質判定の結果afterCount= 沈黙終了から windowMs 内のコメ数
- 質判定: windowMs > 0 なら、cur の時刻から windowMs 以内に含まれるコメ数を数えて分類
3-3. 質判定の閾値
- afterCount ≥ 5 → engaged(沈黙明けに反応が爆発 = 話芸が効いた)
- afterCount = 2 ~ 4 → neutral(普通の沈黙明け)
- afterCount ≤ 1 → departed(沈黙明けも反応なし)
4.参考実装(JavaScript / 純粋関数)
export function detectCommentSilenceZones(comments, opts = {}) {
const threshold = opts.thresholdMs > 0 ? opts.thresholdMs : 60_000;
const qualityWindowMs = opts.quality?.windowMs > 0
? opts.quality.windowMs : 0;
const valid = (comments || []).filter(c =>
c?.capturedAt > 0 && Number.isFinite(c.capturedAt)
).slice().sort((a, b) => a.capturedAt - b.capturedAt);
if (valid.length < 2) return [];
const zones = [];
for (let i = 1; i < valid.length; i++) {
const prev = valid[i - 1];
const cur = valid[i];
const gap = cur.capturedAt - prev.capturedAt;
if (gap < threshold) continue;
let quality = 'unknown';
let afterCount = 0;
if (qualityWindowMs > 0) {
const windowEnd = cur.capturedAt + qualityWindowMs;
for (let j = i; j < valid.length; j++) {
if (valid[j].capturedAt > windowEnd) break;
afterCount += 1;
}
if (afterCount >= 5) quality = 'engaged';
else if (afterCount <= 1) quality = 'departed';
else quality = 'neutral';
}
zones.push({
startAt: prev.capturedAt,
endAt: cur.capturedAt,
durationMs: gap,
quality, afterCount
});
}
return zones;
}
5.なぜこの設計なのか
5-1. なぜ「沈黙明けの反応コメ数」で判定するのか
沈黙そのものを観測しても "なぜ沈黙したか" は分からない。しかし沈黙の直後の反応には情報が宿る:
- 「うわぁ」「すごい」「やばい」が短時間に多発 → 視聴者は沈黙中ガン見していた
- 誰も何も書かない → 視聴者は離れていた
この事後情報を使うことで、沈黙の意味を遡って判定できる。
5-2. なぜ閾値が「5 コメ以上 / 0-1 コメ」なのか
20-30 秒の窓で 5 コメ以上は通常の倍以上のコメ速度であり、明らかに「反応爆発」と言える。0-1 コメは「事実上 0」で、ノイズコメ 1 件混じってもまだ離脱と見做せる。中間の 2-4 は判定保留(neutral)として誤分類リスクを避ける。これは経験則だが、複数配信での検証で誤分類が最小になる範囲。
5-3. なぜ既定 thresholdMs = 60 秒か
ニコ生・Twitch・YouTube Live 等の典型的な配信では、コメ速度は 20 ~ 200 CPM。60 秒以上のコメ無しは「明らかに何かが起きた」レベル。30 秒等にすると、通常の小さな間でも検出されてノイズが増える。
5-4. なぜ質判定を opt-in にするのか
用途によっては「沈黙ゾーンの場所」だけ知りたく、質判定は別ロジックでやりたいケースがある。opts.quality を渡したときだけ働く設計にすることで、シンプルな用途と高度な用途の両方に対応できる。
6.既知の限界と拡張可能性
- 沈黙明けの反応が遅延する場合: 視聴者の入力に時間が掛かる場合、windowMs を短くしすぎると engaged を取り逃す。
- 配信全体のコメ速度に依存しない閾値: 元々コメ速度の遅い配信では「5 コメ以上」が出にくく、engaged を過小検出する。改善: 配信全体の平均 CPM に対する相対閾値。
- 拡張: 沈黙ゾーンの長さ別の質統計(短い沈黙ほど engaged 率が高い等)を可視化。
- 拡張: 沈黙の5 ~ 10 秒前のコメ内容を保持し、「何が引き金で沈黙が起きたか」を遡って分析。
7.関連する既知技術(先行技術)
7-1. Audio Silence Detection
音声処理における無音区間検出(VAD: Voice Activity Detection)。本手法はテキスト時系列での類似処理。
7-2. Engagement Metrics in Streaming
YouTube / Twitch のエンゲージメント指標は「コメント数」「いいね数」等の単純カウントが中心で、「沈黙の質」を区別する指標は稀である。
7-3. Sentiment Analysis
個別コメントの感情分析は広く研究されているが、本手法は沈黙という "コメントが無い状態" を分析対象とする点が独特。
8.本記事の位置づけ・ライセンス
本記事は、Chrome 拡張機能『君斗りんくの追憶のきらめき』内で 2026 年 4 月 30 日(バージョン 0.1.22)に投入された commentSilenceZones.js モジュールの設計思想と実装を、2026 年 5 月 1 日付で公開するものである。
参考実装は MIT、本記事文章は CC BY 4.0。
https://tsuioku-no-kirameki.com/articles/comment-silence-zones.html