PythonでYouTube用動画のカットとテロップ挿入を自動化してみた!

YouTubeの動画制作されている皆さん!

動画編集めんどくさくないですか!?

特にこの2つ!

①動画の余計な部分をカットする作業
②テロップを挿入する作業

正直めんどくさくて嫌になってましたが
今回Pythonで全て自動化できたので少し解説していきます!

おすすめ
動画で見たい方はコチラ

簡単な設計

動画カットの設計

動画の不要部分として考えられるのは

①音が鳴っていない部分
②瞬間的に音が鳴っている部分

が考えられるので
これらの閾値を定義付けてカットするプログラムが必要!

テロップ挿入の設計

自分はAviUtlというソフトで動画編集をしているので
AviUtlで使えるテロップを作っていきます!

AviUtlの編集情報は
拡張子がEXOのファイルで作る事が出来ます!
※拡張編集で右クリック→ファイル→オブジェクトファイルのインポート/エクスポート

なので動画の音声をテキストに自動変換し
そのテキストを使ってテロップに出す形を
EXOファイルで作成するプログラムが必要!

動画カット

こちらの記事を参考にさせて頂きました!
動画の無音部分を自動でカットする
かなり助かりました!!!ありがとうございます!!!

音声ファイルを読み込む

あらかじめ動画と音声を別々に準備しておくと良いかも!
自分は撮影時に別撮りしてるのでこの感じでいきます!

dataには波形データが
samplerateには周波数が返ってきます!

無音部分を見つける

ほぼ参考記事を元に作らせて頂きました!
下記記事を参考くださいませ!
動画の無音部分を自動でカットする一定時間以上、小音量が続く箇所を探す

0.5秒(x)以上振幅(y)0.05以下になっている部分を
無音と定義して見つけます!

音が瞬間的に鳴っている部分を見つける

音が0.3秒未満続いてる箇所を
突発音と定義して見つけます!

残す部分を決める

list_cut に動画カット部分をリスト化できたので
逆にそれ以外の部分(残す部分)をリスト化する!
動画の無音部分を自動でカットするカットする箇所を反転させて、残す箇所を決める

残す部分を抽出して結合する

参考記事を元にさせて頂きましたが
自分はWindows環境VSCodeを使って実装し
最終的にはexeファイルにして使いたいので
以下のように書いてみました!

ffmpegコマンドを使って動画の残す部分を抽出してます!
そして最後ffmpegコマンドでそれらの動画を合体させてます!

合体させる際に直接動画パスを指定すると上手くいかないので
抽出した動画のパス一覧をテキストで生成させ読み込ませてます!

テロップ挿入

AviUtlのEXOファイルの中身を見てみよう!

拡張編集にて何かテキストを入れ
右クリック → ファイル → オブジェクトファイルのエクスポート
からこんな感じのファイルが出てくると思います!

この「text=」の右側の文字化けみたいな文字列
テロップ文になります!

なので
①動画から音声を抜き出す
②抜き出した音声をテキスト化する
③②のテキストを文字化け状態にしてEXOファイルを生成

という手順になりますね!

動画から音声を抜き出す

ここもffmpegコマンドを使って処理をします!

抜き出した音声をテキスト化する

自分はSpeechRecognitionという音声認識を使いました!

後はこの text を文字化けした状態にすればいいですね!

テキストを文字化けに変える

まずこの文字化け何ぞや?と思って調べて見ると…

さらにこんな記事も発見…

Aviutlで使える文字コードの話

結論!手順はこうだ!!!

① text をUTF-16でエンコード
②①を16進数文字列に変換
③②の文字数が4096になるように0埋め

これで EXOファイル内の text = の続きに result を出力させればOKですね!

寝てる間に動画が完成!

このツールのおかげでかなり楽になりました~!

撮影が終わったらリラックスしたいので
録った動画の編集はツールにお任せ!!!

処理が終わるまでは
好きなギターを弾いたり♪
を読んだりお昼寝したり♪

作業的にも気持ち的にも楽なりました~!