「音声ファイルを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を利用しています。
以上、システム要件の説明でした。
最後は、実際に音声を動画に変換していきましょう。
実際に音声を動画に変換
上記の動画は、以下のプログラムで作成した動画です。
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としても変換可能です。
以上、実際に音声を動画に変換するプログラムを説明しました。