
2026/03/13 15:18
クローム拡張機能は、話者のスピードに応じて動画再生速度を自動調整します。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
機能概要
このChrome拡張機能は、話者の音節レートを推定して動画再生速度を自動的に正規化します。最大要素から<video>でオーディオを取得し、Web Audio API グラフ(300–3000 Hz バンドパスフィルタ、約33 Hzでポーリングされる AnalyserNode)を通じて処理します。その後、エネルギー包絡モジュレーション解析を用いて4秒のスライディングウィンドウ内で1秒あたりの音節数をカウントします。captureStream()動作原理
検出された音節レートはターゲット再生速度にマッピングされます(とminSpeedの間にクリップ)。非常に速い話者では約1.12×、極端に遅い話者では最大3.5×までのデフォルトマッピングが使用されます。指数移動平均スムージング(α≈0.25)で変化を滑らかにし、連続した静寂時間が ≥3 秒になると速度は徐々に1×へ戻ります。maxSpeedインストールと UI
から未圧縮拡張機能を読み込むことでインストールします。設定はchrome://extensionsに保存されます。診断オーバーレイには現在の速度、自然な音節レート、静寂状態、リアルタイムエネルギーバー、および速度へのマッピング履歴が表示されます。chrome.storage.local既知の制限と今後の課題
DRM 保護されたコンテンツはをブロックします。音楽や効果音は誤ったカウントを引き起こす可能性があります。複数話者は合算され、SPA ナビゲーションでは短時間のギャップが発生する場合があります。計画中の改善点には、Silero VAD を用いた音声活動検出、相関解析によるより正確なレート推定、話者別のデアライゼーション、およびキーボードショートカットでの切替が含まれます。拡張機能は MIT ライセンスです。captureStream()
要約(元の文言を好む場合)
この記事では、動画再生速度を話者の音節レートに合わせて自動的に調整し、一貫した再生速度を保つChrome拡張機能について説明しています。 ...
(オリジナルの要約は有効ですが、上記の欠落情報で補完できます。)
本文
Chrome拡張 – 動的動画再生速度調整
ページ上の全ての話者が快適に聞けるよう、(≈ 9音節/秒)に合わせて動画の再生速度を自動で調整する Chrome 拡張機能です。
スロートークは速めに、ファストトークはゆっくりに設定し、急速なパッセージでも可聴性を損なわずに動画コンテンツの消費速度を上げます。
動作概要
音声取得
拡張機能のコンテントスクリプトは次の手順で音声を取り込みます:
- ページ内で最大サイズの
要素を検索します。<video>
を呼び出し、通常再生を妨げずにHTMLMediaElement.captureStream()
を取得します。MediaStream- そのストリームを Web‑Audio グラフへ送ります:
video.captureStream() → MediaStreamSource → BiquadFilter (highpass 300 Hz) → BiquadFilter (lowpass 3000 Hz) → AnalyserNode (約33 Hzでポーリング)
バンドパスは母音フォルマント領域(300–3000 Hz)を切り離し、音節エネルギーが集中する帯域を抽出します。
音節率検知
3 通りのアルゴリズムを試行しました。現在採用しているバージョン(v3)は エネルギー包絡調整解析 です:
- 2048 サンプルウィンドウ(約21 ms、96 kHz)で RMS エネルギーを計算します。
- 最初の一次 IIR ローパス (
) で包絡線を平滑化し、無音検出に使用します。α = 0.3 - 原始 RMS をハイパスフィルタして、音節率(≈ 2–10 Hz)だけを残します:
filtered[n] = α * (filtered[n-1] + rms[n] - rms[n-1]) // α = 0.9
の正方向ゼロ交差数をカウント。filtered- 交差間の最小インターバルを 70 ms に制限 → 最大検出可能率 ≈ 14音節/秒。
- スライディングウィンドウ(デフォルト 4000 ms)で 1 秒あたりの交差数から音節率を算出。
再生速度マッピング
検出した音節率は再生速度へ変換されます:
naturalRate = measuredRate / currentPlaybackSpeed targetSpeed = targetSyllableRate / naturalRate targetSpeed = clamp(targetSpeed, minSpeed, maxSpeed) currentSpeed += smoothingAlpha * (targetSpeed - currentSpeed)
measuredRate / currentPlaybackSpeed は captureStream() が実際の再生速度を反映しているために必要です。デフォルトターゲットは 9音節/秒 です。
| 話者ペース | 自然率 | 再生速度 |
|---|---|---|
| 非常に遅い | ~2.5 syl/s | 3.50×(上限) |
| 遅め | ~3.0 syl/s | 3.00× |
| 普通 | ~4.5 syl/s | 2.00× |
| 速め | ~6.0 syl/s | 1.50× |
| 非常に速い | ~8.0 syl/s | 1.12× |
無音が 3 秒 を超えると速度は 1× に戻ります。
スムージング
指数移動平均(
α = 0.25、約33 Hz 更新)で時間定数 ≈ 1 秒を実現。話者の変化には十分速く、短い停止時に振れが生じないように設計されています。
インストール手順
- リポジトリをクローンまたはダウンロードします。
を開き Developer mode を有効化。chrome://extensions- Load unpacked →
ディレクトリを選択。speech-speed - 動画があるページへ移動し、拡張アイコンをクリックして ON に切り替えます。
ファイル構成
| ファイル | 用途 |
|---|---|
| 拡張機能設定(Manifest V3) |
| 音声取得、音節検知、速度制御、診断オーバーレイのコアロジック |
| ポップアップ UI:トグルと設定スライダー |
| v2 のレガシー AudioWorklet(未使用) |
設定
ポップアップには 3 本のスライダーがあります:
- ターゲット率 – 4 – 14音節/秒、デフォルト 9。
- 最小速度 – 1 – 2×、デフォルト 1.0。
- 最大速度 – 1.5 – 5×、デフォルト 3.5。
設定は
chrome.storage.local に永続化されます。
診断オーバーレイ
有効にすると右上にダークパネルが表示されます:
- Speed(大きな緑色の数値) – 現在の倍率。
- syl/s(大きな青色の数値) – 推定自然音節率。
- State – SPEAKING か SILENCE とその持続時間。
- Energy bar – リアルタイム音量レベル。
- History log – 秒ごとの速度と音節率のマッピング(最新が太字)。
- Stats – ゼロ交差数、ポーリング回数、パイプライン段階。
チューニングガイド
すべての調整可能パラメータは
content.js にあります。
検知パラメータ
| パラメータ | デフォルト | 役割 | 調整方法 |
|---|---|---|---|
| 0.9 | ハイパス係数 – カットオフを下げると低周波モジュレーションが多く通過。 | 音楽/環境音が誤検出する場合は 0.8 に、非常に遅い話者(< 2 syl/s)では 0.95 に。 |
| 70 ms | 音節とみなす最小時間間隔。 | 音楽で誤カウントする場合は 100 ms、速い話者(>10 syl/s)の過少検出なら 50 ms に。 |
| 0.003 | 無音ゲートのエネルギーフロア。 | 背景ノイズが誤検出する場合は上げる、静かな話し声が逃す場合は下げる(「Energy」表示を確認)。 |
| 0.3 | 包絡線平滑化係数。 | 変更頻度は低い。大きくすると無音検出が速くなる、逆に遅くなる。 |
| 4000 ms | 音節率計算のスライディングウィンドウ。 | 短め(2000 ms)で応答性を上げるとノイズ増大、長め(6000 ms)は滑らかだが遅延。 |
速度制御パラメータ
| パラメータ | デフォルト | 役割 | 調整方法 |
|---|---|---|---|
| 9 syl/s | 目標音節率。 | 主な操作:7=中程度、9=積極的、12=非常に積極的。 |
| 0.25 | スピード変化のEMA係数。 | 低め(0.1)で遅い切り替え、高め(0.4)で速くても振れが増える。 |
| 3 s | 無音時に 1× に戻るまでの秒数。 | 自然な休止中に速度リセットされるなら上げ、停止後長時間残るなら下げる。 |
| 1.0 / 3.5 | 再生速度のクリップ範囲。 | タレントが 4×以上耐えられる場合は上げ、2×程度で止めたい場合は下げる。 |
バンドパスフィルタ
- Highpass:300 Hz → 400–500 Hz に上げてベースノイズを減少させる。
- Lowpass:3000 Hz → 4000 Hz で高音域話者に対応、2500 Hz 以下に下げると「s」「sh」のようなシビランが音節として数えられなくなる。
ポーリングレート
setupAudio() の setInterval は約30 ms(≈33 Hz)で実行。
- 50 ms にすると CPU 消費は抑えられるが最大検出率が低下。
- 15 ms に上げても実質的なメリットはほぼない。
現在の制約
| 問題 | 影響 |
|---|---|
| DRM 保護コンテンツ(Netflix, Disney+ 等) | がブロックされ、拡張機能が動作しません。 |
| 音楽・効果音 | ビートを音節と誤認する可能性があります。バンドパスフィルタと無音ゲーティングである程度対策しますが完璧ではありません。VAD(Voice Activity Detection)モデルの導入で改善できるでしょう。 |
| 同時に複数話者 | 全体の率を合算してしまい、個別調整は難しいです。 |
| 背景音楽の多いポッドキャスト | 音節率検出が不正確になります。 |
| SPA ナビゲーション(YouTube 等) | ページ遷移時に 1–2 秒程度のギャップが生じ、拡張機能が再接続されます。 |
今後の改善案
- Silero VAD 統合:音声活動を確認して検出器をゲートし、音楽や環境ノイズによる誤検出を減らします。
- 自己相関ベースの率推定:ゼロ交差ではなく主なモジュレーション周波数を直接算出すると、より滑らかな推定が可能です。
- 話者別適応:ディアリゼーションで個々の話者の率を保持し、活発な話者に即座に速度を切り替えます。
- キーボードショートカット:
を利用してポップアップを開かずに ON/OFF 切替できます。chrome.commands
ライセンス
MIT です。