Pythonを使って2つのMP3ファイルを1つに連結するプログラムを紹介します。
このプログラムを作った経緯
MP3レコーダーで録音した音が電池がなくなって途中で切れてしまい、また途中から録音したので音源ファイルが2つに分かれてしまった。なんとかプログラミングで2つのMP3ファイルを1つにできないかと考えてPythonに行きついた。
事前準備
pydubライブラリのインストール
まず、pydubというライブラリをインストールします。
pip3 install pydub
または
pip install pydub
ちなみにわたしはこの準備だけでは動きませんでした。
ffmpeg.exeとffprobe.exeという2つの実行ファイルが必要でした。(Windows10環境の場合)
もし、pydubライブラリ使用時に実行エラーが出る場合は、以下の方法を試して下さい。
実行エラーが出る場合の対処
わたしは以下の実行エラーが出ました。
C:\Python37\lib\site-packages\pydub\utils.py:165: RuntimeWarning: Couldn’t find ffmpeg or avconv – defaulting to ffmpeg, but may not work
warn(“Couldn’t find ffmpeg or avconv – defaulting to ffmpeg, but may not work”, RuntimeWarning)
C:\Python37\lib\site-packages\pydub\utils.py:193: RuntimeWarning: Couldn’t find ffprobe or avprobe – defaulting to ffprobe, but may not work
warn(“Couldn’t find ffprobe or avprobe – defaulting to ffprobe, but may not work”, RuntimeWarning)
Traceback (most recent call last):
File “pydub_mp3plus.py”, line 5, in
sound1 = AudioSegment.from_file(“file1.MP3”, “mp3”)
File “C:\Python37\lib\site-packages\pydub\audio_segment.py”, line 665, in from_file
info = mediainfo_json(orig_file)
File “C:\Python37\lib\site-packages\pydub\utils.py”, line 263, in mediainfo_json
res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE)
File “C:\Python37\lib\subprocess.py”, line 769, in init
restore_signals, start_new_session)
File “C:\Python37\lib\subprocess.py”, line 1172, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
ffmpegとffprobeの2つの実行ファイルが見つからないよという意味だと思います。
2021.1.8管理人より
ffmpegのファイル構成が変わっているので最新情報は以下を参考にしてください。
以下からダウンロードします。
FFmpeg Builds – Builds – Zeranoe FFmpeg リンク切れ
上記サイトにアクセス後、Download Buildボタンをクリックします。
実行ファイルがzip形式でダウンロードされるので必ずウイルスチェックしてください。
解凍後にbinフォルダの中身を開きます。
必要なファイルは、ffmpeg.exeとffprobe.exeの2つです。
その他拡張子が~.dllのファイルも全て必要です。(2021.1.8追記)
以下で紹介するPythonプログラムと同じフォルダにこの2つのファイルをコピーしてください。
2つのMP3ファイルを連結するPythonコード
例として、audio1.mp3とaudio2.mp3の2つのファイルを連結してaudio.mp3を出力する場合です。
# -*- coding: utf-8 -*-
from pydub import AudioSegment
# MP3ファイルを読み込む
audio1 = AudioSegment.from_file("audio1.mp3", "mp3")
audio2 = AudioSegment.from_file("audio2.mp3", "mp3")
# MP3ファイルを連結する
audio = audio1 + audio2
# 1つのMP3ファイルにして保存
audio.export("audio.mp3", format="mp3")
わたしが試したのは、2つで7分ほどのMP3ファイルでしたが、15秒ほどで連結できました。
ちなみに連結したいファイルが2つである必要はなく、例えば3つならプログラムを次のように変更すればOKです。
# -*- coding: utf-8 -*-
from pydub import AudioSegment
# MP3ファイルを読み込む
audio1 = AudioSegment.from_file("audio1.mp3", "mp3")
audio2 = AudioSegment.from_file("audio2.mp3", "mp3")
audio3 = AudioSegment.from_file("audio3.mp3", "mp3")
# MP3ファイルを連結する
audio = audio1 + audio2 + audio3
# 1つのMP3ファイルにして保存
audio.export("audio.mp3", format="mp3")
読まなくてもいいあとがき
わたしの持っているオリンパスのMP3レコーダーはかなり古いが使い勝手が良いのでいまだに使っている。
USBメモリとしても使えるし、単純に連番でMP3ファイルとして保存される。最近の製品のように余計な機能が付いていないのが良い。
ただ、単4乾電池式で電池の残量表示が今一つはっきりしないのが難点だ。
先日も録音途中で切れてしまった。でも電池が切れる寸前までは残っているので、続きを録音した。
音源ファイルは当然2つに分かれてしまっている。なんとかできないかと考えてネット検索していたのだが、Flashを使っているサイトや変な日本語のサイトが多く、出来るなら使いたくない。
こうしたサイトはウイルス感染の危険が多いためだ。(広告も多いし間違って変なダウンロードボタンをクリックしてしまう危険性があるし)
どうせならプログラムで解決できるのではと考えて調べていたら、このPythonライブラリに行きついた。
Pythonって本当にいいですね!(淀川長治風に)
コメント