Pythonでステレオ音源を作成する

Pythonでステレオ音源を作成する

自前のMacBook Air(2017年発売)OSを10.15(Catalina)に更新したら、Audacityが使えなくなってしまったので、仕方なくPythonで編集することにしたので、また同じようなことがあったとき用の備忘録的にここに記しておきます。

もしかしたら、「Pythonで音源を弄りたいなあ」と考えている人にもためになるかもしれないので、読んでみてください。

pydubを使う

今のところ(2019年12月2日現在)、Pythonでステレオ音源を作るにはこれしかなさそうですね。

というわけで、使ってゆきましょう。

まず、音源データを用意します。音源としてはモスキート音なので、再生には注意してください。タイトルは「input.wav」としています。

この音源をmatplotlibで図形として表示します。

プログラムと図形、コマンドラインの出力はこんな感じになりました。

from pydub import AudioSegment
import numpy as np
from matplotlib import pyplot as plt


wav = 'input.wav'
output = 'output.wav'
sound = AudioSegment.from_file(wav)
samples = np.array(sound.get_array_of_samples())

plt.plot(samples)
plt.show()

print(f'{sound.frame_rate=}, {sound.channels=}')
sound.frame_rate=44100, sound.channels=1

まあ、モスキート音なので、こんな感じになります。もっと良い感じの音だったら、複雑な波形になります。

この音のチャンネル数は1となっており、つまりモノラル音源となっています。

これを「左側斜め前からだけ」聞こえるようにしてゆきます。

left = (samples * 0.75).astype('int16')
right = (samples * 0.25).astype('int16')
samples = np.vstack([left, right]).T.reshape(-1)
test = AudioSegment(
    samples.astype("int16").tobytes(),
    sample_width=sound.sample_width,
    frame_rate=sound.frame_rate, 
    channels=2,
)

test.export(output, format='wav')

wavのステレオ音源、つまりチャンネル数が2の音源は、音源に関する値が「左、右、左、右……」のように保存されています。

さらに音の大きさによってこれらは決まっているため、Pythonのnumpyによる単純な計算によって左右で聞こえる音の大きさを指定することができます。

人間の耳は同じ種類の音が例えば「左からは大きく聞こえて、右からは小さく聞こえる」ときは「左寄りの方向から音が聞こえる」ようになるため、今回は、左に関する音には大きな値を、右に関する音には小さな値を掛けて保存します。

で、完成した音源がこちら(イヤホンやステレオスピーカーで聞いてください)

できた!

さいごに

昔は別のモジュールlibrosaとかpyaudioとかで書いたことはあったけど、Catalinaにしてからまともに動くプログラムが減ってしまったために、今回は仕方なくpydubを使ってみました。

結局仕方なくとか言っていますけど、私にとってはこれがいちばん使いやすいような気がしました。