人工知能に関する断創録

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

統計的声質変換 (3) メルケプストラムの抽出

統計的声質変換 (2) ボイスチェンジャーを作ろう(2015/2/25)の続き。

前回は音声から抽出したメルケプストラムやピッチのパラメータを直接いじることで簡単なボイスチェンジャーを作った。今回からAさんの音声をBさんの音声に変換する規則を機械学習の手法で学習する声質変換の実験をしていきたい。今回は学習データとなる音声データをダウンロードするところとメルケプストラムを抽出するところまで。

音声データのダウンロード

チュートリアルと同じようにCMU ARCTIC Databasesという公開データを使う。このデータは7名の英語話者が同じ文章を朗読した音声がついている。今回作る統計的声質変換の手法は、変換元のAさんと変換先のBさんが同じ文章を読んだ音声が必要になるのでちょうどよいデータ。英語なのが残念。日本語の音声は探したけどなかった。あとで自分の声でやってみたい。

一括ダウンロードするスクリプトは、download_cmu_arctic.shをお借りした。curlというコマンドがなかったのでインストール。Windowsの場合はCygwinについている。

ダウンロードするとFestvox用のデータがいろいろついているけど今回必要なのは各話者のwavだけ。そのためwav以外は削除して下のようなディレクトリ構造にした。

% ls wav
awb/     bdl/     clb/     jmk/     ksp/     rms/     slt/

% ls wav/clb/
arctic_a0001.wav     arctic_a0002.wav ...

awbなどは話者IDみたい。各話者1132文を収録しているようだ。フォーマットは16kHz、16bit、monoだった。

こんな声

clb

slt

bdl

rms

今回の実験ではチュートリアルと元論文にならって

  • 女性のclbさんの声をsltさんにするモデル
  • 男性のbdlさんの声をrmsさんにするモデル

の二種類を実験していきたい。今回の実験ではメルケプストラムしか変換しないので男声を女声にするのは難しいと思われる。男声と女声ではピッチ(声の高さ)がだいぶ違うので。たぶん、ピッチも変換モデルを学習すればよいと思うのであとで試してみたい。

メルケプストラムの抽出

まずは音声データからメルケプストラムを抽出する。チュートリアルではWORLDを使っているけど今回はSPTKを使った。SPTKは今までもけっこう活用していたので。SPTKを使ったメルケプストラムの抽出は下の記事を参照のこと。まあ前回のボイスチェンジャーを作ろうでも使ってたけど。

音声データからメルケプストラムを一括抽出するスクリプト。

python extract_mcep.py wav/clb mcep/clb
python extract_mcep.py wav/slt mcep/slt
python extract_mcep.py wav/bdl mcep/bdl
python extract_mcep.py wav/rms mcep/rms

のようなコマンドを実行するとmcepディレクトリの下にメルケプストラムが保存される。あとでnumpyを使って簡単にデータを読み込めるようにテキスト形式で保存している。ファイルを開くと1行に1フレーム分のメルケプストラム係数(26次元データ)がずらずら並ぶファイル形式になっている。SPTKのmcepコマンドの-mオプションに指定するメルケプストラム次数は25次だけど0次元目にパワーの値が入るので実際は26次元のベクトルになる。ここがずれているのに気がつかなくてはまった・・・

メルケプストラムの描画

clbさんとsltさんのメルケプストラムを比較してみたい。メルケプストラムは26次元の時系列データなので全部表示するとわかりにくくなる。というわけで0次(order=0)、1次(order=1)、2次(order=2)の値をそれぞれ描画してみよう。横軸が時間(フレーム)になる。

f:id:aidiary:20150304211440p:plain f:id:aidiary:20150304211457p:plain f:id:aidiary:20150304211503p:plain

同じ文章(音韻)をしゃべっているため概形は似ているが、話者によって細部の形が異なることがわかる。この違いが個人の声質の違いを表すそうだ。あとしゃべる速さが違うこともあり、山のフレーム位置がずれていることがわかる。次回に紹介するDTWというアルゴリズムを使うとこのずれを補正できる。