人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

SPTKの使い方 (8) LPC・PARCOR・LSP分析合成

SPTKの使い方 (7)(2013/1/19)の続き。

前回は、メルケプストラムというスペクトルパラメータを用いたメルケプストラム分析合成の実験をしました。今回は、別のスペクトルパラメータであるLPC、PARCOR、LSPを用いた分析合成を実験してみます。PARCORとLSPは、LPCから導出できるパラメータなので今回まとめて実験してみます。

音声ファイルの準備

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

ピッチ抽出と音源の生成

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

LPCの抽出

LPC(Linear Predictive Coding)は、線形予測分析(2012/4/15)で実装したことがありました。まあ、自分で実装しなくてもSPTKに便利なコマンドがありましたね・・・SPTKでLPC分析を行うコマンドはlpc*1です。-mオプションで次数を指定するとm次元のLPC係数が出力されます。今回は20次元です。

x2x +sf < data.raw | frame -l 400 -p 80 | window -l 400 | lpc -l 400 -m 20 > data.lpc

メルケプストラム係数からスペクトル包絡を求めるにはmgc2spという専用のコマンドがありましたが、LPC係数からスペクトル包絡を求めるのは通常のspecコマンドでよいみたい。65フレーム目のスペクトルとスペクトル包絡を描画してみます。

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.lpc > data.tmp
spec -l 512 -n 20 -p data.tmp | dmp +f > lpc.txt

spec.txtがスペクトルのデータ、lpc.txtがLPCスペクトル包絡のデータです。gnuplotを使って描画するには下のようにします。

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

結果は下のようなグラフになります。赤が対数スペクトル、緑がLPCスペクトル包絡です。

f:id:aidiary:20130216091809p:plain

LPC分析合成

メルケプストラムのときはmlsadfコマンドを使いましたが、LPCだとpoledfコマンドを使います。

excite -p 80 data.pitch | poledf -m 20 -p 80 data.lpc | clip -y -32000 32000 | x2x +fs > data.lpc.raw
sox -e signed-integer -c 1 -b 16 -r 16000 data.lpc.raw data.lpc.wav

音声の振幅が振りきれる場合があるのでshort型(16bit)の範囲に収まるようにクリッピングしてから音声ファイルに変換しています。

PARCOR分析合成

LPC係数から導けるPARCOR(Partial auto-Correlation: 偏自己相関)係数を用いた分析合成も試してみます。LPC係数をPARCOR係数に変換するコマンドは、lpc2parです。

lpc2par -m 20 < data.lpc > data.par

PARCOR係数から分析合成するコマンドは、ltcdfです。

excite -p 80 data.pitch | ltcdf -m 20 -p 80 data.par | clip -y -32000 32000 | x2x +fs > data.par.raw
sox -e signed-integer -c 1 -b 16 -r 16000 data.par.raw data.par.wav

LSP分析合成

同様にLPC係数から導けるLSP(Line Spectrum Pair: 線スペクトル対)係数を用いた分析合成を試してみます。LPC係数をLSP係数に変換するコマンドは、lpc2lspです。

lpc2lsp -m 20 -n 256 < data.lpc > data.lsp

LSP係数から分析合成するコマンドは、lspdfです。

excite -p 80 data.pitch | lspdf -m 20 -p 80 data.lsp | clip -y -32000 32000 | x2x +fs > data.lsp.raw
sox -e signed-integer -c 1 -b 16 -r 16000 data.lsp.raw data.lsp.wav

あれ?LSPが一番よいと聞いたけど、何か「ぽこ」っていう雑音が入っている気がする。またlpc2lspの-n 256というオプションをとってデフォルトにすると同じところにひどいノイズが入るのも気になる。何か間違っているのかな?知ってたら教えてください。

まとめ

LPC係数からPARCOR係数とLSP係数が求められますが、この3つの特徴の違いは何なのだろうと疑問に思ったので調べて見ました。Wikipediaの線形予測符号のページを見ると下のような記述があります。

LPCはスペクトル包絡情報を転送するのによく使われるため、転送誤りに対して耐性がなければならない。フィルタ係数は誤りに弱いため、その直接的な転送は適当ではない。言い換えれば、ごく小さな誤りでもスペクトル全体がおかしくなり、最悪の場合、予測フィルタが不安定になる

LPCのこのような欠点を改良したのがPARCORやLSPのようです。また、

という論文を見ると次のような記述があります。

線形予測係数、PARCOR係数、LSPパラメータは、声道の特徴を表すパラメータであって、また音声を生成する観点で考えれば、これらのパラメータで制御される音声合成フィルタの制御パラメータと考えることができる。これらのパラメータは、すべて数学的に等価で相互に変換可能である

音声分析合成方式の場合、パラメータの性質が、合成音声の品質に大きな影響を与える。すなわちパラメータの量子化特性、補間特性などがパラメータの良し悪しを決める重要な要素となる

各スペクトルパラメータの特徴をまとめると

  • LPC係数は、係数を低ビットで量子化すると合成フィルタの安定性が保証されない。
  • PARCOR係数は、絶対値が1以下であれば合成フィルタの安定性は保証されるが、低次のパラメータほど感度が高く、量子化の精度を高く保つ必要がある。
  • LSP係数は、LSPの順序関係が成立していれば、安定性が保証され、パラメータの感度も次数によってPARCORの場合ほどの差がない。また、LSPは補間特性がよく、スペクトルが滑らかに変化することが明らかになっている。

数学的には等価と書いてあるけど合成した波形は微妙に異なっていて(dmpコマンドでダンプして波形描画で確認可)、音質にも違いがあるように思えるのだけど本当に等価なのだろうか?パラメータは等価だけど分析合成に使うフィルタが違うから波形まで一致しないという理解でいいのかな?

また、スペクトルパラメータによってディジタルフィルタのコマンドがいろいろ違いますが、コマンドのヘルプを見ると

スペクトルパラメータ SPTKコマンド コマンドの説明
ケプストラム mlsadf MLSA digital filter for speech synthesis
LPC poledf all pole digital filter for speech synthesis
PARCOR ltcdf all-pole lattice digital filter for speech synthesis
LSP lspdf LSP speech synthesis digital filter
メル一般化ケプストラム mglsadf MGLSA digital filter for speech synthesis

メル一般化ケプストラムは次回試す予定。パラメータによってディジタルフィルタの種類が違うようです。これらの詳細や違いはまだ理解できていません・・・ディジタルフィルタの理論を勉強中です。

次回は、今まで紹介したさまざまなスペクトルパラメータを統一的に扱えるメル一般化ケプストラムを用いた分析合成を試してみます。また、各手法のスペクトル包絡の形状や音質も比較してみます。

関連リンク

*1:SPTKのインストールディレクトリにパスが通ってないと別のlpcコマンド(linear printer control program)を使ってしまうことがあるので注意