16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Project 25Advent Calendar 2019

Day 5

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

Posted at

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

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

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

最初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()

入力したデータ
Figure_1.png

逆位相にしたもの
Figure_2.png

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

本当に逆位相なのか?

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

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)

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

合成後のプロット結果

Figure_3.png

最終形態

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")

結論

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

16
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?