オルトプラスエンジニアの日常をお伝えします!

Unity with VOCALOIDを触ってみる

※この記事は「Altplus Advent Calendar 2016」の22日目の記事です。

こんにちは。

どうせやるならと思いまして、昨年から気になっていたUnity with VOCALOIDを触ってみます。

そもそもUnity with VOCALOIDっていったい何?という話ですが、 「VOCALOIDを用いてUnityで音声の合成ができる」という、とても夢が広がる技術だそうで、発表があってからずっと気になってはいたものの、感覚的にはイマイチ盛り上がってないのかなーと感じています。(どうでしょう?)

でも、動的に歌声を生成することが出来るなんてすごいじゃないですか。もうちょっと盛り上がっても良いと思うんですよね。 ということで紹介してみます。

それでは早速やっていきたいと思いますが、 といっても、正直順を追って説明できるレベルのものではなかったので、ヤマハ公式サイトに置いてある、「サンプルプロジェクト3種類同梱パック」の「CreateSequence demo」を元に改変して今回のネタとしました。 とりあえず軽くポイントとなる箇所だけ説明します。

エンジンの起動とモードの設定

まずはエンジンを起動します。staticなYVFクラスを取り回す感じです。プラットフォーム毎にnamespaceが違うので、クラスのインポートの部分がこんな感じに。。。

#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
using Yamaha.VOCALOID.Windows;
#elif UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
using Yamaha.VOCALOID.OSX;
#elif UNITY_IOS
using Yamaha.VOCALOID.iOS;
#endif
using UnityEngine;

public class Hoge : MonoBehaviour {
    void Start () {
        YVF.YVFStartup("personal", Application.streamingAssetsPath + "/VOCALOID/DB_ini");
    }    
}

起動後、モードの設定をします。 大きく分けて

  • Playback合成モード
  • Realtime合成モード

の2つのモードがあるようです。

ざっくり言うと、Playbackの方が、事前に用意したデータで発声、Realtimeの方が、その瞬間に合成して発声するものの様です。 Playback合成モードは最初に出来た曲があって、それをいじったりするという時に使う。(VSQXファイルを再生できる模様) Realtime合成モードは、たとえばボタンを押すなどした時にリアルタイムで音声を発声させたい時に使う。という感じでしょうか?

// PlayBack合成モードの場合。引数はエンジンのインスタンス数で、並列で歌声合成処理を実行する必要がない場合は1を設定する。
YVF.YVFResult result = YVF.YVFSetStaticSetting(engineCount);
// Realtime合成モードの場合。512はバッファサイズ。
YVF.YVFResult result = YVF.YVFRealtimeSetStaticSetting(YVF.YVFRealtimeMode.Mode512);

今回改変したサンプルはシーケンスを作って再生するというものなので、PlayBackモードになっています。

ノートの編集

実はこの間に色々あるのですが、ごめんなさい。省略します。 今回肝となる、ノートの編集部分です。ノートを編集し、シーケンスを作成→再生する。という流れになります。 ノートに音階や長さ、発生する単語などを設定します。

// ノートの編集.
List<VocaloidNote> melody = new List<VocaloidNote>();
VocaloidNote nt = new VocaloidNote();

string jsonData = "{\"noteArray\" : [{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"じ\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"ん\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"ぐ\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"る\"},";
jsonData += "{\"noteLength\" : 720,\"noteNumber\" : 76,\"lyricStr\" : \"べ\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"る\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"じ\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"ん\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"ぐ\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"る\"},";
jsonData += "{\"noteLength\" : 720,\"noteNumber\" : 76,\"lyricStr\" : \"べ\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 76,\"lyricStr\" : \"る\"},";
jsonData += "{\"noteLength\" : 480,\"noteNumber\" : 76,\"lyricStr\" : \"す\"},";
jsonData += "{\"noteLength\" : 480,\"noteNumber\" : 79,\"lyricStr\" : \"ず\"},";
jsonData += "{\"noteLength\" : 720,\"noteNumber\" : 72,\"lyricStr\" : \"が\"},";
jsonData += "{\"noteLength\" : 240,\"noteNumber\" : 74,\"lyricStr\" : \"な\"},";
jsonData += "{\"noteLength\" : 720,\"noteNumber\" : 76,\"lyricStr\" : \"る\"}";
jsonData += "]}";

NoteArrayModel noteArrayData = JsonUtility.FromJson<NoteArrayModel>(jsonData);

int StartTime = preTick;
for ( int i = 0; i < noteArrayData.noteArray.Count; i++ ) {
    nt.ClearNote();
    nt.Note.noteTime = StartTime;
    nt.Note.noteLength = noteArrayData.noteArray[i].noteLength;
    nt.Note.noteNumber = noteArrayData.noteArray[i].noteNumber;
    nt.Note.lyricStr = noteArrayData.noteArray[i].lyricStr;
    StartTime += nt.Note.noteLength;
    melody.Add( new VocaloidNote(nt) );
}

