kivantium活動日記

プログラムを使っていろいろやります

友利奈緒の声を求めて

この記事は友利奈緒Advent Calendar19日目の記事です。
www.adventar.org

ちなみに私は友利奈緒判定botを作った方の友利奈緒です。
kivantium.hateblo.jp

はじめに

ここまでの友利奈緒Advent Calendarにおいて友利奈緒を地上に降臨させるべく様々な試みが行われてきました。

友利奈緒の魅力にはいろいろありますが、佐倉綾音さんの演じる声も非常に重要な要素の一つです。友利奈緒を実現する上で佐倉綾音ボイスを再現することが必要不可欠であることは既に指摘されています。そこでこの記事では、声質変換を利用して友利奈緒の声で好きな言葉を喋らせる「声コスプレ」という新概念を提唱し、今後の友利奈緒研究に一石を投じることを目指していきます。

声質変換について

同じ言葉を発していても、声質の違いで誰の声なのか分かることがあるのはみなさんご存知だと思います。話している内容を保ったまま声質を変換する声質変換は音声研究の一つの重要テーマとして研究が続けられています。

広く使われているのは統計的声質変換というアプローチで、混合ガウス分布(GMM)を用いる方法がよく知られています。しかしGMMを用いた多くの手法は変換対象の話者と変換後の話者が同じ内容を話しているデータ(パラレルデータ)が必要であり、取得データが限られている我々にはなかなか扱いにくい状態です。

そんな中、近年はRBMなどの確率モデルを利用してパラレルデータがなくても声質変換が行える手法が発表されるようになっています。

この記事ではGMMを用いたよく知られている手法による実験と、RBMを用いた手法の構想を説明します。

GMMを用いた手法

