音声分析ド素人が逆位相ミュージックを聞いたら、そこに訪れたのは混乱とそして静寂だった


音声分析のプログラミングに興味があったものの書いたことがないのでやってみました。

ド素人ですが、以下のことは知ってるので、音楽を逆位相にしたらどうなるかを聞いてみたくてやってみました。

  • 音は波である
  • 位相を反転して合成すると打ち消し合う

最初Goで書こうと思いましたが、いい感じのパッケージがないので諦めました。
٩(๑òωó๑)۶いつか書いてやんよ

pythonで pydub というやりたいことが全部入りな感じのライブラリがあったのでこれを使用しました。
さすがPython。
分析系はお強いですね

実際に書いてみた

バンバンバンバンバンバンバン
バン     バンバンバン
バン (∩`・ω・) バンバン
 _/_ミつ/ ̄ ̄ ̄/
   \/___/ ̄ ̄

準備

# pydubで使っているようなので
brew install ffmpeg

pip install pydub

# 波形をプロットするのに使います
pip install matplotlib

利用したデータ
ショパン:ワルツ第6番 変ニ長調 Op.64-1 《子犬のワルツ》
http://classical-sound.seesaa.net/article/211557687.html
短い曲だったら何でも良かった

最初にやったこと

とりあえず当初の目的だった逆位相ミュージックを聞いてみました。

from pydub import AudioSegment
from pydub.playback import play

#Load an audio file
myAudioFile = "test.mp3"
sound1 = AudioSegment.from_mp3(myAudioFile)

# Invert phase of audio file
sound2 = sound1.invert_phase()

# play audio data
play(sound2)

( ゚д゚)ポカーン (listen now...)

\(^o^)/ ... 違いがよくわかんない!!
\(^o^)/ ... もしかして書き方が良くなかったのか!?

よくわからなかったので、波形をプロットしてみた

from pydub import AudioSegment
from pydub.playback import play
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")

#Load an audio file
myAudioFile = "test.mp3"
sound1 = AudioSegment.from_mp3(myAudioFile)

plot audio data
data = np.array(sound1.get_array_of_samples())
x = data[::sound1.channels]
plt.plot(x[::100000])
plt.grid()
plt.show()

# Invert phase of audio file
sound2 = sound1.invert_phase()

plot audio data
data = np.array(sound2.get_array_of_samples())
xr = data[::sound2.channels]
plt.plot(xr[::100000])
plt.grid()
plt.show()

入力したデータ

逆位相にしたもの

確かに位相が反転されてそうです。

本当に逆位相なのか?

それでも不安だったので、音楽データを合成してみました。
本当に逆位相なのであれば、入力した音楽データと逆位相にしたデータを合成すると無音になるはず!!

from pydub import AudioSegment
from pydub.playback import play

#Load an audio file
myAudioFile = "test.mp3"
sound1 = AudioSegment.from_mp3(myAudioFile)

# Invert phase of audio file
sound2 = sound1.invert_phase()

#Merge two audio files
combined = sound1.overlay(sound2)

# play audio data
play(combined)

あっ、 無音や!! Σ(゚□゚)

合成後のプロット結果

最終形態

from pydub import AudioSegment
from pydub.playback import play
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")

#Load an audio file
myAudioFile = "test.mp3"
sound1 = AudioSegment.from_mp3(myAudioFile)

plot audio data
data = np.array(sound1.get_array_of_samples())
x = data[::sound1.channels]
plt.plot(x[::100000])
plt.grid()
plt.show()

# play
play(sound1)

# Invert phase of audio file
sound2 = sound1.invert_phase()

plot audio data
data = np.array(sound2.get_array_of_samples())
xr = data[::sound2.channels]
plt.plot(xr[::100000])
plt.grid()
plt.show()

# play audio data
play(sound2)

# Export merged audio file
sound2.export("invert_phase.mp3", format="mp3")

#Merge two audio files
combined = sound1.overlay(sound2)

data = np.array(combined.get_array_of_samples())
xr = data[::combined.channels]
plt.plot(xr[::100000])
plt.grid()
plt.show()

# play audio data
play(combined)

# #Export merged audio file
combined.export("combined.mp3", format="mp3")

結論

なんか違和感があるものの、逆位相ミュージックは聞いただけでは違いがわかりませんでした。
もうちょっと勉強して出直します。
記事をなぞると再現できると思うので、興味のある方はやってみてください