buto > /dev/null

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

Python 音声ファイルの周波数を取得する

前回はUSBマイクで録音した音声をwavファイルに保存したので今回はwavファイルの音声から周波数を取得します

こちらの記事をコピペ

Pythonで、Wave音源の周波数と音量(デシベル)を取得する方法[python音声解析 フーリエ変換 FFT]

import sys
import wave 
import numpy as np
import math

# wavファイルを読み込む
FLAME_SIZE  = 100
wf        = wave.open('./voice.wav', 'rb')
frames   = wf.getnframes()   # フレーム数(サンプリング周波数*録音時間)
framerate = wf.getframerate()   # サンプリング周波数(今回は44.2kHz)

wf.setpos(int(frames/2))   # 全フレームの真ん中に位置を移動
buf = wf.readframes(FLAME_SIZE)  # セットした位置からFLAME_SIZEフレームを取得
wf.close()

# 周波数を取得
data = np.frombuffer(buf, dtype= "int16") / 32768.0
spectrum = np.fft.fft(data)
maxvalue = 0
maxidx = 0
tmpvalue = 0
flist = np.fft.fftfreq(FLAME_SIZE, d=1.0/44200)

for j in range( int( len(spectrum) / 2 ) ):
    tmpvalue = spectrum[j]
    if tmpvalue > maxvalue:
        maxvalue = tmpvalue
        maxidx = j

print( str(int(flist[maxidx])) + "Hz" )

FRAME_SIZE は周波数を取得する音声データの範囲だと思うのですが、今回は442HzのAをハミングした音声を読み込んだのでどの範囲でも同じはず!

実行すると以下のように周波数が表示されます!こちらでチューニングして録音したのでピッタリですね!!

f:id:butorisa:20211208225125p:plain

チューニングなしで録音したら1,768Hz(3オクターヴ上!?)と表示されてそんなテクニックはないので正確さには欠けるかもですね。。