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では各特徴量の概形は一致しているように見えます。
-詳細な検討は後日追記する予定です。