【Python】YouTubeにアップロードするために音声を動画に変換する | ジコログ

【Python】YouTubeにアップロードするために音声を動画に変換する

【Python】YouTubeにアップロードするために音声を動画に変換する プログラミング

「音声ファイルをYouTubeにアップロードする」

実は、これはできません。
YouTubeは動画投稿サイトです。

したがって、音声のみを投稿できません。
では、どうすればいいのでしょうか?

答えは、音声を動画に変換します。
正確には、音声を含んだ動画を作成するのです。

この記事では、その方法を解説します。
タイトルにあるように、Pythonを用いた方法です。

本記事の内容

  • Pythonを使う理由
  • 音声を動画に変換する仕様
  • システム要件
  • 実際に音声を動画に変換

それでは、上記に沿って解説していきます。

Pythonを使う理由

結論から言うと、最も安全で手間がかからないからです。
あとは、無料というところですね。

音声をYouTube用の動画に変換する方法は複数あります。
調べた限りでは、以下に分類できます。

  • Webサービスの利用
  • ソフト(インストール前提)の利用

Webサービスは、会員登録必須のところが多いです。
この時点で胡散臭さを感じてしまいます。
できる限りで個人情報は出したくありません。

それにWebサービスは、サーバーの状況次第では使い物にならない時があります。
よって、そもそも利用する候補にすら上がりません。

ソフトは、スマホ・PCと様々なモノがあります。
便利で使い勝手がよいなら、それを使うのもアリです。

ファイルを開いて、ドラッグして保存という流れが多いです。
これが面倒か言えば、それほどではないかもしれません。

でも、私には無駄な作業に感じてしまいます。
そもそも、ソフトを起動するのが重くて嫌いなんですよね。

だったら、自分で作ろうということです。
Pythonには多くのライブラリが用意されているので、簡単に作れます。
これが、Pythonを使う理由になります。

以上、Pythonを使う理由を説明しました。
次は、音声を動画に変換する仕様について説明します。

音声を動画に変換する仕様

まずは、必要なモノを用意します。

  • 画像
  • 音声

次に、画像から無音の動画を作成します。
画像を音声の再生時間分だけループして表示し続ける動画です。

最後に、作成した無音動画と音声を結合します。
これでYouTubeにアップロード可能な動画が出来上がります。

仕様としては、非常にシンプルです。

以上、音声を動画に変換する仕様の説明でした。
次は、システム要件について説明します。

システム要件

プログラム言語は、Pythonを利用します。

OSは、どこでも動くはずです。
いわゆる、クロスプラットフォーム対応というヤツになります。

  • Windows
  • macOS
  • Linux

上記仕様を実現するためには、以下の3つが必要になります。

  • FFmpeg
  • ffmpeg-python
  • subprocess

それぞれを以下で説明します。

FFmpeg

動画処理では、もっとも有名なソフトウェアになります。
ソフトウェアと言っても、コマンドラインから利用するCUIです。

基本的には、プログラムから利用されるソフトと言えます。
今回もPythonから、このFFmpegを利用します。

Windowsにインストールする場合、以下の記事が参考になります。

macOSやLinuxでは、インストールが簡単過ぎるので割愛。
コマンドでインストールしたら、「はい終わり」状態です。

ffmpeg-python

PythonからFFmpegを扱うためのライブラリです。
インストールに関しては、次の記事でまとめています。

ただし、今回はメインでは利用しません。
メインとは、動画作成・変換における場面のことです。

では、どこで利用するのか?
それは、音声ファイルの再生時間を取得するところです。

ffprobeの機能をPythonで利用します。

subprocess

本当は使わない方がいいです。
仕方なくsubprocessを利用します。

subprocessについては、以下の記事をご覧ください。

FFmpegのコマンドをPythonから実行します。
その際に、subprocessを利用することになります。

本来は、ffmpeg-pythonだけで完結すればベストでした。
しかし、ffmpeg-pythonでは対応が無理な部分がありました。

詳細は省きますが、ffmpeg-pythonで作成した動画がYouTubeに拒否されるのです。
もっと調べれば可能になるかもしれません。

でも、そこまでffmpeg-pythonにこだわる必要はありません。
何より、代替手段があることに時間をかけて調べるのは時間の無駄です。

そこで、実績あるコマンドに頼る形になっています。

まとめ

ffmpeg-pythonとsubprocessを併用しています。

subprocessだけでも可能は可能です。
その場合、ffprobeの出力結果から再生時間を抽出するのが手間になります。

そこは便利なモノに頼ろうということで、ffmpeg-pythonを利用しています。

以上、システム要件の説明でした。
最後は、実際に音声を動画に変換していきましょう。

実際に音声を動画に変換

Pythonを使ってWAVをAVIに変換して、YouTubeにアップロードする

上記の動画は、以下のプログラムで作成した動画です。

import ffmpeg
import subprocess
from subprocess import PIPE

sound_path = "test.wav"
image_path = "test.jpg"
tmp_video_path = "image.avi"
output_video_path = "output.avi"

stream_info = ffmpeg.probe(sound_path)

if stream_info:
    # 再生時間取得
    duration = stream_info["streams"][0]["duration"]

    # 画像から動画を作成(再生時間ループする)
    cmd_1 = 'ffmpeg -y -f image2 -r 1 -loop 1 -t ' + duration + ' -i ' + image_path + ' ' + tmp_video_path
    sub_proc_1 = subprocess.run(cmd_1, shell=True, stdout=PIPE, stderr=PIPE, text=True)

    if sub_proc_1.returncode == 0:
        # 成功
        # 動画+音声の結合
        cmd_2 = 'ffmpeg -y -i ' + tmp_video_path + ' -i ' + sound_path + ' ' + output_video_path
        sub_proc_2 = subprocess.run(cmd_2, shell=True, stdout=PIPE, stderr=PIPE, text=True)

        if sub_proc_2.returncode == 0:
            # 成功
            print(output_video_path)

仕様やシステム要件を理解していれば、説明不要のコードとなっています。
ただ、次の変数だけは説明しておきます。

sound_path = "test.wav"
image_path = "test.jpg"
tmp_video_path = "image.avi"
output_video_path = "output.avi"

まとめると以下となります。

sound_path音声のパス
image_path画像のパス
tmp_video_path無音動画のパス
output_video_path音声+無音動画を結合した動画のパス

拡張子を変更しても動きます。
例えば、wavをmp3、aviをmp4としても変換可能です。

以上、実際に音声を動画に変換するプログラムを説明しました。

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