トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索   ヘルプ   最終更新のRSS

MFCC解析のツール の変更点

Top / MFCC解析のツール
  • 追加された行はこの色です。
  • 削除された行はこの色です。
  • MFCC解析のツール へ行く。

#freeze
#access
#analog

*MFCC解析のツール [#p23672c6]
MFCCの説明は [[メル周波数ケプストラム(MFCC)]] を参照してください。

#contents

**MATLAB Auditory Toolbox 付属の mfcc.m を使う [#f70f447d]
-[[MATLAB Note/音声の分析/メルケプストラム解析:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/73.html#gab6732b]]

**Praat を使う [#o078100f]
-[[Praat/MFCC解析:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?Praat#cae343d4]]

**HTK(Hidden Markov Model Toolkit) 付属の HCopy を使う [#ke8f3149]
-Linux 環境を対象に説明します。

-HTK本体のインストール方法は[[こちら:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?HTK%E3%81%AB%E3%82%88%E3%82%8B%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E6%A7%8B%E7%AF%89#m442daf5]]にまとめました。パスを通して、コマンドを実行可能にしておきます。
#geshi(bash){{
 PATH=$PATH:/home/m-kouki/HTK-rensyu/bin.linux/
 export PATH
}}

-HCopy設定ファイル config.hcopy を作成します((参考:[[音声メディア研究室 HMM 作成メモ:http://izanami.tl.fukuoka-u.ac.jp/SLPL/HMM/HMM-memo.html]]))
--WAVファイルの解析を行なう場合、config.hcopy ファイルの中身は以下のようにすると、うまくいきます([[参考:http://bbs.matwav.com/post/view?bid=93&id=413930&sty=3&age=0&tpg=1&ppg=1#413930]])
#geshi(c){{
 #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:http://nesl.ee.ucla.edu/projects/ibadge/docs/ASR/htk/htkbook.pdf#page=62]] を参照。
--TARGETKINDのアルファベットの意味は、[[HTK Book p.62以降:http://nesl.ee.ucla.edu/projects/ibadge/docs/ASR/htk/htkbook.pdf#page=68]] より...
 _E エネルギー
 _N エネルギー絶対値の抑制
 _D デルタ係数
 _A 加速度(デルタデルタ)係数
 _C 圧縮
 _Z ゼロ平均の静的係数
 _K CRC(巡回冗長検査)チェック値
 _O 0番目のケプストラム係数
 _V VQ(ベクトル量子化)データ
 _T 3次元係数

---例えば、「MFCC」は、MFCC12次元((NUMCEPS=12のため、基本的な特徴量は12次元となる。)) のみの特徴量であることを示しています。
---「MFCC_E」は、MFCC12次元 + パワー1次元の、計13次元の特徴量であることを示しています。
---「MFCC_E_D」は、(MFCC+パワー)+デルタ(MFCC+パワー) の、計26次元を示しています。
---「MFCC_E_D_A」は、(MFCC+パワー)+デルタ(MFCC+パワー)+デルタデルタ(MFCC+パワー) の、計39次元を示しています。
---デルタ及びデルタデルタの意味は、&pgid(,動的特徴量(デルタパラメータ)); を参照

--NUMCHANS の値は、メルフィルタバンクのチャンネル数、ここでは 20 次元
--NUMCEPS の値は、出力するMFCCの次元数、ここではメルフィルタバンク 20次元のうち、低次成分 12 次元を取り出す、という意味((したがって、NUMCEPS は NUMCHANS 以上の値を指定できません。))

--その他のパラメーター及びデフォルトパラメーターの値は、[[HTK Book p.247以降:http://nesl.ee.ucla.edu/projects/ibadge/docs/ASR/htk/htkbook.pdf#page=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

-解析を実行して、MFCファイル(HTK/Julius音声特徴量ファイル)を作成します。
#geshi(bash){{
 $ HCopy -T 1 -C config.hcopy -S codetr.scp
}}

-MFCファイルをテキスト形式に変換します([[参考:http://www.symbio.jst.go.jp/~nakadai/acoustic/node12.html]])
#geshi(bash){{
 $ HList -o -h data/R00F0028_10000_cutNoize.mfc > data/R00F0028_10000_cutNoize.txt
}}
&ref(http://shower.human.waseda.ac.jp/~m-kouki/matlab/mfcc.JPG);~
--Sample Period の値がウインドウシフト長です(秒に直すには、1000000 で割ります)。
--1フレームにつき12個のMFCC値と1個のC0値を出力していて、合計142174フレーム(行)になっています。フレームシフト長が0.01秒で、このファイルの再生時間が1422秒なので、問題なく解析できているようです。

-テキスト形式に変換したMFCCデータを、1行1フレームの .csv 形式に変換します。((2010/06/30 フレーム開始時間の値が間違っていたので、修正しました。))
--&ref(ConvertHcopyCsv.java);
#geshi(bash){{
 $ mkdir convertTxt
 $ java ConvertHcopyCsv . convertTxt
}}
---カレントディレクトリ(.)内の「*.txt」ファイルを全て検出して、.csv形式に変換して convertTxt ディレクトリ内に出力します。

**MATLAB Auditory Toolbox, Praat, HTK の比較 [#adc90242]
-以下、「MATLAB」と発音したサンプル英語音声を解析してみます。MATLABで下記のコードを実行します。
#geshi(matlab){{
 load mtlb;          %MATLABと発音した英語音声
 disp(strcat('サンプリング周波数は',  int2str(Fs), '[Hz] サウンドデータは mtlb'));
 sound(mtlb, Fs)     %再生
 wavwrite(mtlb, Fs, 32, 'mtlb.wav');  %量子化ビット数32でファイルを書き出す
}}

-全てフレーム長 25ms、フレームシフト長 10ms で解析します。

-[[HTKを使って:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/106.html#ke8f3149]]、mtlb.wav を解析
--上記のパラメータをそのまま使用
--出力された [[mtlb_HTK.txt:http://shower.human.waseda.ac.jp/~m-kouki/matlab/mtlb_HTK.txt]] を &ref(ConvertHcopyCsv.java); で変換したものが [[mtlb_HTK.csv:http://shower.human.waseda.ac.jp/~m-kouki/matlab/mtlb_HTK.csv]]
---行が各フレーム、列が各特徴量のカンマ区切りデータ、ヘッダなし
--MATLABにMFCCのデータを取り込むには、以下のようにします。
#geshi(matlab){{
mtlb_HTK = csvread('mtlb_HTK.csv');
mtlb_HTK_MFCC = mtlb_HTK(:,3:14);  % 1-2列目はフレーム番号と時間、15列目はC0なので除外
}}

-[[Praatを使って:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?Praat#cae343d4]]、mtlb.wav を解析
--Window length (s) は 0.025、Time Step (s) は 0.010 を指定、他はデフォルト
--出力されたファイルが [[mtlb_Praat.txt:http://shower.human.waseda.ac.jp/~m-kouki/matlab/mtlb_Praat.txt]]
---行が各フレーム、列が各特徴量のタブ区切りデータ、ヘッダあり
--MATLABにMFCCのデータを取り込むには、以下のようにします。
#geshi(matlab){{
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を使って:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/73.html#gab6732b]]、mtlb.wav を解析
--WindowSize の値を Fs * 0.025 に書き換え、frameRate = 100 を引数で与えます。
--出力されたファイルが [[mtlb_MATLAB.txt:http://shower.human.waseda.ac.jp/~m-kouki/matlab/mtlb_MATLAB.txt]]
---行が各特徴量、列が各フレームのカンマ区切りデータ、ヘッダなし
--MATLABにMFCCのデータを取り込むには、以下のようにします。
#geshi(matlab){{
mtlb_MATLAB = csvread('mtlb_MATLAB.txt');
mtlb_MATLAB_MFCC = mtlb_MATLAB(2:13,:)'; %MFCC部を読み込み、行と列を入れ替え(転置)
}}

-3種類のツールで求めたMFCC値を比較します。上に続いて、以下を実行します。
#geshi(matlab){{
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');
}}

#ref(mtlb_MFCC1.png,,60%);
--縦軸:MFCCの各特徴量、横軸:フレーム数(時間)
---各ツールのデフォルト設定で計算した結果は、かなり異なっているようです。
---Praatのみ総フレーム数が異なっています(2少ない)。HTKやMATLAB Auditory Toolboxではファイルの持続時間をフレームシフト長で割った値が総フレーム数になりますが、Praatではフレーム長などによって総フレーム数が変わるようです。(([[VoiceSauce:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/112.html]] でPraatを指定したときの総フレーム数はファイルの持続時間をフレームシフト長で割った値になっているので、どうやっているか要検討。))((Praatではフレーム長×2の長さだけフレーム数が少なくなるようです。原因は調査中です。))

#ref(mtlb_MFCC2.png,,50%);
--縦軸:各MFCC特徴量の値、横軸:フレーム数(時間)
---各ツールの出力値のスケールが異なっているようです。
---HTKとPraatでは各特徴量の概形は一致しているように見えます。

-詳細な検討は後日追記する予定です。