mieki256's diary



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のインストール。 :

インストールは pip で済んだ。ありがたや。
pip install pydub

ffmpeg.exe も、Pythonスクリプトと同じ場所に一応コピーして置いておいた。

_Builds - Zeranoe FFmpeg

読み込んで鳴らす。 :

解説ページを参考にして、wavファイルを読み込んで、情報を表示して、鳴らすスクリプトを書いた。

_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

分割。 :

wav を読み込んで、NumPy配列とやらにして、1/60秒単位で分割するスクリプトを書いてみた。matplotlib とやらを使ってグラフ表示もする。

_【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

divide_wav_py_ss01.png

分割できてるっぽい。

後は、この1/60単位の波形から、TIC-80の波形メモリ用データをどうにかでっちあげれば…。しかし、一周期分らしきデータを取得するのって、どうやればいいんだ…。

以上、1 日分です。

過去ログ表示

Prev - 2018/12 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project