0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

For GEN (高校生への課題作成補助)

Last updated at Posted at 2021-02-10

ディレクトリ構成

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

出力結果

図1:音声の波形(ステレオ)
Figure_1.png

図2:フーリエ変換
Figure_2.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?