こんにちは。エンジニアのAraoです。今回は、音声分析変換合成システムWORLDを使って声質変換を行う方法を紹介します。

声質変換とは

一口に声質変換と言っても、様々な種類があります。発話に対してリアルタイムで変換を行うのか、それともあらかじめ収録した音声を変換するのか、声の高さを高く(低く)するだけなのか、それとも発話内容はそのままに目標とする話者の声に変換するのか、などです。

この記事では、あらかじめ収録した音声ファイルに対して、声の高さを高くすることにします。

WORLDとは

WORLD

山梨大学の森勢先生が開発した、音声分析変換合成システムです。人間が発話した音声から、声の高さなどのパラメータを高精度で抽出することができます。

この記事では、WORLDによって抽出した基本周波数とスペクトル包絡を実数倍することで、声質変換を実現します。

人間の発声の仕組み

厳密に説明すると長くなってしまうので、今回の声質変換で関係してくる部分に絞って説明します。

人間は喉に声帯を持ち、その声帯を振動させることで音を発生させていますが、声帯の振動で発生する音はブザーのようなもので、これだけでは何を言っているのかわかりません。実際の人間の発話は、声帯の振動によって得られた音源を、喉から口までの声道でいい感じに共鳴させることで得られます。つまり、声帯で生まれる音源と、その音源を加工する声道、その両方の機能をそれぞれモデル化することで、人間の発話をモデル化できる、と思ってください。

実際の人間の発話では、無声音と呼ばれる声帯が振動しない音もありますが、ここでは説明を割愛します。

基本周波数、スペクトル包絡とは

基本周波数とは、声の高さを表すパラメータで、声帯で生じる振動の周波数のことです。男性の場合、だいたい100Hzから150Hz程度で、女性はその倍ぐらいと言われています。

スペクトル包絡とは、音声の周波数成分の強さを表すスペクトルの大まかな形を表すパラメータで、人間の声道の特性を表しています。声の高さが同じぐらいの人でも声色が異なるのは、声道の形状の違いによります。

実際にやってみよう

まずは、GitHubで公開されているWORLDのC++版をcloneします。

$ git clone git@github.com:mmorise/World.git
$ cd World

サンプル音声を聞いてみましょう。Macの場合はafplayコマンドが使えますが、各自好きな方法で確認してみてください。

$ afplay test/vaiueo2d.wav

成人男性の声で、「あいうえお」と発音しているのがわかります。

次にサンプルコードをビルドするのですが、現在公開されている最新版では、サンプルを実行すると3種類の音声ファイルが出力されるようになっています。それぞれ細かい手法が異なるようなのですが、今回使用するサンプル音声では違いがほとんどわからないため、サンプルコードに手を加え、1番目の手法のみを使うようにします。

$ vi test/test.cpp

442行目の、「Synthesis 1」を使う場合、425行目の"01%s""%s"に修正し、428行目から438行目までの「Synthesis 2」と「Synthesis 3」をコメントアウトします。それが完了したらmakeでビルドします。

$ make

さて、無事にビルドが完了したら、早速パラメータ変換による声質変換をしてみましょう。サンプルの使い方は、以下の通りです。

$ mkdir result
$ build/test test/vaiueo2d.wav result/vaiueo2d_1.0_1.0.wav 1.0 1.0
$ afplay result/vaiueo2d_1.0_1.0.wav

パラメータを変更しながら何回も変換を行うために、結果を保存する用のディレクトリresultを作成しています。変換時は、入力音声、出力音声、基本周波数を何倍するか、スペクトル包絡を何倍するかを順に引数で指定します。この例では、どちらも1.0倍、つまり抽出したパラメータをそのまま使って合成しています。そのため、出力された音声を聞いてみると、オリジナルの音声とほぼ同じ声になっています。

次は、基本周波数を2倍にして、女性の声っぽくしてみましょう。

$ build/test test/vaiueo2d.wav result/vaiueo2d_2.0_1.0.wav 2.0 1.0
$ afplay result/vaiueo2d_2.0_1.0.wav

いかがでしょうか。確かに声は高くなっていますが、おじさんが無理して高い声を出しているような感じになってしまいました。これはなぜかというと、男性と女性とでは、声帯の周波数だけでなく、声道の形状(長さ)も違うからです。というわけで、声道の特性を表すパラメータのスペクトル包絡も変換しましょう。

$ build/test test/vaiueo2d.wav result/vaiueo2d_2.0_1.3.wav 2.0 1.3
$ afplay result/vaiueo2d_2.0_1.3.wav

いかがでしょうか。ちょっとボーイッシュな若い女性の声っぽくなりましたね。ここではこれぐらいにしておきますが、皆さんもいい感じの声を求めて、ちょうどいい変換係数を探してみてください。

まとめと課題

WORLDで基本周波数とスペクトル包絡を変更することにより声質変換を行うことができました。しかし、今流行りのVTuberの発話音声として利用するには、やや物足りない品質だったかと思います。この手法では抑揚のつけ方などの話し方の特徴は変換できないため、例えば男性の声から女性の声に変換する場合、最初から女性っぽい話し方を意識して発話を行う必要があります。

また、この手法とは根本的に異なる声質変換の手法として、話者適応という技術があります。これは統計的な手法に基づき、Aさんの声からBさんの声への変換を目指すもので、最近はニューラルネットワークを利用したものが盛んに研究されています。

これらの手法全体に、入力音声にノイズが混ざっている場合に品質が落ちるという課題があります。先ほど使ったサンプル音声はノイズの含まれていないクリーンな音声でしたが、実際に部屋で録音してみると、エアコンの音や冷蔵庫の音などが含まれてしまい、パラメータの抽出が上手くいかなかったりします。

ルーターでは、ヴォイスインターネットの一環として、高品質な発話音声生成を目指すVOICECLOUDプロジェクトが進行中です。音声関連技術に関する勉強会も随時実施していますので、ご興味のある方はぜひご連絡ください。