今回、最低限で音階と長さと言葉のみ設定しています。ノートの登録は楽してjsonにしちゃいました。 こういうとき、unityのJsonUtilityは便利ですね。 NoteArrayModelというモデルクラスを作って、jsonデータをデシリアライズして、ぐるぐる回してます。 リファレンスにC4=72とありましたので、音階はそれに合わせて設定しました。 ド=72 レ=74 ミ=76 ファ=77 ソ=78 ラ=80 シ=81 ド=82 こんな感じかと思います。

歌声合成の実行

最終的に歌声を合成して実行します。 ソースコードについては説明できるだけの知見を得ることが出来なかったので割愛します。 サンプルソースコードやセミナーの資料にかなり詳しく書いてありますので、そちらを参照しましょう。

できたもの

windows版実行ファイル

Mac版実行ファイル

リポジトリはこちら

*Unityのバージョンは5.5です

*VOCALOID SDKのバージョンは1.3.0.0です

*動作には別途VOCALOID SDKをダウンロードし、インポートしてください。

http://business.vocaloid.com/unitysdk/download/

所感

サンプルの改変とはいえ、結構簡単に音声合成が出来るのは魅力です。 今回触りませんでしたが、音色などもかなり細く設定できるようになっています。 ゆっくりしていってね!でおなじみのSoftTalkの上位版みたいなものはサクッと作れそうな感じでした。

そして、以下感じた問題点です。

  • なにをやっているのかを読み解くコストが結構高い
  • モバイルでのパフォーマンスが少し心配
  • 現状、利用できる音声ライブラリがユニティちゃんのみ

これらが解消されていくと、より広がっていける。かもしれないですね。

以上です。ではまたどこかで。

ゲームジャムに参加しましょうー!

※この記事は「AltPlus Advent Calendar 2016」の21日目の記事です。

※日本語で記事を書くのは初めてですので、分からない部分があれば、教えてもらえればとの事です!

はじめに

皆さん、こんにちは!今年の8月に入社した Unity エンジニアーのバイロンです!この記事では、ゲームジャムのお話しをします!多分ゲーム業界で働いてる人はご存知だと思うのですが、「まだゲーム業界に入ったばかりの人」、「ゲーム業界で働いてみたい人」、「自分のゲームを作ってみたい人」ー そんな人向けに書いてみました。ゲーム作りにパッションがある方で、まだゲームジャムに参加した事が無い方はぜひ読んでもらいたいです!

ゲームジャムとは何か

「ジャム」と言う言葉は音楽家がよく使うフレーズで、「集まって曲を作る」と言う意味があります。それを元に、ゲームジャムとは色々な人が集まってゲームを短時間で作るイベントです。制限時間はゲームジャムによりますが、平均で言うと、24〜48時間です。ゲームジャムのイベントではいつもゲームのテーマがありまして、それをベースにしてゲームを作ると言うイメージですね。

そこで今一番有名なゲームジャムが (GGJ) Global Game Jam です。GGJ 毎年開かれるイベントで、今年の一月に93国から、3万6千人以上の参加者が同時にゲームを作りました。GGJでは、各場所にイベント会場がありまして、そこで参加者の皆さんが集まり、自己紹介、チームを組み、テーマの公開を待ち、48時間の短い時間でゲームを作ります。来年の2017年1月にまたゲームジャムが開かれるので、こちらのリンク でイベント会場を探してみましょう!

「参加者に何のメリットがあるんですか?」

そうですねー。ゲームジャムは基本コンクールとは違うので、賞品・賞金とかはもらえません。イメージとしては、「自分が一生懸命作ったゲームが一番の賞品」っと言うロマンチックな感じかなー?

多分人によって参加する目的が違ってくると思うんですが、良く有るのが「自分のアイデアを試したい」、「自分の限界を超えてみたい」、「ゲームを作ってみたい」、「ゲームを作る仲間が欲しい」、とかですかね。そんな感じな人がゲームジャムに集まります。

そう言う事なので、メリットは自分の成長・野望・パッション(?)ってところかなー。でもそんなに真剣に考えなくても、少しでも「なんかゲーム作りたいなー」って気持ちがあれば、それで十分だと思います。

「でも自分はゲームを作った事が無い」。。

または「ゲームを作れる自信が無い」、「足手まといになる」、と言う風に思ってる人には、怖がらず、参加してもらいたいです。自分も来年のゲームジャムで5年目になるのですが、毎回「足手まといになりたくない」、「ダメなゲームは作りたくない。。」と言う気持ちでいっぱいです。多分ゲーム業界で働いてる人はそう言う「怖い」と言う感情と向き合って仕事をしているのでしょう。(デザイナー・プランナーさんは特に)

