人工知能に関する断創録スマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。Learning、Kerasに関する記事が多いです。(4)(2012/7/16)の続き。今回は、音声波形をフレーム単位に分割するSPTKのframeコマンドを使ってみます。音声でフレームというと、信号の複数のサンプルを一定幅でまとめたものを指すことが多いと思います。前に実装した短時間フーリエ変換(2011/7/16)では、連続する波形からフレームを切り出し、窓関数をかけてフーリエ変換というのをフレームを少しずつずらしながら繰り返し行うことでスペクトルの時間変化を求めました。ここで、フレームを少しずつずらしながら音声を切り出すのがframeコマンドです。SPTKのマニュアルを見ると、引数で指定するのはフレームの長さLと周期Pになります。周期はフレームの中心をどれくらいずらしていくかを表すパラメータです。LよりPが小さいとオーバーラップしながらずらしていくことになります。いうわけで簡単なデータを作ってさっそく試してみます。...という連続した数値が入ったデータを作ります。i))fp.close()実行するとsimple.shortという0から99までのSHORT型データを書き込んだバイナリファイルができます。SPTKのdmpコマンドで見てみます。このデータからフレーム長L=10、フレーム周期P=5でフレームを抽出してみます。frameの入力はfloat型しかダメなのでx2xでSHORT型からFLOAT型に変換してます。simple.framedmpコマンドの-lオプションでフレーム長を渡すとフレーム単位でインデックスを割り振ってくれるため少し見やすくなります。99このようにフレームが並んでいることがわかります。たしかにフレーム長は10でフレーム周期の5ずつずらしながらフレームを抽出していることがわかります。元のサンプル数が100で5ずつずらしながらフレームを抽出しているので全部で100/5=20フレームあることもわかります。フレームを切り出す次に、波形から任意の位置のフレームを切り出してみます。波形から任意のサンプルを切り出すコマンドはbcut(2012/7/4)でしたが、bcutに-lオプションを与えると単位がフレームになります。指定したフレームのスペクトルを求めるでは、frame、bcutを使って音声の任意のフレームのスペクトルを求めてみます。音声はSPTKに付属のサンプル音声data.short(青い植木鉢)で試します。data.fftこのようにコマンドをパイプでつなげるだけなのでマジ簡単です。前から順にdata.shortをSHORT型からFLOAT型に変換フレーム長400サンプル、フレーム周期80サンプルでフレームを抽出フレーム長を400サンプルとし、65フレーム目を切り出す入力のフレーム長を400サンプル、出力のフレーム長を512サンプルとする窓関数をかけるフレーム長512サンプルでFFTして振幅スペクトルを出力となります。data.fftを前回(2012/7/16)作ったplot_fft.pyで表示してみます。16000縦軸は対数にすることが多いのでplot_fft.pyの下の部分を書き換えてみます。np.log2(fft[:N/2]))実行すると対数スペクトルになります。SPTKで対数スペクトルを求めるSPTKにも対数スペクトルを求めるspecコマンドとそれを表示するglogspコマンドがあるので試してみます。xgr先の結果と同じです。縦軸のスケールが違うけどこれは特に問題ないのかな?frameコマンドは、フーリエ変換以外にもMFCCやLPCの抽出でも頻繁に使うのでここで慣れておきたいな。»プロフィールid:aidiary人工知能とその関連分野に興味があります。Blog|ブログを報告する。