こんにちは、海行です。

VR EXPOでさやカメラを展示した時に、体験者には私の顔がさやかさんに見えていたわけですが、「さやかさんにしては声がオッサン過ぎる」という意見を頂きました。

それはいけませんね。

言われてみれば私はアイアムさやかの頃から外部のボイスチェンジャーソフトを使って動画とか撮影してきました。
フリーソフトのボイスチェンジャーはMorphVOX Jr恋声などがありますね。

いまだにUnityに組み込めるボイスチェンジャーが無いのは不満です。
みなさんもちょっと女性を演じたい時などにボイスチェンジャーが組み込めれば便利ではないでしょうか。

という訳で作ってみました。

デモ動画は上のツイート動画をご覧ください。

Windows用サンプルデモアプリは↓こちらからダウンロードできます。
http://soysoftware.sakura.ne.jp/upload/AssetStore/VoiceChangerFilter/VoiceCangerDemo_UnityChan.zip

デモアプリはともかく、肝心のアセットはどこ?
アセットは現在Unityアセットストアに登録申請を出しています。販売が開始されたら是非購入して使ってみてください!

ただ、windows版しか作れなかったので、結局androidのさやカメラには組み込めないんですよね。
誰かがいずれ技術的課題を解決してくださるのを待ってます!
要望が多かったりしたら自分で移植も試してみたいですね。

技術的な話


さて、ボイスチェンジャーと言っても一体どうやったら作れるのでしょうか?

単純に考えると、私は男性なので、ピッチを上げて声を高くしたら女性っぽく聞こえそうです。
しかし、ピッチを二倍にすると音の時間は半分になってしまいます。

上手い事半分になってしまった音を切り貼りして隙間を埋めたとしても、単純なピッチ変更だけでは出来上がった声は女性というよりテレビで匿名の話すアレになってしまいます。

参考リンク:
タイムストレッチ、ピッチシフトのアルゴリズム
ピッチシフトをしてみよう

恋声などのボイスチェンジャーソフトでは、ピッチとフォルマントを独立して上下させる事が出来ます。
フォルマントと言うのは、あまり詳しくないのですがその人固有の声の性質みたいなものです。

フォルマントを維持したままピッチを上げることができれば、自然な音声を実現できそうです。

早速フォルマントを解析する方法を調べてみましたが、音声処理の素人の私には手も足も出ないという感じでした。

そこで今回は、Worldという音声合成処理ライブラリをお借りしました。
Worldにはドキュメントなどは付いてないですが、作者の方によって書かれたこちらの論文で動作原理が解説されています。

Unity側ではAudioFilterとしてボイスチェンジャーを実装しました。

Worldで処理するにはある程度(0.2秒分ほど)以上の長さの音声が必要なので、バッファに入力音声データを溜めてから逐次Worldで処理する流れになってます。
そのため、どうしても入力から出力までに0.6秒ほどのタイムラグは発生してしまってます。

dll化したWorldのメソッドを同期処理で呼び出してのん気にリターンを待っていたら、マイクの入力データを取りこぼしてしまいます。
今回はThreadを立ててそっちからdll呼び出しをかける事で非同期処理させて解決しました。

参考リンク:
Unityでスレッドを使う – テラシュールブログ
引数を指定してスレッドのメソッドを起動する。

今後の展望


私はこれからはバーチャルの世界で男性が手軽に女性になりきるバーチャル女装の時代が来ると睨んでます。
すでにNEURONやFaceRigなどを使って男性が女の子のキャラクターになりきるみたいな話はどんどん出てきています。

体が女の子になったのならば、当然声も女性化させるというのは今後必須要素になっていくでしょう。
もちろん女性が男性を演じる事もできるでしょうね。

究極的にはバーチャルの中では現実の自分とまったく無関係にどんな人にでもなれる事ができるようになっていくはずです。

その第一歩として今回のボイスチェンジャーフィルタをこれから先バーチャル女装関係のコンテンツを作る際にドシドシ組み込んでいきたいと思います。
みなさんも是非使ってみてください。