MFCC解析のツール
Last-modified: 2015-02-25 (水) 03:46:58
Top / MFCC解析のツール
MFCC解析のツール †
MFCCの説明は メル周波数ケプストラム(MFCC) を参照してください。
MATLAB Auditory Toolbox 付属の mfcc.m を使う †
Praat を使う †
HTK(Hidden Markov Model Toolkit) 付属の HCopy を使う †
- Linux 環境を対象に説明します。
- HTK本体のインストール方法はこちらにまとめました。パスを通して、コマンドを実行可能にしておきます。
PATH=$PATH:/home/m-kouki/HTK-rensyu/bin.linux/ export PATH
- HCopy設定ファイル config.hcopy を作成します*1
- WAVファイルの解析を行なう場合、config.hcopy ファイルの中身は以下のようにすると、うまくいきます(参考)
#Cording Parameters SOURCEFORMAT = WAVE SOURCEKIND = WAVEFORM TARGETKIND = MFCC_E_D_A # 出力する特徴量の形式(MFCC 39) TARGETRATE = 100000.0 # フレームシフト長、10msec = 100000 x 100nsec SAVECOMPRESSED = T # 出力結果を圧縮ファイルで保存する WINDOWSIZE = 250000.0 # フレームの幅、25msec USEHAMMING = T # ハミング窓を使う PREEMCOEF = 0.97 # プリエンファシス係数 NUMCHANS = 20 # メルフィルタバンクのチャンネル数 NUMCEPS = 12 # メルフィルタバンクの低次成分 12 次元を取り出す CEPLIFTER = 22 # ケプストラムのリフタリングの値 ENORMALISE = F # 対数エネルギーで正規化をするかどうか DELTAWINDOW = 2 # デルタケプストラムのウインドウの幅 ACCWINDOW = 2 # デルタデルタケプストラムのウインドウの幅
- TARGETRATEの値は、 10msec = 100000 x 100nsec(ナノ秒)
- 注:TARGETRATEは、サンプリング周波数ではなく、ウインドウシフト長であることに気をつけてください。なお、HTKでは、音声のサンプリングレートは自動的に推定されます(SOURCERATE パラメータで直接指定することもできます)。詳細は HTK Book p.56 を参照。
- TARGETKINDのアルファベットの意味は、HTK Book p.62以降 より...
_E エネルギー _N エネルギー絶対値の抑制 _D デルタ係数 _A 加速度(デルタデルタ)係数 _C 圧縮 _Z ゼロ平均の静的係数 _K CRC(巡回冗長検査)チェック値 _O 0番目のケプストラム係数 _V VQ(ベクトル量子化)データ _T 3次元係数
- WAVファイルの解析を行なう場合、config.hcopy ファイルの中身は以下のようにすると、うまくいきます(参考)
- 例えば、「MFCC」は、MFCC12次元*2 のみの特徴量であることを示しています。
- 「MFCC_E」は、MFCC12次元 + パワー1次元の、計13次元の特徴量であることを示しています。
- 「MFCC_E_D」は、(MFCC+パワー)+デルタ(MFCC+パワー) の、計26次元を示しています。
- 「MFCC_E_D_A」は、(MFCC+パワー)+デルタ(MFCC+パワー)+デルタデルタ(MFCC+パワー) の、計39次元を示しています。
- デルタ及びデルタデルタの意味は、動的特徴量(デルタパラメータ) を参照
- NUMCHANS の値は、メルフィルタバンクのチャンネル数、ここでは 20 次元
- NUMCEPS の値は、出力するMFCCの次元数、ここではメルフィルタバンク 20次元のうち、低次成分 12 次元を取り出す、という意味*3
- その他のパラメーター及びデフォルトパラメーターの値は、HTK Book p.247以降 で確認できます。
- 続けて、変換するファイル名のリスト codetr.scp を作成します。
- codetr.scp ファイルの中身は、以下のような感じです。この例では、data ディレクトリ内の R00F0028_10000_cutNoize.wav と R00F0178_10000_cutNoize.wav の分析をしています。
data/R00F0028_10000_cutNoize.wav data/R00F0028_10000_cutNoize.mfc data/R00F0178_10000_cutNoize.wav data/R00F0178_10000_cutNoize.mfc
- codetr.scp ファイルの中身は、以下のような感じです。この例では、data ディレクトリ内の R00F0028_10000_cutNoize.wav と R00F0178_10000_cutNoize.wav の分析をしています。
- 解析を実行して、MFCファイル(HTK/Julius音声特徴量ファイル)を作成します。
$ HCopy -T 1 -C config.hcopy -S codetr.scp
- MFCファイルをテキスト形式に変換します(参考)
$ HList -o -h data/R00F0028_10000_cutNoize.mfc > data/R00F0028_10000_cutNoize.txt
- Sample Period の値がウインドウシフト長です(秒に直すには、1000000 で割ります)。
- 1フレームにつき12個のMFCC値と1個のC0値を出力していて、合計142174フレーム(行)になっています。フレームシフト長が0.01秒で、このファイルの再生時間が1422秒なので、問題なく解析できているようです。
- テキスト形式に変換したMFCCデータを、1行1フレームの .csv 形式に変換します。*4
- ConvertHcopyCsv.java
$ mkdir convertTxt $ java ConvertHcopyCsv . convertTxt
- カレントディレクトリ(.)内の「*.txt」ファイルを全て検出して、.csv形式に変換して convertTxt ディレクトリ内に出力します。
- ConvertHcopyCsv.java
MATLAB Auditory Toolbox, Praat, HTK の比較 †
- 以下、「MATLAB」と発音したサンプル英語音声を解析してみます。MATLABで下記のコードを実行します。
load mtlb; %MATLABと発音した英語音声 disp(strcat('サンプリング周波数は', int2str(Fs), '[Hz] サウンドデータは mtlb')); sound(mtlb, Fs) %再生 wavwrite(mtlb, Fs, 32, 'mtlb.wav'); %量子化ビット数32でファイルを書き出す
- 全てフレーム長 25ms、フレームシフト長 10ms で解析します。
- HTKを使って、mtlb.wav を解析
- 上記のパラメータをそのまま使用
- 出力された mtlb_HTK.txt を ConvertHcopyCsv.java で変換したものが mtlb_HTK.csv
- 行が各フレーム、列が各特徴量のカンマ区切りデータ、ヘッダなし
- MATLABにMFCCのデータを取り込むには、以下のようにします。
mtlb_HTK = csvread('mtlb_HTK.csv'); mtlb_HTK_MFCC = mtlb_HTK(:,3:14); % 1-2列目はフレーム番号と時間、15列目はC0なので除外
- Praatを使って、mtlb.wav を解析
- Window length (s) は 0.025、Time Step (s) は 0.010 を指定、他はデフォルト
- 出力されたファイルが mtlb_Praat.txt
- 行が各フレーム、列が各特徴量のタブ区切りデータ、ヘッダあり
- MATLABにMFCCのデータを取り込むには、以下のようにします。
mtlb_Praat = fopen('mtlb_Praat.txt', 'rt'); % ヘッダ情報(1行目の文字列)を得る text = textscan(mtlb_Praat, '%s', 1, 'delimiter', '\n'); % データ部(文字列1列、数値19列、区切り記号はタブ)を得る text = textscan(mtlb_Praat, strcat('%s ', repmat(['%f '],1,19))', 'delimiter', '\t'); % MFCC部(c1 - c12)の取り込み mtlb_Praat_MFCC = zeros(length(text{1}),12); for count = 2 : 13 mtlb_Praat_MFCC(:,(count-1)) = text{count}; end
- MATLAB Auditory Toolboxを使って、mtlb.wav を解析
- WindowSize の値を Fs * 0.025 に書き換え、frameRate = 100 を引数で与えます。
- 出力されたファイルが mtlb_MATLAB.txt
- 行が各特徴量、列が各フレームのカンマ区切りデータ、ヘッダなし
- MATLABにMFCCのデータを取り込むには、以下のようにします。
mtlb_MATLAB = csvread('mtlb_MATLAB.txt'); mtlb_MATLAB_MFCC = mtlb_MATLAB(2:13,:)'; %MFCC部を読み込み、行と列を入れ替え(転置)
- 3種類のツールで求めたMFCC値を比較します。上に続いて、以下を実行します。
figure(1); subplot(3,1,1); imagesc(mtlb_HTK_MFCC'); title('HTK MFCC1 - MFCC12'); subplot(3,1,2); imagesc(mtlb_Praat_MFCC'); title('Praat MFCC1 - MFCC12'); subplot(3,1,3); imagesc(mtlb_MATLAB_MFCC'); title('MATLAB Auditory Toolbox MFCC1 - MFCC12'); figure(2); for count = 1 : 12 subplot(3,4,count); plot([mtlb_HTK_MFCC(1:48,count) mtlb_Praat_MFCC(1:48,count) mtlb_MATLAB_MFCC(1:48,count)]); title(strcat('MFCC-', int2str(count))); end legend('HTK','Praat','MATLAB');
- 縦軸:MFCCの各特徴量、横軸:フレーム数(時間)
- 縦軸:各MFCC特徴量の値、横軸:フレーム数(時間)
- 各ツールの出力値のスケールが異なっているようです。
- HTKとPraatでは各特徴量の概形は一致しているように見えます。
- 詳細な検討は後日追記する予定です。
*1 参考:音声メディア研究室 HMM 作成メモ
*2 NUMCEPS=12のため、基本的な特徴量は12次元となる。
*3 したがって、NUMCEPS は NUMCHANS 以上の値を指定できません。
*4 2010/06/30 フレーム開始時間の値が間違っていたので、修正しました。
*5 VoiceSauce でPraatを指定したときの総フレーム数はファイルの持続時間をフレームシフト長で割った値になっているので、どうやっているか要検討。
*6 Praatではフレーム長×2の長さだけフレーム数が少なくなるようです。原因は調査中です。