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

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次元係数
  • 例えば、「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
  • 解析を実行して、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
    mfcc.JPG
    • Sample Period の値がウインドウシフト長です(秒に直すには、1000000 で割ります)。
    • 1フレームにつき12個のMFCC値と1個のC0値を出力していて、合計142174フレーム(行)になっています。フレームシフト長が0.01秒で、このファイルの再生時間が1422秒なので、問題なく解析できているようです。
  • テキスト形式に変換したMFCCデータを、1行1フレームの .csv 形式に変換します。*4
    • fileConvertHcopyCsv.java
       $ mkdir convertTxt
       $ java ConvertHcopyCsv . convertTxt
      • カレントディレクトリ(.)内の「*.txt」ファイルを全て検出して、.csv形式に変換して convertTxt ディレクトリ内に出力します。

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.txtfileConvertHcopyCsv.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');
mtlb_MFCC1.png
  • 縦軸:MFCCの各特徴量、横軸:フレーム数(時間)
    • 各ツールのデフォルト設定で計算した結果は、かなり異なっているようです。
    • Praatのみ総フレーム数が異なっています(2少ない)。HTKやMATLAB Auditory Toolboxではファイルの持続時間をフレームシフト長で割った値が総フレーム数になりますが、Praatではフレーム長などによって総フレーム数が変わるようです。*5*6
mtlb_MFCC2.png
  • 縦軸:各MFCC特徴量の値、横軸:フレーム数(時間)
    • 各ツールの出力値のスケールが異なっているようです。
    • HTKとPraatでは各特徴量の概形は一致しているように見えます。
  • 詳細な検討は後日追記する予定です。

*1 参考:音声メディア研究室 HMM 作成メモ
*2 NUMCEPS=12のため、基本的な特徴量は12次元となる。
*3 したがって、NUMCEPS は NUMCHANS 以上の値を指定できません。
*4 2010/06/30 フレーム開始時間の値が間違っていたので、修正しました。
*5 VoiceSauce でPraatを指定したときの総フレーム数はファイルの持続時間をフレームシフト長で割った値になっているので、どうやっているか要検討。
*6 Praatではフレーム長×2の長さだけフレーム数が少なくなるようです。原因は調査中です。

添付ファイル: filemtlb_MFCC2.png 814件 [詳細] filemtlb_MFCC1.png 961件 [詳細] fileConvertHcopyCsv.java 1166件 [詳細]