ディレクトリ構成
GEN/
┣ test.mp3
┣ test.wav
┣ analysis_1.py
┣ requirements.txt
環境構築
他のプログラムに影響が出ないように,仮想環境を作ることを進めます.
好きなディレクトリで下記コマンドによりpython3.6の仮想環境を構築.
$ virtualenv -p python3.6 GEN
これで,GENという仮想環境が作られました.
仮想環境GENの中で作業するために,アクティベートという処理をします.
$ source GEN/bin/activate
これで,GENの仮想環境での作業が可能となります.
activateされているときにインストールとかしたものはGENがactivate中のみ有効になります.
この環境から抜けたいときは
$ source deactivate
もしくは
$ conda deactivate
で抜けられます.
ここまできたら,プログラムを動かすのに必要なライブラリをインストールします.
./requirements.txt
に必要なライブラリをまとめてあるので,以下コマンドで一括インストールしちゃいましょう.
$ pip install -r requirements.txt
これで環境構築はおしまいです.
音声ファイルの扱い
基本的なことです.wavベースで話を進めていくので,mp3しか手に入らない場合は,以下のコマンドで変換しましょう.
WAVからMP3へ変換
ffmpeg -i "test.wav" -vn -ac 2 -ar 44100 -ab 256k -acodec libmp3lame -f mp3 "test.mp3"
MP3からWAVへ変換
$ ffmpeg -i "test.mp3" -vn -ac 2 -ar 44100 -acodec pcm_s16le -f wav "test.wav"
プログラム:analysis_1.py
今回は,こちらのサイトから「やあ!」という女の子の声をお借りし,'test.wav'として保存しています.
###################### ライブラリのインポート #######################
# sondfileというライブラリをsfと定義してインポートしてます
import soundfile as sf
# pythonでグラフ表示とかするためのライブラリをpltと定義してインポートしてます
from matplotlib import pyplot as plt
# 数字に強いライブラリnumpyをnpと定義してインポートてます
import numpy as np
###############################################################
########################## 関数定義 ############################
# wavファイルから波形とサンプルレートと出力(return)する関数
def wavload(path):
data, samplerate = sf.read(path)
return data, samplerate
###############################################################
########################## 処理開始 #############################
if __name__ == '__main__':
##### 波形を表示 #####
#縦軸:上で定義した関数wavloadを使ってディレクトリ内の'test.wav'を読み込む
voice, samplerate = wavload('./test.wav')
#横軸:tは時間方向での離散値です.voiceの長さをサンプルレートで切っているので,サンプル数分の配列になってます.
t = np.arange(0, len(voice))/samplerate
#データプロット.今回はステレオ(2チャンネル合成)で出力させます.
plt.plot(t, voice)
plt.show()
plt.close()
#####################
##### 周波数成分を表示(フーリエ変換) #####
#縦軸:voiceを高速フーリエ変換します(時間領域から周波数領域に変換)
fft_voice = np.abs(np.fft.fft(voice))
#横軸:周波数の取得 #np.fft.fftfreq(データ点数, サンプリング周期)
freqList = np.fft.fftfreq(voice.shape[0], d=1.0/samplerate)
#データプロット
plt.plot(freqList, fft_voice)
plt.xlim(0, 8000) #0~8000Hzまで表示
plt.show()
#####################################
################################################################
処理の詳細は,上のコメントアウトを読めばわかると思います.
実行は以下のコマンドで行います.
$ python analysis_1.py