読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



SPTKの使い方 (9) メル一般化ケプストラム分析合成

音声信号処理 音声合成

SPTKの使い方 (8)(2013/2/16)の続き。

今まで紹介したメルケプストラム分析(2013/1/19)やLPC分析(2013/2/16)を一般化したメル一般化ケプストラム(Mel-Generalized Cepstrum: MGC)分析の実験をしてみます。似たような名前のパラメータがたくさんあってややこしいですが、メル一般化ケプストラムは、メルケプストラム(mcep)やメル周波数ケプストラム(mfcc)とは違うものです。最初は同じものだと勘違いしていましたが・・・

音声ファイルの準備

スペクトルパラメータの違いを比較できるように前回と同じ音声ファイルを使います。SPTKのサンプル音声であるdata.shortです。data.rawと名前を変えています。

ピッチ抽出と音源の生成

前回とまったく同じ手順なので省略します。pitchコマンドの出力であるdata.pitchファイルを使います。

メル一般化ケプストラムの抽出

SPTKでメル一般化ケプストラム分析を行うコマンドは、mgcepです。使い方はメルケプストラム分析のmcepやLPC分析のlpcとほとんど同じですが、\alpha\gamma(またはc)という2つのパラメータをとります。

\alphaはメルケプストラム分析でもあった人間の聴覚により適合したメルスケールを導入するパラメータです。音声のケプストラム分析, メルケプストラム分析という論文に以下のような記述がありました。

周波数伸縮パラメータ\alphaを適当に選ぶことにより、上記のmelスケールやBarkスケールの良い近似を与えることが知られている。例えば、\alpha = 0.31, 0.35, 0.42 を選べば、それぞれ標本化周波数が8kHz, 10kHz, 16kHzの場合のmelスケールを、同様に、\alpha =0.42, 0.47, 0.55 を選べばBarkスケールと良く一致する。

今回の音声は16kHzなので\alpha = 0.42 ですね。

もう1つのパラメータ \gamma (power parameter) は、先の論文でもいきなり出てきて意味がよくわからなかったですが、-1 \le \gamma \le 0の範囲の値を取ります。SPTKのサンプル集では、\alpha = 0.42\gamma = -0.5になっているので同じ設定で試してみます。

x2x +sf < data.raw | frame -l 400 -p 80 | window -l 400 -L 512 | mgcep -m 20 -a 0.42 -g -0.5 -l 512 > data.mgcep

今までと同様に65フレーム目の対数スペクトルとスペクトル包絡を描画してみます。スペクトル包絡を求めるのはケプストラム分析(2013/1/19)と同様にmgc2spでした*1

x2x +sf < data.raw | frame -l 400 -p 80 | bcut +f -l 400 -s 65 -e 65 | window -l 400 -L 512 | spec -l 512 | dmp +f > spec.txt
bcut +f -n 20 -s 65 -e 65 < data.mgcep | mgc2sp -m 20 -a 0.42 -g -0.5 -l 512 | dmp +f > mgcep.txt

spec.txtが対数スペクトルのデータ、mgcep.txtがスペクトル包絡のデータです。gnuplotを使えば簡単に描画できます。

% gnuplot
gnuplot> plot "spec.txt" w l
gnuplot> replot "mgcep.txt" w l lw 3

結果は下のようなグラフになります。赤が対数スペクトル、緑がメル一般化ケプストラムのスペクトル包絡です。

f:id:aidiary:20130301230707p:plain

メル一般化ケプストラム分析合成

メル一般化ケプストラムで分析合成音を出すフィルタコマンドは、mglsadfです。なぜかよくわかりませんが、オプションに\gammaを指定する-gがないため代わりに-cを指定しています。\gammaとcには、下の関係があるとのこと。

\gamma = - \frac{1}{c}

たとえば、今回は\gamma = -0.5で分析していたのでc = 2です。

excite -p 80 data.pitch| mglsadf -m 20 -a 0.42 -c 2 -p 80 data.mgcep | clip -y -32000 32000 | x2x +fs > data.mgcep.raw

パラメータの包含関係

SPTKの資料を読むと、メル一般化ケプストラム分析は、メルケプストラム分析やLPC分析を包含する方法だとわかります。


f:id:aidiary:20130301231012p:plain
SPTKref-3.6.pdfのp.135から引用

本当にパラメータを変えるだけでメルケプストラム分析やLPC分析と同じスペクトル包絡が得られるのか確認してみます。

  1. メルケプストラム分析(\alpha = 0.42, \gamma = 0
  2. LPC分析(\alpha = 0, \gamma = -1
  3. メル一般化ケプストラム分析(\alpha = 0.42, \gamma = -0.5

として3つのパラメータのスペクトル包絡を重ねて比較してみます。

f:id:aidiary:20130301233623p:plain

確かにメルケプストラムは少し丸っぽく、LPC分析は尖っている感じで前に求めた結果と同じになりました。mgcepは\gammaを調整することでLPC分析やメルケプストラム分析とは少し異なるスペクトル包絡でも抽出できることがわかります。\gamma = -0.5は低周波数域だとLPC分析に近いですが、高周波数域だとメルケプストラム分析に近くなっているように見えます。

分析合成音の比較

メルケプストラム分析、LPC分析、メル一般化ケプストラム分析の分析合成音を聞き比べてみます。メルケプストラム分析とLPC分析は前回作った音声です。

メルケプストラム分析 \alpha = 0.42, \gamma = 0
LPC分析 \alpha = 0, \gamma = -1
メル一般化ケプストラム分析 \alpha = 0.42, \gamma = -0.5

私の耳にはほとんど違いがわからないのだけど・・・もう少し長い音声で試してみた方がよかったかな?

次回は分析合成のパラメータを変えていろんな音声を出してみたいと思います。簡単なボイスチェンジャーを作りたいと思っています。

*1:同様にというよりか、本来、mgc2spはメル一般化ケプストラムからスペクトルを求めるコマンドでした。前にメルケプストラム分析のところでmgc2spを使ったときは-gに0を指定しましたが、あとで書くようにメル一般化ケプストラム分析で γ = 0 のときメルケプストラム分析と等価になります。