2017-12-23 12 views
1

私はニューラルネットワークを使って音声認識に取り組んでいます。そのためには、トレーニング用オーディオファイル(.wav)のスペクトログラムを取得する必要があります。どのようにそれらのスペクトログラムをPythonで入手するのですか?音声分析でスペクトログラムをプロットする

+1

このPythonモジュールを参照してください:[音声認識](https://github.com/Uberi/speech_recognition) – jdoe

+0

@kks、私の答えは貢献してきました君は? –

+0

ええ...あなたの答えからいくつかの良いリソースを得ました。 @Oleg Meknikov – kks

答えて

2

そうする方法はたくさんあります。最も簡単なのは、Kaggleの競技でKernelsで提案されている方法をチェックすることです。 This oneは、特に明確かつ単純であり、以下の機能を含む。入力は、wavファイルから抽出されたサンプルの数値ベクトル、サンプルレート、フレームのサイズ(ミリ秒単位)、ステップ(ストライドまたはスキップ)のサイズ(ミリ秒単位)および小さなオフセットです。よりさらに大きな大きな値を残し

from scipy.io import wavfile 
from scipy import signal 
import numpy as np 

sample_rate, audio = wavfile.read(path_to_wav_file) 

def log_specgram(audio, sample_rate, window_size=20, 
       step_size=10, eps=1e-10): 
    nperseg = int(round(window_size * sample_rate/1e3)) 
    noverlap = int(round(step_size * sample_rate/1e3)) 
    freqs, times, spec = signal.spectrogram(audio, 
            fs=sample_rate, 
            window='hann', 
            nperseg=nperseg, 
            noverlap=noverlap, 
            detrend=False) 
    return freqs, times, np.log(spec.T.astype(np.float32) + eps) 

出力は、スペクトログラムが単調関数で再スケーリングされたことを除いて、SciPy manualで定義されているが(ログ())、これは、小さな値よりもはるかに大きな値を押下しますより小さい値。この方法では、仕様の極端な値が計算を支配することはありません。あるいは、いくつかの分位数で値を制限することもできますが、log(または平方根)を優先します。出力「いじめ」から極端な値を防ぐために、スペクトログラムの高さを正規化するために他の多くの方法、すなわちがあります:)

また
freq (f) : ndarray, Array of sample frequencies. 
times (t) : ndarray, Array of segment times. 
spec (Sxx) : ndarray, Spectrogram of x. By default, the last axis of Sxx corresponds to the segment times. 

、あなたからgithub repoにtrain.pyとmodels.pyコードを確認することができますTensorflow example on audio recognition

Here is another threadは、Pythonでスペクトログラムを構築する際の説明とコードを提供します。

+0

あなたはfreqs、timesとspecによって返されるものを助けることができますか?私は文書を見たが、まだ混乱している。 @Oleg Melnikov – kks

+0

@kks:出力の追加の説明を見てください:)それが助けてくれることを願っています。 –

1

Scipyはこの目的に役立ちます。

import scipy 
# Read the .wav file 
sample_rate, data = scipy.io.wavfile.read('directory_path/file_name.wav') 

# Spectrogram of .wav file 
sample_freq, segment_time, spec_data = signal.spectrogram(data, sample_rate) 
# Note sample_rate and sampling frequency values are same but theoretically they are different measures 

使用matplotライブラリスペクトログラムを可視化する

import matplotlib.pyplot as plt 
plt.pcolormesh(segment_time, sample_freq, spec_data) 
plt.ylabel('Frequency [Hz]') 
plt.xlabel('Time [sec]') 
plt.show() 
関連する問題