Python/MoviePyで静止画に音声を付けて動画を作成する

  • このエントリーをはてなブックマークに追加

wavやmp3といった音声ファイルを動画として公開したい時、Pythonの外部ライブラリであるMoviePyを使えばたった数行のコードで動画作成まで実現可能です。ここではサンプルファイルを使いながら、MoviePyを使った一連の画像、音声、動画処理方法を紹介します。

こんにちは。wat(@watlablog)です。ここではMoviePyの入門として静止画に音声をつけてみます

本記事のモチベーションと目標

X(旧Twitter)にwavファイルがアップロードできなかった

筆者はX(旧Twitter)でプログラミング学習関連のつぶやきをしています。ブログと同様にXも内容を「アウトプット」できるので、インプットばかりの学習と比べて効率が向上します。

最近はを扱うPythonコードに挑戦中ですが、wavファイルとして音声を作ってもXに載せられないということに気付きました。

2022年も暮れになりXはイーロン・マスクの話題で持ちきりですが、彼は多忙なのできっとwavファイルをポストする機能の実装にはもう少し時間がかかるでしょう。

そんなワケで、それまでは代替案でなんとかしようと考えたのがこの記事を執筆する理由です。

動画なら投稿できる

Xは昔から動画mp4mov等)であれば投稿できます。そのため単純に考えて、音声を動画に変換すれば投稿できます。

音声を動画に変換する方法はちょっと調べるとWebサービス等の方法があるようですが、どうせならPythonでやって記事数を稼ごうと技術を手中におさめておこうと思いこの記事を書きました。

目標は静止画1枚に音声を付けて動画にすること

今回の目的は音声をXに投稿することであるため、綺麗に動く多数のコマ画像は必要ありません。静止画1枚あれば事足ります。

そのため本ページでは「静止画1枚に音声ファイルをくっつけて動画にする」を目標とします。

ざっとやることをまとめると、以下のように適当な静止画を用意して…

背景画像

音声もwavファイルmp3ファイルでもOK)で用意して…

プログラムを実行すると以下の音声が鳴っている間に静止画が表示されるだけの動画を作成するというものです。

YouTubeにも投稿できましたね!

当ブログにおける動画編集は専らOpenCVを使っていましたが、今回はより動画編集用にパッケージングされたMoviePyというライブラリを使ってみます。

Python/MoviePyのコード例

動作環境

今回は動画のコーデック等も関係するので、こちらで確認したPC環境もセットで紹介します。

また、今回ご紹介するMoviePyは内部でNumpyOpenCVffmpegを使用します。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

どうしてもmacOSQuickTime Playerで音声が再生されなかったので、以下の情報を参照して解決しました。

jarib commented on Mar 10, 2015

This worked for me to get the file to play in Quicktime/iMovie:

clip.write_videofile(out_path,
codec='libx264',
audio_codec='aac',
temp_audiofile='temp-audio.m4a'
remove_temp=True )

https://github.com/Zulko/moviepy/issues/51

上記解決策のコメントに対して、「thanks jarib. you save my life :)」という回答が寄せられていましたが、同感。

全コード:コピペ利用可

以下に全コードを示します。今回はシンプルな内容なので、コード内コメント以上の詳細な説明は不要と思いました。

静止画と音声のパスを指定し、動画(mp4)のファイル名を設定して実行すると、自動的に音声の長さ分の動画が生成されます。

最近は関数群で処理をまとめておき、メイン文(if name == 'main':)でシーケンシャルに実行していくスタイルが汎用性あって個人的な流行りです。

作成された動画をTwitterに投稿してみた

コードを実行して得た動画でXにも無事音声付き動画を投稿することができました。目標達成。

その他便利技

X(旧Twitter)サイズの動画にする

Xには動画サイズを小さくしなければ投稿することができません。
ffmpegがインストールされている場合は、以下のコマンドでinput動画をサイズ変更したoutput動画に変換可能です。

まとめ

この記事では静止画と音声ファイルを用意するだけで、簡単に音声付き動画を作成する方法を紹介しました。

仕組みとしては、静止画の表示持続時間durationを音声の長さ分に設定してあげて、音声ファイルを設定するというだけのもの。

コード自体は簡単でしたが、コーデック関係と依存するのでもしかしたらハードウェアが変わった時に設定をいじる必要があるかも知れません。(この辺が動画とか音声処理のややこしいところかも?)

今回は無事に目的であるXへの音声情報投稿が達成できたのでよしとします。

MoviePyコードは動画処理の基本と考えられ、ちょい足しを続けていけばそれなりの動画編集が自動化できそうだと思いました。

やりたいことが思い立ってすぐできるとは…流石Pythonですね!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

SNSでもご購読できます。

コメントを残す

*