Davinci Resolve向けに無音カットしたタイムラインを作成する(Python, pydub)

black flat screen tv turned on displaying game その他

私はあまり動画編集はしないのでDavinci Resolveの無料版を使っています。動画編集に必要な機能は十分すぎるほどあるのですが、無音部分をカットする機能が無料版では使えなかったので、Pythonで無音カットしたタイムラインを作成するスクリプトを作りました。

Davinci Resolve とは

DaVinci Resolve(ダビンチ・リゾルブ)は、オーストラリアのBlackmagic Design社が開発・提供する、プロフェッショナル向けの統合型ポストプロダクションソフトウェアです。blackmagicdesign.com

このソフトウェアは、動画編集、カラーコレクション、ビジュアルエフェクト、モーショングラフィックス、音声編集など、多岐にわたる機能を一つのプラットフォームで提供しています。

もともとはカラーグレーディングツールとして映画やテレビ業界で使用されていましたが、現在では多機能な動画編集ソフトとして広く利用されています。ja.wikipedia.org

DaVinci Resolveには、無料版と有料版(DaVinci Resolve Studio)が存在します。無料版でも多くの高度な機能を利用できますが、有料版ではさらにAIベースのツールや4K以上の解像度対応など、追加の高度な機能が提供されています。

Davinci Resolve で無音カットをしたかったが…

Davinci Resolveで自動文字起こしをする画像

Davinci Resolveには文字起こし機能があり、その文字起こしされたテキストとタイミングを元に自動でカットする機能があるようです。

しかし、無料版ではこの機能が使えませんでした。

Davinci Resolve無料版では機能を制限されていることを示す画像

そうなると音声の波形情報を見ながら手動でカットしていくわけですが、自分のような面倒くさがりにはちょっと苦痛です。(有料版買えば良い話ですが)

そこでスクリプト等で無音部分を検知し、何らかの形式でDavinci Resolveに読み込ませることができないかと考えました。

pydubで無音部分を識別

pydubは、音声ファイルを扱うためのPythonライブラリです。pydubを使うと、音声ファイルの読み込み、再生、保存、音声の切り取り、音声の結合、音声の変換などが簡単に行えます。

その中には silence というモジュールがあり、無音部分を取り除くことが出来ます。

Python
sound = AudioSegment.from_file(filename)
nonsilent_clips = silence.detect_nonsilent(sound, silence_thresh=silence_thresh)

これを使ってツールを作成することにしました。

作成したツール

pydub で無音部分をカットし、XML形式のタイムラインとして出力するツールを作成しました。

セットアップ方法

1.リポジトリをクローン

PowerShell
git clone https://github.com/oaiwej/drnonsilentxml.git DRNonSilentXML
cd DRNonSilentXML

2.依存関係をインストール

PowerShell
py -3.11 -m venv venv
venv\Scripts\Activate.ps1
pip install -r requirements.txt

3.フォルダ直下に ffmpeg.exeffprobe.exe 配置するか、パスを通す

ビルド済みFFmpegの入手は下記のサイトなどで行ってください。

使い方

以下のようなコマンドを実行して、無音カット編集された XML タイムラインを生成します:

PowerShell
python -m drnonsilentxml -i "input.mp4" -if 60 -o "output.xml" -of 59.94 -t -40 -p 300
  • -i, --input
    • 入力動画ファイルのパス
    • サポート形式: MP4, MOV, MKV, AVI など pydub で音声抽出可能な動画形式
    • 例: -i "interview.mp4"
  • -if, --input-fps
    • 入力動画のフレームレート(フレーム/秒)
    • 例: -if 60
  • -o, --output
    • 出力 XML ファイルのパス
    • 例: -o "edited_timeline.xml"
  • -of, --output-fps
    • 出力タイムラインのフレームレート(フレーム/秒)
    • 例: -of 59.94
  • -t, --threshold (デフォルト: -40)
    • 無音検出のしきい値(dB)
    • 値を上げるほどより大きな音量でも無音として検出
      • 例: -t -30 (よりカットしたい場合、値を上げる)
      • 例: -t -45 (カットされすぎる場合、値を下げる)
  • -p, --padding (デフォルト: 300)
    • カットしたクリップの前後に追加する余白時間(ミリ秒)
    • 会話の言葉尻が途切れるような場合は長めにすると良いかも
    • 例: -p 500 (より長いパディングを設定: 500ms)

また、silence_cut_xml.bat に動画ファイルをドラッグアンドドロップ(複数可)することで簡単に実行できます。

作成されるXMLタイムラインの形式おそらくFinal Cut Pro 7の形式です。

Davinci Resolve での読み込み方法

1.先にinput.mp4にあたる元動画ファイルをDavinci Resolveのビンに追加しておいてください。

素材動画をDavinci Resolveのピンに追加する手順の画像

2.ファイル > 読み込み > タイムライン(またはCTRL+Shift+I)で生成された XML ファイルを読み込むと、無音カット編集が適用されたタイムラインがインポートされます。

XMLタイムラインを読み込む手順を示す画像

3.読み込まれたタイムラインの音声は何故かモノラルになってしまうので、ステレオにする場合は以下の手順を実行してください。

(1) タイムラインのクリップをすべて選択(CTRL+A

タイムライン上のクリップをすべて選択した時の画像

(2) クリップを右クリック > クリップ属性

クリップ属性を開く手順を説明する画像

(3) 音声タブ > フォーマットをStereoに変更し、OKボタンをクリック

音声をステレオに変更する手順を示す画像


実行結果のサンプル

ゲームのプレイ録画を無音カットし、タイムラインを読み込み、そのまま書き出した結果のサンプルです。

サンプル1:

アクションゲームの例として、ELDEN RING冒頭のプレイ録画を入力しました。

元動画 1m36s → 無音カット後 46s

フロムゲーはボス戦以外はBGMが静かなので、無音カットが効くかもしれません。

サンプル2:

会話パートの例として、ペルソナ5 ロイヤル冒頭の尋問シーンの録画を入力しました。

元動画 3m07s → 無音カット後 1m30s

会話の間が削除されています。ちょっとカクカクして不自然ですがトランジション等で誤魔化せば良いと思います。

おわりに

Davinci Resolveで読み込んでしまえば、あとはいくらでも編集できますね。

カットされすぎた場合でもタイムライン上で引き延ばせば復元できるので心配ありません。

また、フルボイスのゲームなどではあらかじめBGM音量を下げておくと会話に沿った無音カットがしやすくなります。

うまくカットできない場合は素材に合わせてフレームレートやしきい値、パディングを調整してみてください。

コメント

タイトルとURLをコピーしました