ポッドキャスト音声編集を楽にした〜い
動機
もっと楽にポッドキャストの音声編集がした~い!!
ということで、音声編集のプロセスを以下のように自動化してみました。
ただし各ポッドキャスト番組の構成や音作りに応じて必要とされる音声処理のプロセスおよびツールは変わってくると思うのであくまで特定のフォーマットのポッドキャスト番組の音声編集の手順を自動化するという点に重きを置いてプロセスを作ってみたもののうちの一つであるというご理解の上で見ていただければと思います。
結果
下記 Ep. 102-1 は今回の自動化した手順で作った音源をリリースしました!
そこまで不自然な編集には感じないのではないでしょうか???(ご一聴あれ)
ここでのポッドキャストの音声編集とは
自動化の手順を紹介する前に想定しているポッドキャストの形式を紹介します。
ここでのポッドキャストとはホスト1人とゲスト1人以上で話す形式のポッドキャストとします。つまり1人ポッドキャストは除きます。音源データとしては2つ以上存在するものとします(但し、以下の手順では2音源とします)。
そしてポッドキャストの音声編集とは、2つ以上の音源データについて音圧調整やノイズ除去、無音部分の削除などを施し、その後オープニングやエンディング、背景BGMをオーバーレイし、データ圧縮のため mp3 で書き出す一連の手順のことを指すものとします。
以下ではそのポッドキャストの音声編集の自動化の具体的な手順を紹介します。
手順
1. ゲストとホストの音の大きさを揃える
オンラインで収録する場合、マイクやオーディオインターフェース等が話者ごとに異なるため往々にしてゲストとホストの音の大きさが揃っていないケースが存在します。
そのためまず2つの音源 audio1.wav, audio2.wav の音の大きさを揃えるところから始めます。
方法としては Python の pydub というパッケージを用いて以下のスクリプトを実行して音の大きさを揃えます。
from pydub import AudioSegment
import numpy as np
def adjust_volume_to_match(file_path1, file_path2, output_path):
# WAVファイルを読み込みます
audio1 = AudioSegment.from_file(file_path1)
audio2 = AudioSegment.from_file(file_path2)
# 平均音圧(RMS)を計算します
rms1 = audio1.rms
rms2 = audio2.rms
# 調整係数を計算します
adjustment_factor = rms1 / rms2
# 音量を調整します
adjusted_audio2 = audio2 + (20 * np.log10(adjustment_factor))
# audio1 に adjusted_audio2 をオーバーレイします
adjusted_audio2 = audio1.overlay(adjusted_audio2)
# 新しいWAVファイルとして保存します
adjusted_audio2.export(output_path, format="wav")
if __name__ == "__main__":
file_path1 = "audio1.wav" # 1つ目のWAVファイルのパスを指定してください
file_path2 = "audio2.wav" # 2つ目のWAVファイルのパスを指定してください
output_path = "adjusted_audio.wav" # 調整されたWAVファイルの保存先を指定してください
adjust_volume_to_match(file_path1, file_path2, output_path)
上記 Python スクリプト("adjust_volume.py")実行コマンドは下記です。
python adjust_volume.py
正しく実行されると "audio1.wav", "audio2.wav" の2つの音源の音の大きさを揃った状態でオーバーレイした音源 "adjusted_audio.wav" が1つのファイルとして出力されます。
2. ノイズ除去・無音部分の削除・音圧調整の実行
次に 1. の "adjusted_audio.wav" に対して Audacity のマクロ機能を用いて音声編集処理をかけていきます。
音声編集処理はそれぞれ専用のツールを使います。事前に下記ツールが インストールされ Audacity のエフェクトとして利用可能な状態になっているものとします。
ノイズ除去:ClarityVx, iZotope RX(Mouse De-Click)
無音の削除:Audacity の標準機能
音圧調整等:iZotope Ozone
Audacity のマクロではそれぞれ下記のような順番で処理を実施していきます。
マクロを実行すると "adjusted_audio.wav" が Audacity に読み込まれ、適宜ノイズ除去・無音部分の削除・音圧調整等の処理が走り、終わったら "audio_org.wav" という名前のファイルに書き出されます。
Import2:Filename="C:\\Users\\xxxx\\work\\audacity\\adjusted_audio.wav"
SelectTracks:Mode="Set" Track="0" TrackCount="1"
ClarityVxMono:Use_Preset="<Current Settings>"
TruncateSilence:Action="Truncate Detected Silence" Compress="50" Independent="0" Minimum="0.25" Threshold="-25" Truncate="0.3"
Ozone10:Use_Preset="<Current Settings>"
Rx7MouthDe-click:Use_Preset="<Current Settings>"
Export2:Filename="C:\\Users\\xxxx\\work\\audacity\\audio_org.wav" NumChannels="1"
3. オープニング・エンディング・背景BGMのオーバーレイおよび mp3 の書き出し
オープニング・エンディング・背景BGMのオーバーレイおよび mp3 の書き出しも 1. と同じように Python の pydub を用いて下記スクリプトで編集します。
事前に用意した音源は下記5つ。下記を元に適宜おのおのの番組のフォーマットに応じてカスタマイズすることも可能です。
2. の結果: "audio_org.wav"
オープニングBGM:"opening.wav"
背景BGM: "background.wav"
エンディング: "ending.wav"
最後のアナウンス等の定番ボイス音源: "last.wav"
from pydub import AudioSegment
def overlay_background_music(input_audio_path, opening_bgm_path, background_bgm_path, ending_bgm_path, output_path):
# 入力音声ファイルを読み込みます
input_audio = AudioSegment.from_file(input_audio_path)
# 最後のボイスファイルを読み込みます
last_voice = AudioSegment.from_file(last_voice_path)
input_audio = input_audio + last_voice
# オープニングBGMを読み込みます
opening_bgm = AudioSegment.from_file(opening_bgm_path)
# 背景BGMを読み込みます
background_bgm = AudioSegment.from_file(background_bgm_path)
# エンディングBGMを読み込みます
ending_bgm = AudioSegment.from_file(ending_bgm_path)
# 背景BGMを入力音声の長さに合わせてループ再生します
background_bgm_all = background_bgm * ((len(input_audio) // len(background_bgm)) + 1)
background_bgm_all = background_bgm_all[:len(input_audio)-30000]
bgm = background_bgm_all + ending_bgm.fade_out(30000)
# BGMを入力音声にオーバーレイします
audio_with_bgm = bgm.overlay(input_audio)
# オープニングBGMを最初に追加します
audio_with_bgm = opening_bgm + audio_with_bgm
# 出力音声を保存します
audio_with_bgm.export(output_path, format="mp3", bitrate="96k")
if __name__ == "__main__":
input_audio_path = "audio_org.wav" # 入力音声ファイル(audio_org.wav)のパスを指定してください
last_voice_path = "last.wav"
opening_bgm_path = "opening.wav"
background_bgm_path = "background.wav"
ending_bgm_path = "ending.wav"
output_path = "audio_with_bgm.mp3" # 出力ファイルの保存先を指定してください
overlay_background_music(input_audio_path, opening_bgm_path, background_bgm_path, ending_bgm_path, output_path)
上記 Python スクリプト("audio_with_bgm.py")実行コマンドは下記です。
python audio_with_bgm.py
正しく実行されると "audio_with_bgm.mp3" というファイルが出力されます。
4. ポッドキャストのリリース
あとは上記 mp3 ファイルをエピソード番号等に名前を変更し、Spotify for Podcasters のようなポッドキャストプラットフォームにアップロードしリリースします。
おわり
ポッドキャスト音声編集の自動化は、最初に挙げたもっと楽した〜い!!という点以外に次のようなメリットも考えられます。
ポッドキャスト配信者の体力や時間の負担が減るためこれまでより安定してリリースできるようになる
マニュアル操作を挟まないため音声編集のクオリティを一貫したものにでき、音声編集した結果のクオリティに再現性を持たせることができる
編集自体のコストが下がるのでリリースまでに聴き直す時間が増えポッドキャストのコンテンツの魅せ方(どの部分をショートとして切り抜こうかなど)により集中できるようになる
職人的にコツコツ手動で音声編集していく作業が好きな方にはあまり受け入れにくいアプローチかもしれないが、じぶんはポッドキャストの音声編集にそこまでこだわりがないので今回のような自動化を実際にやってみて意外と悪くないという印象を持ちました。
宣伝
ポッドキャストの最新話 Ep.102-1 をリリースしたので聴いてみてください~✋(宣伝)内容はムートくんと絵本や児童文学の話をした回になります。