ゲームジャムに参加する人は、そう言う怖さを知ってるので、皆さんは怖がらず、自信がなくても参加しましょう! あと、一人でゲームは作れないのは当たり前なので、「分からない部分」または「これ自分は出来ない事わ。。」って事がある場合は、チームメイトに任せましょう。

まとめ

次のGGJは1月20〜22日になりますので、ぜひ参加してください!その日にちに来れ無い人は、Ludum Dareをお勧めします。Ludum Dareのゲームジャムはネット上で行われるので、自分の家・カフェからゲームを作るっと言う感じですね!

最後まで読んで下さってありがとうございます!

Global Game Jam
Ludum Dare

0から作るVSTプラグイン制作 vol.1

※この記事はAltPlus Advent Calendar 2016の20日目の記事です。

お疲れ様です。新卒の山端です。会社ではクライアント側のプログラムを担当させていただいてます。本日は『0から作るVSTプラグイン制作 vol.1』というタイトルで、記事を書かせていただきます。vol.1 ではVST Pluginがどういったものか〜制作環境のインストールまでについてまとめさせていただきます。

 

0.はじめに

今回の記事ですが、VSTプラグイン制作未経験者である筆者が、できるだけ楽な道を選んでVSTプラグインを作っていくという内容になります。そのため誤った内容が多数あるかと思います、お気づきの方はコメントなどでご指摘いただけますと幸いです。


1.VSTプラグインって何?

それではまず初めに今回製作しようとしているVSTプラグインについて説明をさせていただきます。波形編集を行ったことがる方にはなじみがあるかと思いますが

VST(Steinberg's Virtual Studio Technology)はシンセサイザーやエフェクター・プラグインと波形編集ソフトウェアやDAW(統合型の音楽制作環境)間のリアルタイムなデータ受け渡しを担い、波形編集するプログラムを『プラグイン』として提供するための標準的な規格の一つとなります。

つまり、VSTプラグインとは、VSTと言う規格で【波形編集ソフト】や【楽曲制作環境】と連携して波形を入出力できるソフトウェアのことを言います。

f:id:kazuha-yamahata:20161220192854p:plain

VSTプラグイン 『Harmor』


2.VSTプラグインを使うと何ができるの?

VSTプラグインを使うと、VST形式に対応した音声編集環境間で波形を入出力することが可能です。
つまり、VSTプラグインを作ると『VST形式に対応した音楽制作環境』で『自分の書いたコードによって処理をした音』を出力することができます。

f:id:kazuha-yamahata:20161220192822p:plain

VSTを使用する音楽制作環境 『FLStudio』


3.VST制作の方法

VSTプラグインの制作方法は様々ですが一番メジャーな方法は、C++とSDKを使っての作成方法となります。一般で市販されているVSTプラグインもほとんどがこの方法で制作されているかと思います。ですが、C++を使っているため波形処理・GUIの作成等もすべてコードを記述して実装せねばならず、0から始めるにはハードルがとても高いです。(その分、動作速度や細かいチューニングが可能です。)そのため、今回は別の方法をとることにしました。それが次に説明するPureDataを使った方法です。


4.PureDataについて

PureDataはオープンソースのマルチメディア作成用ビジュアルプログラミング言語で、
演算機能をもつオブジェクト同士を視覚的に接続していくことでフローを作成し、データを処理します。PureDataは信号処理ソフトウェアとして44100 サンプル毎秒のサンプリング周波数と64サンプル毎に1ブロックの制御レートを実現しており、波形処理に関する様々な機能を持っているため、複雑な波形処理をオブジェクト1つを接続することで簡単に実現することができます。

このPureDataで作成した波形編集を行うパッチをpdvstPD Pulpを使うことで各種VSTホストに接続できるようにすることで、今回はVSTプラグインを実装していきます。

f:id:kazuha-yamahata:20161220200418p:plain

PureDataによるパッチ


5.PureDataのインストール

Puredataはこちらからダウンロードしてインストールを行います。リンク先より自分の環境にあったインストーラーを選択します。(自分はWindowsのインストーラーを選択しました。)

インストール設定は基本的に初期設定のままで問題ありません。『追加タスクの選択』画面でCreate a desktop iconを選択するとデスクトップ画面にショートカットが作成されるため、選択しておくといいかもしれません。

f:id:kazuha-yamahata:20161220192846j:plainf:id:kazuha-yamahata:20161220192849j:plain

PureDataのインストーラ

 

インストール完了後にデスクトップにできているアイコンを実行するとPureDataの実行画面が開きます。これでPureDataの開発環境は整いました。あとは実際にコードを書いていくのみとなります。そんな所で、今回の記事は以上となります。 

f:id:kazuha-yamahata:20161220192851p:plain

PureDataの実行画面

 

次回の記事では実際にPureDataを使って音声波形を編集するところまでまとめさせていただこうと思います!最後までお読みいただきありがとうございました。