こんにちは、海行です。

去年の年末にUnity上でVocaloidが扱えるVocaloid SDK for Unityがリリースされました。

ユニティちゃんライセンスの範囲内であれば無償で使えるという太っ腹なライセンスで提供されています。
私はボーカロイドのソフトは使用した事は無いのですが、タダで遊び倒せるという事ならせっかくなので試してみようと思いました。

UnityからVocaloidを利用できると何が変わるのでしょうか。
今までも初音ミクさんの歌に合わせてMMDモデルを踊らせてみた的なUnityアプリはありました。とは言えボーカロイドの歌の編集とUnityのMMD編集はまったく別々だったので、歌のタイミングに合わせてキャラを口パクさせるような作りをしていたと思います。

Vocaloid SDKによりUnity上で発声させられるようになれば、逆にMMDキャラの口パクに合わせて発声させる事が出来るので、音声とダンスの同期は取りやすくなると思います。
しかし、Vocaloid SDKはアプリ向けにライブラリサイズなどを軽量化されてるため、通常のボーカロイドと比べて音声の質は落ちるようです。
リアルタイム発声だとDAWみたいに豊富なエフェクトはかけられないでしょうし、発声自体もやはりちょっとだけ遅延があったりもするみたいです。

なので、単純に今までボーカロイドでやってた事をSDKで置き換える用途で使う感じではなさそうです。

ポイントとなるのはやはりそのインタラクティブ性ではないでしょうか。
録音済みの歌と違ってプレイヤーの好きな歌詞を歌わせたりできるわけです。

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

マイク入力から音程を取ってユニティちゃんが歌ってくれるというwindowsアプリケーションです。
歌声を音声認識するのは難しそうなので、発音してる言葉までは取ってません、音程だけです。
マイク入力以外にmp3などの歌声ファイルを入力に使う事も可能です。

↓サンプルアプリはこちらからDLできます
https://docs.google.com/uc?id=0B7uH85nrtbOFb0NwVF9Lc3JMbWc&export=download

さて、作っては見たものの、試しにマイクに向かって「かえるのうた」を歌ってみましたが、中々こちらが意図したとおりに音程を取ってくれません。
何だか音痴だと言われてるみたいでイヤになりました。

上のサンプルアプリでもサンプル音声を入れてますが、バッチリ音程が取れている音声ファイルを入力すれば中々良好な結果を返してくれます。
ユーザーが自由にmp3を突っ込んで遊べるようにする事も可能ですが、楽器の音などが混じってるとプログラムからはボーカルと楽器の見分けがつかないのでマトモな結果は帰ってきません。
アカペラ音声を突っ込めばいいんですが、意外とアカペラ音声って手元にないです。
楽曲からボーカル以外を消す加工をするのも思ったより難しいみたいです。
つまり、mp3入力はあまり実用性なさそうですね。

自分の声では音程取りが難しいですが、例えばピアノにマイクを近づけて弾けば大体正確に音程取りする事が出来ます。
しかし、わざわざそこまでするならキーボードから直接MIDI信号を入力した方がマシでしょう。

という訳で、マイク入力のアプローチは保留して、MIDIを入力する方向を攻めてみましょう。

ちょっと改造して作ったのはこれです。

midiファイル(smfファイル)を入力するとmidiの一つ目のトラックを歌ってくれるという物です。
ちなみにmidi自体の楽曲もUnity上から鳴らしています。
midiファイルなら誰でも容易に制作、入手ができますね。

これは中々良好な結果が得られていますが、midiファイルの作り方次第では意図しない発声になったりしてロバストではないです。

それならば素直にVocaloidエディタでmidiファイルをインポート、編集して公式サポートされてるvsqxファイルを作って歌わせる方が健全でしょう。

という訳でだんだん行き詰まりを感じてきたのでVocaloid SDKで遊ぶのは一旦ここまでとしました。

技術的な話


発端は、Unity公式のネイティブオーディオプラグインサンプルにPitch Detectorのサンプルがあったので、これとVocaloid SDK組み合わせればマイク入力で歌わせられるんじゃないか?という事でした。

実際すぐできましたが、とは言えやはりリリースできるようなクオリティに仕上げるのは難しいですね。
ちなみにネイティブオーディオプラグインサンプルはdllしか用意されていないのでこれを使うと対応プラットフォームがwindowsに限定されてしまいます。(Vocaloid SDK for Unityの対応プラットフォームは現在windowsとMacとiOSです。androidは未対応)

次に作ったmidiファイルを歌わせる奴ですが、keijiroさんのsmfliteをお借りしました。
簡単にmidiファイルからmidiイベントを取れます。

