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 を文字化けした状態にすればいいですね!
テキストを文字化けに変える
まずこの文字化け何ぞや?と思って調べて見ると…
一個テキストのオブジェクトを配置するだけで4096字+αあるので、注意しないと簡単にこれが出る。(exoのテキストはUTF16LEの16進コード+全体で4096字になるように「0」をつけたものになっています)
— ナガレボシ (@07nagareboshi) October 28, 2017
ようやくAviutlにちゃんとexoファイル読み込めた!テキストの文字コードはUTF-16LE、改行は復帰文字つき、16進数で文字コードの出力した後0を埋めてAviutl本体のシステムの設定→出力時のファイル書き込み単位の欄の数字と同じ長さにすればよかったのね!苦労させやがって!
— 野乃小町 (@nonokomachi) November 27, 2016
さらにこんな記事も発見…
結論!手順はこうだ!!!
① text をUTF-16でエンコード
②①を16進数文字列に変換
③②の文字数が4096になるように0埋め
寝てる間に動画が完成!
このツールのおかげでかなり楽になりました~!
撮影が終わったらリラックスしたいので
録った動画の編集はツールにお任せ!!!
処理が終わるまでは
好きなギターを弾いたり♪
本を読んだりお昼寝したり♪
作業的にも気持ち的にも楽なりました~!