pythonで逆位相音楽
はじめに
音楽を聴いている時にイヤフォンジャックを上手に半抜きにすると、伴奏だけが聞こえる現象があります。
イヤフォンジャックのR/Lチャンネルが接続、GNDが未接続状態になった時に、RもしくはLが逆位相になり※それぞれの音を打ち消し合うことで生じるらしいです。
※なぜ逆位相になるんでしょうか・・・?
逆位相で打ち消しあった音楽は、何時も聴いている音楽と全く違う雰囲気になり、味わい深いものになります。
今回は、pythonを用いてこの逆位相音楽をソフトウェア上で作ってみたいと思います。
逆位相音楽
音声信号は空気や水などの媒質中を伝搬する縦波です。
日頃聴いている音は、振幅、周期の異なる縦波が沢山合成する事で出来ています。
その様な信号をマイクで録音し時系列信号にした時、次のようになります。
この信号に対して、信号の上限を反転させた物を逆位相信号と呼びます。
音声信号は縦波なので、位相を反転させた所で聞こえ方は殆ど変わりません。
しかしながら、「逆位相の波をぶつけると0になる」という波の面白い性質を用いる事で面白い事が出来ます。
「逆位相の信号をぶつけると、同じ音が打ち消し合って聞こえなくなる」という性質が得られます。
これを普通のモノラル音楽に対して適用すると単なる無音になるだけなのですが、ステレオ音源で逆位相処理を行います。
前回の記事で左右のマイクの音の時間差を用いる事で立体音響を作れることを確認しました。
nsr-9.hatenablog.jp
ステレオ録音した際は、音源の位置によって左右のマイクに入る音に差が生まれます。
逆に位置によっては左右のマイクで同じ音が録音されることも有ります。
簡単に表現すると、「左右のマイクの中央に配置された音源は差が出ない」「それ以外の位置に配置された音源は差がでる」ということになります。
ここで、ステレオ音源のLとRで逆位相音楽を作ると次のように様になります。
青い部分がキャンセルされ、赤い部分がそのまま残るような音楽が作られます。
ここで一般的な楽曲の録音環境を考えてみると、メインボーカルを中央に配置すると思います。
これをさっきの図に照らし合わせると、ボーカルがキャンセルされ伴奏が取り出せる事が理解できます。
pythonで逆位相音楽
pydubを使うとあっという間に逆位相化する事が出来ます。
from pydub import AudioSegment #Load an audio file sound1 = AudioSegment.from_mp3("audio.mp3") # Invert phase of audio file sound2 = sound1.invert_phase() ch1_array = np.array(sound1.get_array_of_samples())[::2] ch2_array = np.array(sound2.get_array_of_samples())[1::2] # ステレオ音声に変換 song_st = np.zeros([ch1_array.size + ch2_array.size], dtype=np.int16) song_st[::2] = ch1_array song_st[1::2] = ch2_array # arrayからpydudへ変換 song_out = AudioSegment( song_st.tobytes(), sample_width=song.sample_width, frame_rate=song.frame_rate, channels=2, ) song_out.export("out.mp3", format="mp3")
実行結果
逆位相音楽を生成するに魔王魂様(以下魔王魂)の音源をお借りしました。
魔王魂 | 無料で使える森田交一の音楽
魔王魂は、非常におおらかなライセンスで魅力的な楽曲を公開して頂いている素晴らしいサイトです。
今回は魔王魂で公開されている「UNiVERSE」というボーカル曲を使用します。
UNiVERSE | 公式歌詞 & 音源無料ダウンロード 魔王魂
まずは、通常のUNiVERSEです。サビの部分だけピックアップしました。
フリーで公開していることが信じられないくらいのクオリティですね。
次に逆位相で伴奏を抽出したUNiVERSEです。
オリジナルと異なったテイストになりましたね。
メインボーカルの音量が減衰することで、ハモり?の部分がよく聞こえるようになりました。
おわりに
pythonで逆位相音楽を生成できるようになりました。
逆位相音楽は楽曲データから伴奏部分を強調されているので、普段聴いている自分の好きな音楽の違った側面を楽しむことが出来ます。
今まで聴いていた音楽に適用し楽しみたいと思います。