wavやmp3といった音声ファイルを動画として公開したい時、Pythonの外部ライブラリであるMoviePyを使えばたった数行のコードで動画作成まで実現可能です。ここではサンプルファイルを使いながら、MoviePyを使った一連の画像、音声、動画処理方法を紹介します。
こんにちは。wat(@watlablog)です。ここではMoviePyの入門として静止画に音声をつけてみます!
本記事のモチベーションと目標
X(旧Twitter)にwavファイルがアップロードできなかった
筆者はX(旧Twitter)でプログラミング学習関連のつぶやきをしています。ブログと同様にXも内容を「アウトプット」できるので、インプットばかりの学習と比べて効率が向上します。
最近は音を扱うPythonコードに挑戦中ですが、wavファイルとして音声を作ってもXに載せられないということに気付きました。
2022年も暮れになりXはイーロン・マスクの話題で持ちきりですが、彼は多忙なのできっとwavファイルをポストする機能の実装にはもう少し時間がかかるでしょう。
そんなワケで、それまでは代替案でなんとかしようと考えたのがこの記事を執筆する理由です。
動画なら投稿できる
Xは昔から動画(mp4やmov等)であれば投稿できます。そのため単純に考えて、音声を動画に変換すれば投稿できます。
音声を動画に変換する方法はちょっと調べるとWebサービス等の方法があるようですが、どうせならPythonでやって記事数を稼ごうと技術を手中におさめておこうと思いこの記事を書きました。
目標は静止画1枚に音声を付けて動画にすること
今回の目的は音声をXに投稿することであるため、綺麗に動く多数のコマ画像は必要ありません。静止画1枚あれば事足ります。
そのため本ページでは「静止画1枚に音声ファイルをくっつけて動画にする」を目標とします。
ざっとやることをまとめると、以下のように適当な静止画を用意して…
音声もwavファイル(mp3ファイルでもOK)で用意して…
プログラムを実行すると以下の音声が鳴っている間に静止画が表示されるだけの動画を作成するというものです。
YouTubeにも投稿できましたね!
当ブログにおける動画編集は専らOpenCVを使っていましたが、今回はより動画編集用にパッケージングされたMoviePyというライブラリを使ってみます。
Python/MoviePyのコード例
動作環境
今回は動画のコーデック等も関係するので、こちらで確認したPC環境もセットで紹介します。
また、今回ご紹介するMoviePyは内部でNumpy、OpenCV、ffmpegを使用します。ffmpegはすごく有名なソフトであり「ファイル変換はffmpegが本当に便利!Pythonでも使える」でも紹介しました。
Mac | OS | macOS Catalina 10.15.7 |
---|---|---|
CPU | 1.4[GHz] | |
メモリ | 8[GB] |
Python | Python 3.9.6 |
---|---|
PyCharm (IDE) | PyCharm CE 2020.1 |
Numpy | 1.21.1 |
opencv-python | 4.2.0.34 |
PySoundFile | 0.9.0.post1 |
moviepy | 1.0.3 |
ちなみにffmpegのバージョンは4.4が入っていました。
サンプルファイル
このページのコードを実行する際、読者が自分でファイルを用意しなくても良いように以下にサンプルファイルをダウンロード可能状態で置いておきます。
静止画:background.png
wavファイル:A5-SinglePeak.wav
MoviePyの使い方
やはり最初は1次情報を参照した方が良いです。まずは公式ドキュメントを見ましょう。
MoviePy公式:https://zulko.github.io/moviepy/index.html
筆者は主に音声を付ける段階で少し詰まりました。公式ページの音声に関するページは以下ですが…
MoviePy-audioclips:https://zulko.github.io/moviepy/getting_started/audioclips.html
どうしてもmacOSのQuickTime Playerで音声が再生されなかったので、以下の情報を参照して解決しました。
jarib commented on Mar 10, 2015
This worked for me to get the file to play in Quicktime/iMovie:
https://github.com/Zulko/moviepy/issues/51
clip.write_videofile(out_path,
codec='libx264',
audio_codec='aac',
temp_audiofile='temp-audio.m4a'
remove_temp=True )
上記解決策のコメントに対して、「thanks jarib. you save my life :)」という回答が寄せられていましたが、同感。
全コード:コピペ利用可
以下に全コードを示します。今回はシンプルな内容なので、コード内コメント以上の詳細な説明は不要と思いました。
静止画と音声のパスを指定し、動画(mp4)のファイル名を設定して実行すると、自動的に音声の長さ分の動画が生成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
from moviepy.editor import * def create_movie_with_sound(img_path, audio_path, movie_out_path): ''' 静止画のパスimg_pathと音声のパスaudio_pathから音声付き動画を作成する ''' # 静止画と音声を読み込み img_clip = ImageClip(img_path) audio_clip = AudioFileClip(audio_path) # 静止画を音声の長さだけ持続表示させることで動画に変換:img→video video_clip = img_clip.set_duration(audio_clip.duration) # 動画に音声をセット video_clip = video_clip.set_audio(audio_clip) # 動画を保存(Macで音声が再生できるように設定を細かく指定している) video_clip.write_videofile(movie_out_path, fps=30, codec='libx264', audio_codec='aac', temp_audiofile='temp-audio.m4a', remove_temp=True ) return if __name__ == '__main__': ''' メイン処理 ''' # ファイルパス img_path = 'background.png' audio_path = 'A5-SinglePeak.wav' movie_out_path = 'singleimg-wavsound.mp4' # 関数を実行して動画をつくる create_movie_with_sound(img_path, audio_path, movie_out_path) |
最近は関数群で処理をまとめておき、メイン文(if name == 'main':)でシーケンシャルに実行していくスタイルが汎用性あって個人的な流行りです。
作成された動画をTwitterに投稿してみた
コードを実行して得た動画でXにも無事音声付き動画を投稿することができました。目標達成。
その他便利技
X(旧Twitter)サイズの動画にする
Xには動画サイズを小さくしなければ投稿することができません。
ffmpegがインストールされている場合は、以下のコマンドでinput動画をサイズ変更したoutput動画に変換可能です。
1 |
ffmpeg -i input.mp4 -pix_fmt yuv420p -vcodec h264 -acodec aac -strict experimental output.mp4 |
まとめ
この記事では静止画と音声ファイルを用意するだけで、簡単に音声付き動画を作成する方法を紹介しました。
仕組みとしては、静止画の表示持続時間durationを音声の長さ分に設定してあげて、音声ファイルを設定するというだけのもの。
コード自体は簡単でしたが、コーデック関係と依存するのでもしかしたらハードウェアが変わった時に設定をいじる必要があるかも知れません。(この辺が動画とか音声処理のややこしいところかも?)
今回は無事に目的であるXへの音声情報投稿が達成できたのでよしとします。
本MoviePyコードは動画処理の基本と考えられ、ちょい足しを続けていけばそれなりの動画編集が自動化できそうだと思いました。
やりたいことが思い立ってすぐできるとは…流石Pythonですね!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!