GMMを用いた手法ではまず参照話者(元の声)と目標話者(変換後の声)のスペクトル特徴量の結合GMM P(x,y)を学習し、入力xが与えられたらP(y|x)が最大となるようにスペクトル特徴量を変換することで声質変換を実現しているそうです。(参考:統計的声質変換クッソムズすぎワロタ - LESS IS MORE

実験は統計的声質変換クッソムズすぎワロタ(チュートリアル編) - LESS IS MOREに従って行いました。環境はUbuntu 14.04です。

データセットの準備

この手法で一番問題になるのは、参照話者と目標話者が同じ内容を話している音声データを用意するのが難しいことです。幸いなことに今回は参照話者、つまり自分の声は自由に集めることができます。そこでまず目標話者のデータとしてCharlotteの友利奈緒が発言しているシーンのうちBGMやSEの入っていない部分を切り抜いてwavファイルとして保存しました。
次に参照話者のデータとして、なるべく息継ぎなどのタイミングが近くなるように気をつけながら集めたシーンのセリフを自分の口で喋って録音しました。録音・正規化・ノイズ除去・開始位置合わせなどの前処理はAudacityで行いました。友利奈緒の声は~/data/tomori/、自分の声は~/data/kawana/に、対応する音声が同じファイル名になるように保存しました。

この作業が一番大変で、4時間くらいかかってようやく40サンプルを用意することができました。はっきりした発音で同じセリフを同じタイミングで言うのは想像以上に大変で、声優という仕事の苛酷さを感じさせられました。自分の声を延々と編集するのはかなりの苦痛だったので正直二度とやりたくないです。ですが、これも友利奈緒の声で好きなセリフを喋らせるためだと思ってなんとか耐えぬきました。

Juliaのインストール

sudo add-apt-repository ppa:staticfloat/juliareleases
sudo apt-get update
sudo apt-get install julia

Juliaのサイトからソースを落としてコンパイルすれば他のOSでも動くかと思います。

必要なパッケージのインストール

sudo pip install sklearn
julia
julia> Pkg.clone("https://github.com/r9y9/VoiceConversion.jl")
julia> Pkg.build("VoiceConversion")

特徴量の抽出

cd VoiceConversion.jl/scripts/
julia mcep.jl ~/data/kawana/ ~/data/jld/kawana
julia mcep.jl ~/data/tomori ~/data/jld/tomori

mcep.jlではメルケプストラムという音声の特徴量を抽出しています。引数にwavファイルのあるディレクトリと、特徴量を保存するディレクトリ(事前に作成する必要があるかも)を指定して実行します。それなりの時間がかかりました。

特徴量の時間同期

いくらタイミングを合わせて録音したとはいえ限界があるので、特徴量を時間同期する処理を行います。

julia align.jl ~/data/jld/kawana ~/data/jld/tomori ~/data/jld/parallel/

差分特徴量の学習

元ネタのページで高品質な変換が行えると紹介されている差分スペクトル補正による手法を採用しました。

julia train_gmm.jl ~/data/jld/parallel kawana2tomori.jld --max 200 --n_components 32 --n_iter=100 --n_init=1 --diff

声質変換の実行

学習結果を利用して、声質変換したい自分の声データから変換後の声データを作成します。

julia diffvc.jl original.wav kawana2tomori.jld result.wav --order 40

結果

この手順で自分の声を友利奈緒ボイスに変換した結果がこちらです。

ノイズが多すぎて聞くに堪えない音質になっている上に、そもそも全然声の質が変わっていません。進捗ダメでした!!

考えられる原因としてはいくつかあって

  • 録音音声のノイズがひどかった

パソコンにつないだマイクという適当な録音環境だったこともあってバックグラウンドのノイズがかなり大きかったのはかなりの問題だと思います。
f:id:kivantium:20151218232942p:plain:w600
上の段が自分の録音音声、下の段が切り抜いた音声です。録音音声はいくらノイズ除去してもノイズが残ってしまいましたが、切り抜いた音声は何も音がないときはノイズなく無音になっています。この差はかなり変換に悪影響を及ぼしそうです。

  • 発音タイミングの差が大きかった

なるべくタイミングを近づけるように努力はしましたが、それでも滑舌などの問題からプログラムで吸収できないレベルのタイミング差が生じてしまっているかと思います。上の波形を見ても全然合っていないことは明らかです。パラレルデータの準備はかなり難しいようです。

  • 声質の差が大きかった

元ネタでは女性→女性の変換を行って結構きれいな結果を出していますが、ここでは男性→女性というかなり差のある変換を行っています。サンプルデータがノイズまみれという悪条件下で異性間の差をうまく変換するのはさすがに厳しいのかもしれません。

これを改善するためには、よりよい録音環境を用意すること・うまく喋れるようになることくらいしか方法がありません。

RBMを用いた方法

GMMで難しかったのはきれいなパラレルデータを用意することでした。パラレルデータを用意するのが難しいならパラレルデータ無しで変換を行えるアルゴリズムを採用するのが正攻法でしょう。既に述べたように、RBMなどの確率モデルを用いた方法の中にはパラレルデータ無しで変換を行える方法が存在します。

探した限りこの論文の実装は公開されていないようですが、偶然なことにRBMの基本原理についてはこの前の記事で既に紹介済みです!
kivantium.hateblo.jp

さらに、論文で使われているRBMの連続値への拡張の基本モデルとなるBernoulliRBMはもうscikit learnに実装されています。これを使えば論文の性能は超えられないにせよコンセプトくらいは追試することができそうです。

これらの論文の基本アイデアとしては、話者データのMFCCからRBMを学習させるとRBMの隠れ値が話者ごとに固有の特徴を表現すると考えて、隠れ値から観測値に戻す方法を話者ごとに変えることで変換を行うというもののようです。というわけでMFCCの抽出とMFCCからのスペクトル復元を実装すればなんとかなりそうな感じがします。この部分の実装が大変かと思っていたのですが、なんとGMM版の元ネタの作者様が特徴量から波形合成を行うプログラムを公開してくださっているようです。(紹介記事: 最近の音声信号処理遊びの進捗 - LESS IS MORE MFCCではなくMGCからの復元のようですが。)

というわけでこれらを利用してRBMによる声質変換を実装したいと思います……



と思っていたのですが、ここで日付が変わってしまったので一旦この記事はここでおしまいにします。進捗が出たらまた更新します。
また、あと5日ほど残っている友利奈緒Advent Calendarの参加者の中に声質変換にチャレンジしようと思ってくださった方がいたら積極的にネタを流用して僕を進捗で殴ってくれると嬉しいです。

以上友利奈緒Advent Calendar 19日目の記事でした。明日の記事はtanakahさんです。よろしくお願いします。