2018/12/05(水) [n年前の日記]
#1 [python] Pythonでwavファイルに対して何か処理
wavファイルを何かしらを使って読み込んで1/60秒単位で分割、といった感じの処理をしてみたいなと。Pythonを使ってそういう処理はできないだろうか。
ググってみたら、どうやら Pydub なるモジュールがあるらしい。
_【Python/pydub】音声ファイル処理 | アルゴリズム雑記
_【Python】Pydubのインストール | アルゴリズム雑記
_[Python] PydubでAudioファイルを処理する - Qiita
_pydubを使って音楽を鳴らす - Python - TIL
なんだか簡単に使えそうなのでコレを使わせてもらおう…。環境はWindows10 x64 + Python 2.7.15。
ググってみたら、どうやら Pydub なるモジュールがあるらしい。
_【Python/pydub】音声ファイル処理 | アルゴリズム雑記
_【Python】Pydubのインストール | アルゴリズム雑記
_[Python] PydubでAudioファイルを処理する - Qiita
_pydubを使って音楽を鳴らす - Python - TIL
なんだか簡単に使えそうなのでコレを使わせてもらおう…。環境はWindows10 x64 + Python 2.7.15。
◎ Pydubのインストール。 :
インストールは pip で済んだ。ありがたや。
ffmpeg.exe も、Pythonスクリプトと同じ場所に一応コピーして置いておいた。
_Builds - Zeranoe FFmpeg
pip install pydub
ffmpeg.exe も、Pythonスクリプトと同じ場所に一応コピーして置いておいた。
_Builds - Zeranoe FFmpeg
◎ 読み込んで鳴らす。 :
解説ページを参考にして、wavファイルを読み込んで、情報を表示して、鳴らすスクリプトを書いた。
_read_and_play.py
_read_and_play.py
from pydub import AudioSegment
from pydub.playback import play
sound = AudioSegment.from_wav("hello.wav")
print("Channel : %d" % sound.channels) # 1:mono, 2:stereo
print("Sampling rate : %f Hz" % sound.frame_rate)
print("Duration : %f sec" % sound.duration_seconds)
play(sound)
音が鳴ってくれた。
◎ 余談。wavの入手元。 :
実験に使う wavファイルは、Freesound から入手させてもらった。アカウントを取得しないとダウンロードできないのがアレだけど…。
_Freesound
_無料で使える音源ファイルが山のようにダウンロードできる「Freesound」 - GIGAZINE
_Freesound
_無料で使える音源ファイルが山のようにダウンロードできる「Freesound」 - GIGAZINE
◎ 分割。 :
wav を読み込んで、NumPy配列とやらにして、1/60秒単位で分割するスクリプトを書いてみた。matplotlib とやらを使ってグラフ表示もする。
_【Python/pydub】mp3、wavのデータをNumPy配列に変換 | アルゴリズム雑記
_matplotlib入門 - りんごがでている
_divide_wav.py
こんな感じの結果が得られた。
分割できてるっぽい。
後は、この1/60単位の波形から、TIC-80の波形メモリ用データをどうにかでっちあげれば…。しかし、一周期分らしきデータを取得するのって、どうやればいいんだ…。
_【Python/pydub】mp3、wavのデータをNumPy配列に変換 | アルゴリズム雑記
_matplotlib入門 - りんごがでている
_divide_wav.py
from pydub import AudioSegment
from pydub.playback import play
import numpy as np
import matplotlib.pyplot as plt
infile = "hello.wav"
sound = AudioSegment.from_wav(infile)
# play(sound)
data = np.array(sound.get_array_of_samples())
x = data[::sound.channels]
rate = sound.frame_rate
frm = rate / 60
sample_len = len(x)
print("Input file : %s" % infile)
print("Channel : %d" % sound.channels)
print("Sampling rate : %d Hz" % rate)
print("1 Frame length : %f point" % frm)
print("Duration : %f msec" % len(sound))
print("Sample length : %f point" % sample_len)
dt = []
for i in range(0,sample_len,frm):
dt.append(x[i:i+frm])
if True:
# plt.plot(x[::1])
row = 10
for i in range(row):
plt.subplot(row, 1, i + 1)
plt.plot(dt[i])
plt.grid()
plt.show()
こんな感じの結果が得られた。
> python divide_wav.py Input file : hello.wav Channel : 1 Sampling rate : 48000 Hz 1 Frame length : 800.000000 point Duration : 511.000000 msec Sample length : 24514.000000 point
分割できてるっぽい。
後は、この1/60単位の波形から、TIC-80の波形メモリ用データをどうにかでっちあげれば…。しかし、一周期分らしきデータを取得するのって、どうやればいいんだ…。
[ ツッコむ ]
以上です。
