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の波形メモリ用データをどうにかでっちあげれば…。しかし、一周期分らしきデータを取得するのって、どうやればいいんだ…。
[ ツッコむ ]
以上、1 日分です。