発声(ノートオン)のmidiイベントは0x90番ですが、正確には15チャンネルあって0x90~0x9Fまでがノートオンだそうです。

参考リンク:http://www1.plala.or.jp/yuuto/midi/p0201.html

この辺がよくわからない所なんですが、15チャンネルあった所で結局Vocaloid SDKではリアルタイムモードでは同時発声数は1つだけっぽいので別の音を発声させたら前の音は消えます。(全パートユニティちゃんの合唱とボイパで歌わせられたら面白そうなんですけどね)

さて、せっかくならユニティちゃんのボイス単体だけでなく、伴奏も欲しいですね。
Unityでmidiを鳴らすには、↓こちらの記事を参考にしました。
UnityでMIDIを再生する – n-yoda’s blog

GitHubのサンプルプロジェクトを実行したら、あっけなくmidiが再生できてしまいましたが、これは相当凄い事だと思います。

前述のtwitter動画はsmfliteを使って歌わせたユニティちゃんボーカルとunity-midiで鳴らした楽曲を無理やり手動で同期させて合わせてます。
もちろんそんな実装では駄目です。

あとからunity-midiに統合してunity-midiからイベントを拾ってユニティちゃんを発声させることでちゃんと同期するようにしました。

その他参考にした話

・すでにVocaloid SDKを触られてる方々の記事が参考になります。

VOCALOID SDK for UnityでSDユニティちゃんをリップシンクさせる – LotosLabo

Mtk’s Blog: VOCALOID SDK for Unityでユニティちゃんにvsqxを歌わせる方法

Mtk’s Blog: VOCALOID SDK for Unity でユニティちゃんをリアルタイムに歌わせる方法

・マイク入力の音量が一定以下ならノートオフと判定する処理を作りましたが、現在の入力音声の音量を計算する方法は↓こちらの記事のGetAveragedVolume()を参考にしました。
マイク入力の音量を用いてオブジェクトを呼び出すサンプル【Tips】

・Unity5ではAudioSourceの出力をオーディオミキサーにして、オーディオミキサーごとにエフェクトをかけたり音量調節ができます。
スクリプトからオーディオミキサーの音量を調節するのは↓こちらの記事を参考にしました。
Unity 5で音量を調整する方法 – テラシュールブログ

ちなみにアクセスするためにコンポーネントにオーディオミキサーをアタッチする必要もありますが、プロジェクトビューのオーディオミキサーをアタッチするとScriptableObjectみたいな感じで共有されます。

・前述のtwitterの動画で使用しているmidiファイルは↓こちらからお借りしました。
http://www5b.biglobe.ne.jp/~pst/douyou-syouka/

・Vocaloid SDK for Unityのライセンスについてですが、アプリケーションを配布する場合、どこかユーザーが見えるところにライセンス表記する必要があります。なおかつアプリにライセンス表記ファイルを同梱する必要があります。
http://business.vocaloid.com/unitysdk/copyright/

今後の展望


現時点でいくつかアイデアはありますが…

1.俳句を詠ませる

インタラクティブに歌ってもらうならいっそ詠ってもらうのはどうだろうかという思い付きです。
しかし、「ボーカロイド 俳句」でググッたら↓こんなものが見つかりました。

俳句ブーム来た!?セガの俳句ボカロアプリ『うた詠み575』がスゴイ

完全にかぶりましたね…しかも3年先行されてるし

2.DAWにする

せっかくUnityでmidiを鳴らせる方法も分かったのでいっそピアノロールを実装して本格的なボーカロイド付き楽曲制作シーケンサーソフトを作ってスマホアプリでリリースしたら面白いのでは?とも思いますね。

しかしすでにヤマハさんはすでにMobile VOCALOID Editorをリリースしてます。

http://www.vocaloid.com/lineup/ios/

じゃあわざわざ作るまでも無い気がしてきますね。

3.音痴なボーカロイド

マイク入力で音程を取る奴は、中々意図したとおりの音程が取れなくて音痴になった気分でイヤと言う話をしました。
この問題を逆手にとって、こっちが入力したとおりの周波数のまま音痴に歌ってもらうという案です。

ボーカロイドはシンセなので普通は半音ごとの音階で歌うのが当たり前ですが、ピッチベンドを駆使したら任意の周波数で歌ってもらう事は出来るような気がします。

音痴なシンセなんて聞いたこともないのでやってみるのも面白いかもしれません。

本記事は以上になります。
また何か面白い結果が出せたら記事を書きたいと思います!