515 Views
July 15, 17
スライド概要
2016/7/30に開催されたUnity道場のスライドです。
講師:山本尚希・村上祐輝(ヤマハ株式会社)
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
Unity 道場 【セミナー】Unity with VOCALOID の歩き方 ©2016 VOCALOID Group, Yamaha Corporation 2016.7.30
Twitter ハッシュタグ #VOCALOID #Unity道場 ©2016 VOCALOID Group, Yamaha Corporation 2
Index • VOCALOID • Unity with VOCALOID – インタラクティブコンテンツへの応用と期待 – VOCALOID SDK for Unity – 歌声ライブラリとアプリ開発 • VOCALOID SDK for Unity の使い方 ©2016 VOCALOID Group, Yamaha Corporation 3
VOCALOID™ ©2016 VOCALOID Group, Yamaha Corporation
VOCALOID とは • いくつかの文脈がありますが... • VOCALOID is ... • 歌詞と音符を入力することで高品質な歌声を合成することができる 技術およびソフトウェア SINGER unity_chan ©2016 VOCALOID Group, Yamaha Corporation 5
VOCALOID とは 歌声合成システム 歌詞 音符 表情 UI (歌詞, メロディ等の編集) → 合成エンジン (歌声を作り出す) → 合成音 ↑ 歌声ライブラリ (歌声素片を集めたもの) ©2016 VOCALOID Group, Yamaha Corporation 6
VOCALOID とは VOCALOID エディター 歌詞 音符 表情 UI (歌詞, メロディ等の編集) → 合成エンジン (歌声を作り出す) → 合成音 ↑ 歌声ライブラリ (歌声素片を集めたもの) 伴奏 ♪♪ ©2016 VOCALOID Group, Yamaha Corporation 7
VOCALOID エディター のちほど, 動作しているところをお見せします 音符, 歌詞設定 ミキサー 表情(歌い方)設定 エフェクト ©2016 VOCALOID Group, Yamaha Corporation 8
VOCALOID とは 歌詞 音符 表情 UI (歌詞, メロディ等の編集) → 合成エンジン (歌声を作り出す) → 合成音 ↑ 歌声ライブラリ (歌声素片を集めたもの) VOCALOID ライブラリ ©2016 VOCALOID Group, Yamaha Corporation 9
VOCALOID 合成の仕組み • “素片連結型” の合成方式 – 人間の歌声を収録し, 切り出した声の部品をなめらかに繋ぐことで 任意の歌声を生成 • 歌声ライブラリ – 「ある音素から次の音素へ声が移り 変わる部分」と「伸ばす部分」を用意 – あらゆる音素の組み合わせを登録 • 日本語の場合 約500個〜 • 英語の場合 約2,500個〜 歌声ライブラリ #a a-a a# a #k k-a a-k i #s s-a a-s M #t t-a a-t e ©2016 VOCALOID Group, Yamaha Corporation 10
VOCALOID 合成の仕組み • “素片連結型” の合成方式 – 人間の歌声を収録し, 切り出した声の部品をなめらかに繋ぐことで 任意の歌声を生成 • 歌声ライブラリ – 「ある音素から次の音素へ声が移り 変わる部分」と「伸ばす部分」を用意 – あらゆる音素の組み合わせを登録 • 日本語の場合 約500個〜 • 英語の場合 約2,500個〜 歌声ライブラリ #a a-a a# a #k k-a a-k i #s s-a a-s M #t t-a a-t e “朝 (a sa)” [#a a-s s-a a a#] #a a-s s-a a a# 単純に接続 信号処理で 滑らかに ©2016 VOCALOID Group, Yamaha Corporation 11
VOCALOID とは 歌詞 音符 表情 UI (歌詞, メロディ等の編集) → 合成エンジン (歌声を作り出す) → 合成音 ↑ 歌声ライブラリ (歌声素片を集めたもの) ボカロキャラクター ©2016 VOCALOID Group, Yamaha Corporation 12
VOCALOID とは 歌詞 音符 表情 UI (歌詞, メロディ等の編集) → 合成エンジン (歌声を作り出す) → 合成音 ボカロ曲 ↑ 歌声ライブラリ (歌声素片を集めたもの) 伴奏 ©2016 VOCALOID Group, Yamaha Corporation 13
unity WITH VOCALOID™ ©2016 VOCALOID Group, Yamaha Corporation
インタラクティブコンテンツへの応用と期待 unity WITH VOCALOID™ ©2016 VOCALOID Group, Yamaha Corporation
Unity with VOCALOID Unity アプリケーション上でリアルタイム歌声合成 Unity with VOCALOID は、VOCALOID がもたらす表情豊かな 歌声合成と、Unity が志向するゲーム/コンテンツ開発の世界観とが 出会うプロジェクトです。 歌声のリアルタイム合成を実現する特別な VOCALOID エンジンが、 これまでの音楽制作の枠を超えた、歌によるインタラクティブな 体験価値を提供します。 http://business.vocaloid.com/unitysdk/ つまり... ©2016 VOCALOID Group, Yamaha Corporation 16
何が変わるの? -これまで- ゲーム/アプリで歌声を扱うとき... これまで 事前準備したオーディオを利用 そのまま使うか, 動的に変化させる にしても, 波形処理的な効果や 差し替えに限定 事前に作った音楽をそのまま流す 歌のインタラクティブ性は無し 部分的なオーディオ素材を組み合わせる 自由度が限定される ©2016 VOCALOID Group, Yamaha Corporation 17
何が変わるの? -これから- ゲーム/アプリで歌声を扱うとき... これから ランタイムに歌声合成を実行 動的にシーケンス情報 (メロディ, 歌詞, 歌声, シンガー...) を変更可能 VSQX (VOCALOID シーケンス) メロディ 歌詞 表情・声色 テンポ シンガー アプリ 何らかの トリガや 情報 合成エンジン + 歌声ライブラリ 歌声の合成音 インタラクションに応じて, 簡単に歌を変化させることができる ©2016 VOCALOID Group, Yamaha Corporation 18
コンテンツと歌声の関係性 パッケージ・コンテンツ VSQX インタラクティブ・コンテンツ VOCALOID SDK ©2016 VOCALOID Group, Yamaha Corporation 19
想定される用途 音楽ゲーム 楽器アプリ unity WITH VOCALOID™ バーチャルライブ メディアアート コミュニケーション & UI ツール HCI・AI・VR 応用 ©2016 VOCALOID Group, Yamaha Corporation 20
VOCALOID SDK for Unity unity WITH VOCALOID™ ©2016 VOCALOID Group, Yamaha Corporation
VOCALOID SDK for Unity VOCALOID の歌声合成機能を Unity 上で使うための SDK • VOCALOID シーケンスを – 読み込んで/生成して – 編集して • 歌声合成処理の実行 (歌声の合成音の取得) ができる VSQX (VOCALOID シーケンス) メロディ 歌詞 表情・声色 テンポ シンガー アプリ 何らかの トリガや 情報 合成エンジン + 歌声ライブラリ 歌声の合成音 ©2016 VOCALOID Group, Yamaha Corporation 22
システム概要 Unity アプリケーション上位層 • VSQX ロード命令 • シーケンス編集命令 • 歌声合成命令 • かな (歌詞情報) • シーケンス情報 • 歌声合成波形 (16bit/44.1kHz リニア PCM) • 発音記号 VOCALOID SDK for Unity VOCALOID プラグイン 歌声ライブラリ シーケンス データ (VSQX) 合成エンジン, 歌声ライブラリは モバイル向けに軽量化 • 対応プラットフォーム • Unity 5.2.2 以降 ターゲット • Windows 7 / 8.1 / 10 • OS X 10.10 / 10.11 • iOS 8.4 / 9.3 • Android (評価中) ©2016 VOCALOID Group, Yamaha Corporation 23
VOCALOID プラグインを使った発音プロセス Unity アプリケーション上位層 VOCALOID プラグイン 歌声ライブラリ シーケンス データ (ファイル) ©2016 VOCALOID Group, Yamaha Corporation 24
VOCALOID プラグインを使った発音プロセス Unity アプリケーション上位層 [プラグイン起動, シーケンスデータのロード] VOCALOID プラグイン 歌声ライブラリ シーケンス データ (ファイル) ©2016 VOCALOID Group, Yamaha Corporation 25
VOCALOID プラグインを使った発音プロセス Unity アプリケーション上位層 VOCALOID プラグイン 歌声ライブラリ シーケンス データ (オンメモリ) ©2016 VOCALOID Group, Yamaha Corporation 26
VOCALOID プラグインを使った発音プロセス Unity アプリケーション上位層 ([シーケンスデータの編集]) [歌声合成の実行] VOCALOID プラグイン 歌声ライブラリ シーケンス データ (オンメモリ) ©2016 VOCALOID Group, Yamaha Corporation 27
VOCALOID プラグインを使った発音プロセス Unity アプリケーション上位層 歌声合成波形 (16bit/44.1kHz リニア PCM) VOCALOID プラグイン 歌声ライブラリ シーケンス データ (オンメモリ) ©2016 VOCALOID Group, Yamaha Corporation 28
VOCALOID プラグインを使った発音プロセス Unity アプリケーション上位層 [AudioClip の作成, AudioSource への設定] AudioSource AudioClip 歌声合成波形 VOCALOID プラグイン 歌声ライブラリ シーケンス データ (オンメモリ) ©2016 VOCALOID Group, Yamaha Corporation 29
VOCALOID プラグインを使った発音プロセス Unity アプリケーション上位層 [AudioSource.Play] AudioSource AudioClip 歌声合成波形 VOCALOID プラグイン 歌声ライブラリ シーケンス データ (オンメモリ) ©2016 VOCALOID Group, Yamaha Corporation 30
合成エンジンの動作モード Playback 合成モード Realtime 合成モード ©2016 VOCALOID Group, Yamaha Corporation 31
歌声合成とリアルタイム処理の原理的・一般的な課題 各動作モードの説明の前に... Note On ♪“さ” sa Note On ♪“さ” sa 音符の位置から発音開始 → NG # s s a a a s s a a a # 子音を先行し, 母音に合わせる → OK # s s a a a s s a a a # Note on が母音のタイミングと合うと, 正しいリズムに聴こえる → 子音は先行する必要があり, 先行部分が短いと明瞭度が下がる レイテンシと明瞭度のトレードオフ ©2016 VOCALOID Group, Yamaha Corporation 32
合成エンジンの動作モード Playback 合成モード Realtime 合成モード より高い合成品質で歌ってほしい 歌声合成タイミングから出音タイミングまでに余裕がある ©2016 VOCALOID Group, Yamaha Corporation 33
Playback 合成モード • まとまったフレーズを事前に合成するモード – 先行子音を明瞭に合成 ▶高品質な歌声合成 子音がより明瞭に聴こえるように 事前に歌声を合成 ♪“さ” sa sa # s s a a a s s a a a ... ... ... ... 子音を明瞭に合成可能 ©2016 VOCALOID Group, Yamaha Corporation 34
合成エンジンの動作モード Playback 合成モード Realtime 合成モード ノートオン/オフ (音の発音/停止イベント)を動的に生成し, リアルタイム性をもった発音をしたい ©2016 VOCALOID Group, Yamaha Corporation 35
Realtime 合成モード • リアルタイムで動作する合成モード – 動的にイベントを受け取り, すぐに合成を実行 • 明瞭度とのバランスを取りつつ, 子音の発音長を最小化 ▶低レイテンシな歌声合成 Playback 合成 Realtime 合成 先行して合成 ♪“さ” sa # s s a a a # 子音部分をできるだけ短くする * 小さくしすぎると不明瞭になる ♪“さ” sa # s s a a a # ©2016 VOCALOID Group, Yamaha Corporation 36
歌声ライブラリとアプリ開発 unity WITH VOCALOID™ ©2016 VOCALOID Group, Yamaha Corporation
PROJECT: AKAZA • Unity Technologies Japan さまとヤマハで, unity-chan! VOCALOID ライブラリの開発プロジェクトを立ち上げ – 世界観のプロットを元に歌声の方向性をディスカッションし, 合同でスタジオワークを実施 ©2016 VOCALOID Group, Yamaha Corporation 38
PROJECT: AKAZA • VOCALOID SDK for Unity リファレンス歌声ライブラリ – 単なるサンプルボイスに留まることなく, 深いコンテキストと 「歌心」を纏ったライブラリを目指して開発 PROJECT: AKAZA に関する開発エピソードを含めた 「Unity with VOCALOID インタビュー」が, unity-chan! OFFICIAL WEBSITE にて公開開始されています (全6回 順次公開予定) ぜひご覧ください http://unity-chan.com/contents/category/interview/vocaloid/ ©2016 VOCALOID Group, Yamaha Corporation 39
unity-chan! 歌声ライブラリ • Unity ランタイム向け (ターゲットプラットフォーム共通) – VOCALOID SDK for Unity に同梱 – ユニティちゃんライセンスおよびガイドラインの下で無償配布 • VOCALOID SDK は unity-chan! との組み合わせで無償利用可能 unity WITH VOCALOID™ ©2016 VOCALOID Group, Yamaha Corporation 40
unity-chan! 歌声ライブラリ • iOS 音楽制作向け – ヤマハ Mobile VOCALOID Editor のアプリ内ストアにて DL 販売 ©2016 VOCALOID Group, Yamaha Corporation 41
unity-chan! 歌声ライブラリ • PC 音楽制作向け (Windows/OS X) – ヤマハ VOCALOID SHOP にて DL 販売 ©2016 VOCALOID Group, Yamaha Corporation 42
unity-chan! 歌声ライブラリでのアプリ開発ワークフロー unity-chan! 歌声ライブラリ iOS 版 PC 版 VOCALOID SDK for Unity 歌声 ライブラリ 合成 エンジン ランタイム版 (無償公開) Mobile VOCALOID Editor VOCALOID4 Editor VOCALOID4 Editor for Cubase 楽曲 + 歌唱シーケンス制作 シーケンス データ (ベースとなる 歌唱シーケンスを 事前に制作する場合) VSQX 歌唱シーケンス データ その他 素材 (アプリから動的に読み込む場合) アプリケーション Made with unity 歌声 ライブラリ 合成 エンジン ©2016 VOCALOID Group, Yamaha Corporation 43
歌声ライブラリとライセンス形態 合成エンジン 歌声ライブラリ ライセンスの考え方 1) UCL2.0 の下での無償利用 2) それ以外の有償ライセンス 既存の VOCALOID ライブラリの アプリ向け有償ライセンス ※ 市販の音楽制作用歌声ライブラリを SDK に組み込んで使用することは できません 専用歌声ライブラリの受託開発も 承ります unity-chan! パートナー企業さま のライブラリ + ヤマハのライブラリ 新規ライブラリ Windows Mac iOS (Android) ©2016 VOCALOID Group, Yamaha Corporation 44
VOCALOID SDK for Unity の使い方 unity WITH VOCALOID™ ©2016 VOCALOID Group, Yamaha Corporation
サンプルプロジェクト http://business.vocaloid.com/unitysdk/files/UnityDojo1607_VOCALOID.zip うたボタン Tempo Gender Factor もうはちがうだよ 「うたボタン」を押すと Playback 合成を実行 テンポ, 表情パラメータ (1種), 歌詞を変更可能 小さいボールが周囲のボール間を移動し, ぶつかった時に Realtime 合成を行い, 歌う * 本サンプルプロジェクトの実行には, 別途 VOCALOID SDK for Unity のインポートが必要です http://business.vocaloid.com/unitysdk/download/ ©2016 VOCALOID Group, Yamaha Corporation 46
VOCALOID シーケンスの構造 VOCALOID シーケンス (ソング) トラック1 パート ノート 歌詞: ぼ 発音記号: [b o] ノートNo.: 69 ノート 歌詞: < 発音記号: [k M] ノートNo.: 69 パート トラック2 ©2016 VOCALOID Group, Yamaha Corporation 47
VOCALOID シーケンスの構造 -ノート- VOCALOID シーケンス (ソング) トラック1 パート ノート 歌詞: ぼ 発音記号: [b o] ノートNo.: 69 ノート 歌詞: < 発音記号: [k M] ノートNo.: 69 パート トラック2 ©2016 VOCALOID Group, Yamaha Corporation 48
VOCALOID シーケンスの構造 -パート- VOCALOID シーケンス (ソング) トラック1 パート ノート 歌詞: ぼ 発音記号: [b o] ノートNo.: 69 ノート 歌詞: < 発音記号: [k M] ノートNo.: 69 パート トラック2 ©2016 VOCALOID Group, Yamaha Corporation 49
VOCALOID シーケンスの構造 -トラック- VOCALOID シーケンス (ソング) トラック1 パート ノート 歌詞: ぼ 発音記号: [b o] ノートNo.: 69 ノート 歌詞: < 発音記号: [k M] ノートNo.: 69 パート トラック2 ©2016 VOCALOID Group, Yamaha Corporation 50
VOCALOID シーケンスの構造 -シーケンス- VOCALOID シーケンス (ソング) トラック1 パート ノート 歌詞: ぼ 発音記号: [b o] ノートNo.: 69 ノート 歌詞: < 発音記号: [k M] ノートNo.: 69 パート トラック2 ©2016 VOCALOID Group, Yamaha Corporation 51
VOCALOID シーケンスの構造 トラック パート ノート 音の高さ 時間 ©2016 VOCALOID Group, Yamaha Corporation 52
VOCALOID シーケンスの構造 音の高さ = ノート No. 1小節 1拍 ノートオン ノートオフ 時間 • VOCALOID は時間を Tick で扱う (MIDI で扱う時間単位) • VOCALOID では, 4分音符は 480 Tick • Unity で扱う場合に Tick → 秒 [sec] への変換が必要 – テンポ [BPM] の影響も受ける 変換の詳細のちほど (サンプルコードを見ながら) ©2016 VOCALOID Group, Yamaha Corporation 53
VOCALOID SDK for Unity のインポート 1. http://business.vocaloid.com/unitysdk/download/ から VOCALOID SDK for Unity をダウンロード ダウンロード - Download - VOCALOID SDK for Unity Unity上でVOCALOIDによる歌声合成を行うことができるSDKです。 本SDK専用の歌声ライブラリ「ランタイム版Library unity-chan!」も同梱されています。 無償でご利用いただけますが、条件によっては有償となる場合があります。 詳しくは料金・費用をご参照ください。 ※本SDKを用いて作成された対象コンテンツを配布される場合は「対象コンテンツを配布する方へ」を必ずご確認ください。 VOCALOID SDK for Unity 使用許諾契約書 ランタイム版Library unity-chan! エンドユーザー使用許諾契約書 に同意しました。 VOCALOID SDK for Unity Ver.1.2.0.0 ダウンロード (約144MB) ©2016 VOCALOID Group, Yamaha Corporation 54
VOCALOID SDK for Unity のインポート 2. ZIP アーカイブを展開後, unitypackage をインポート i. プロジェクトを作成 ii. [メニュー] Assets -> Import Package -> Custom Package... ©2016 VOCALOID Group, Yamaha Corporation 55
VOCALOID SDK for Unity のインポート 2. ZIP アーカイブを展開後, unitypackage をインポート iii. VOCALOID SDK for Unity の unitypackage を選択後, ”Open” ©2016 VOCALOID Group, Yamaha Corporation 56
VOCALOID SDK for Unity のインポート 2. ZIP アーカイブを展開後, unitypackage をインポート iv. すべて選択されているのを確認後, ”Import” ©2016 VOCALOID Group, Yamaha Corporation 57
VOCALOID SDK for Unity のインポート インポートされるディレクトリ, ファイル (抜粋) • VOCALOID_SDK – 各プラットフォーム向け VOCALOID プラグインを内包 • StreamingAssets/VOCALOID – VOCALOID 歌声ライブラリに関連するファイルを内包 • Editor/PostProcessBuild.cs – ビルド後に Xcode プロジェクトの設定ファイルを変更するスクリプト (iOS 向け) ©2016 VOCALOID Group, Yamaha Corporation 58
VOCALOID プラグインの基本的な使い方
• YVF クラス (static) が API を包含
• プラットフォームごとの namespace 下に, それぞれ YVF クラスがある
#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;
using System.Collections;
public class Example : MonoBehaviour {
void Start () {
// API はすべてstatic にアクセス.
YVF.YVFStartup("personal", Application.streamingAssetsPath + "/VOCALOID/DB_ini");
}
}
* 簡素化のため, スライド上のサンプルコードはサンプルプロジェクトでの書き方と一致しない場合があります
©2016 VOCALOID Group, Yamaha Corporation
59
VOCALOID プラグインの基本的な使い方 • 多くの API は, 戻り値としてメソッドの実行結果を表す enum を返す – YVFResult (情報取得系以外のほぼすべての API の戻り値) – YVFFindResult (情報取得系 API の戻り値) • YVFFind~() • YVFNext~() YVF.YVFResult result = YVF.YVFStartup("personal", path); // 結果に応じて必要な処理をする if (result == YVF.YVFResult.Success) { print("正常終了"); } else if (result == YVF.YVFResult.InvalidString) { print("入力文字列が不正"); // TODO } ©2016 VOCALOID Group, Yamaha Corporation 60
VOCALOID プラグインのライフサイクル App Startup YVFStartup() Playback 合成 Realtime 合成 YVFShutdown() App Shutdown ©2016 VOCALOID Group, Yamaha Corporation 61
VOCALOID プラグインの起動, 合成モード設定
// VOCALOID プラグインの起動.
public void Startup() {
YVF.YVFResult result;
// ファイルの配置を変えなければ, 常に下記の引数を渡す.
result = YVF.YVFStartup("personal", Application.streamingAssetsPath + "/VOCALOID/DB_ini");
}
Playback/VocAudioManager.cs
Realtime/VocAudioManager.cs
* 右下のファイル名は, サンプルコードに関連するサンプルプロジェクトのファイルを表します
• 起動後に, Playback 合成 / Realtime 合成 のどちらのモードにするかの
設定を行います
-> 次ページ
©2016 VOCALOID Group, Yamaha Corporation
62
VOCALOID プラグインの起動, 合成モード設定 // VOCALOID プラグイン起動後に合成モードを設定します. // Playbackモードに設定する. public void SetPlaybackMode(int engineCount) { // 引数は起動するエンジンのインスタンス数. 並列で歌声合成処理を実行する必要がない場合は1 を設定. YVF.YVFResult result = YVF.YVFSetStaticSetting(engineCount); } // Realtimeモードに設定する. public void SetRealtimeMode() { // 引数はバッファサイズ (512 Samples). YVF.YVFResult result = YVF.YVFRealtimeSetStaticSetting(YVF.YVFRealtimeMode.Mode512); } Playback/VocAudioManager.cs Realtime/VocAudioManager.cs ©2016 VOCALOID Group, Yamaha Corporation 63
VOCALOID プラグインの終了 // VOCALOID プラグインの終了. public void Shutdown() { // 起動したら必ず終了する. YVF.YVFResult result = YVF.YVFShutdown(); } Playback/VocAudioManager.cs Realtime/VocAudioManager.cs • アプリケーション終了前に, 必ず VOCALOID プラグインの終了処理を 行ってください ©2016 VOCALOID Group, Yamaha Corporation 64
VOCALOID シーケンス (VSQX) のロード
• VSQX ファイルを下記ディレクトリ内に配置
– Assets/StreamingAssets/VOCALOID/SequenceFiles
// VSQX のロード.
public void LoadSequence(string sequencePath) {
// ソングの作成. ハンドルの取得.
songHandle = YVF.YVFOpenSong();
YVF.YVFResult result = YVF.YVFLoadVSQXFile(songHandle,
Application.streamingAssetsPath + "/VOCALOID/SequenceFiles/" + sequencePath);
if (result != YVF.YVFResult.Success) {
// 使わなくなったらソングを閉じる.
YVF.YVFCloseSong(songHandle);
}
}
Playback/VocAudioManager.cs
• YVFOpenSong() はソングハンドルを返す
©2016 VOCALOID Group, Yamaha Corporation
65
ハンドルによるアクセス VOCALOID シーケンス (ソング) ソングハンドル: 1 トラック1 パート パートハンドル: 1 ノート ノートハンドル: 1 ノート ノートハンドル: 2 パート トラック2 パート パートハンドル: 3 VOCALOID シーケンス (ソング) ソングハンドル: 2 トラック1 トラック2 • ハンドルを指定することで, 対応したシーケンス/パート/トラック に アクセスすることができる * トラックは最大16であり, 1〜16 を指定する ©2016 VOCALOID Group, Yamaha Corporation 66
ハンドルによるアクセス VOCALOID シーケンス (ソング) ソングハンドル: 1 トラック1 パート パートハンドル: 1 ノート ノートハンドル: 1 ノート ノートハンドル: 2 パート トラック2 パート パートハンドル: 3 VOCALOID シーケンス (ソング) ソングハンドル: 2 トラック1 トラック2 ソング=1, パート=1, ノート=2 にアクセス ©2016 VOCALOID Group, Yamaha Corporation 67
パートの取得
short track = 1;
int tick = 0;
YVF.YVFPartHead partHead = new YVF.YVFPartHead();
// ソングハンドル, トラック No. を指定してアクセスする.
YVF.YVFFindResult findResult = YVF.YVFFindPart(songHandle, track, tick, out partHead);
if (findResult != YVF.YVFFindResult.Found) {
return;
}
do {
print(partHead.partName + "\t" + partHead.posTick);
} while (YVF.YVFNextPart(songHandle, track, out partHead) == YVF.YVFFindResult.Found);
Playback/VocAudio.cs
• YVFFindPart() で, 与えられた時刻以降にある先頭の情報を取得する
• 以降は YVFNextPart() で, 反復的にアクセスする
-> Find/Next の名のつく API は他にもあり, 使い方は共通
©2016 VOCALOID Group, Yamaha Corporation
68
ノートの取得
YVF.YVFNote note = new YVF.YVFNote();
// ソングハンドル, パートハンドルを指定してアクセスする.
YVF.YVFFindResult findResult = YVF.YVFFindNoteInPart(songHandle, partHead.partHandle, tick, out note);
if (findResult != YVF.YVFFindResult.Found) {
return;
}
do {
print(note.noteTime + "\t" + note.noteLength + "\t" + note.noteNumber);
} while (YVF.YVFNextNoteInPart(songHandle, partHead.partHandle, out note) == YVF.YVFFindResult.Found);
Playback/VocAudio.cs
©2016 VOCALOID Group, Yamaha Corporation
69
ノートの編集 YVF.YVFNote note = new YVF.YVFNote(480, 240, 69, "ら"); // (時刻 [Tick], 長さ [Tick], 音高 (ノート No.), 歌詞) note.noteHandle = 0; int noteHandle; // 編集後のノートのノートハンドルを格納するための変数. // ソングハンドル, パートハンドル, ノートハンドル (note.noteHandle) を指定してアクセスする. YVF.YVFResult result = YVF.YVFEditNoteInPart(songHandle, partHandle, ref note, YVF.YVFLang.Japanese, out noteHandle); • ref note.noteHandle で指定したノートを編集 – (note.noteHandle == 0) or (ハンドルに対応するノートが存在しない) ときは新規作成 – (note.noteLength == 0) のときは削除 * out noteHandle は編集後に設定されるデータ Playback/VocAudio.cs ©2016 VOCALOID Group, Yamaha Corporation 70
Playback 合成 流れ 1. 歌声合成の準備 – 合成するパートの指定, イベントデータの生成 * パート内の⼀部も指定できます – 獲得する歌声合成データのフレーム数の取得 2. 歌声合成処理の実行 3. 後処理 – イベントデータのクリア 4. Unity のオーディオ出力用オブジェクトに歌声合成データを設定, 出音 * 歌声合成処理は負荷が高いのでメインスレッドで実行しない方が良い ©2016 VOCALOID Group, Yamaha Corporation 71
Playback 合成 Unity アプリケーション上位層 VOCALOID プラグイン 歌声ライブラリ シーケンスデータ (オンメモリ) VOCALOID シーケンス (ソング) トラック1 パート1 ノート1 ノート2 パート2 トラック2 ©2016 VOCALOID Group, Yamaha Corporation 72
Playback 合成 -歌声合成の準備- Unity アプリケーション上位層 [合成するパートの指定, イベントデータの生成] [歌声合成データの フレーム数の取得] 歌声合成データのフレーム数 VOCALOID プラグイン 歌声ライブラリ シーケンスデータ (オンメモリ) VOCALOID シーケンス (ソング) トラック1 パート1 ノート1 ノート2 パート2 トラック2 ©2016 VOCALOID Group, Yamaha Corporation 73
Playback 合成 -歌声合成処理の実行- Unity アプリケーション上位層 [歌声合成処理の実行] 歌声合成データ short[] VOCALOID プラグイン 歌声ライブラリ シーケンスデータ (オンメモリ) VOCALOID シーケンス (ソング) トラック1 パート1 ノート1 ノート2 パート2 トラック2 ©2016 VOCALOID Group, Yamaha Corporation 74
Playback 合成 -後処理- Unity アプリケーション上位層 歌声合成データ short[] [イベントデータのクリア] VOCALOID プラグイン 歌声ライブラリ シーケンスデータ (オンメモリ) VOCALOID シーケンス (ソング) トラック1 パート1 ノート1 ノート2 パート2 トラック2 ©2016 VOCALOID Group, Yamaha Corporation 75
Playback 合成 -オーディオ出力用オブジェクトの設定, 出音- Unity アプリケーション上位層 AudioSource AudioClip Unity のオーディオ出力用オブジェクトに 歌声合成データを設定, 出音 VOCALOID プラグイン 歌声ライブラリ シーケンスデータ (オンメモリ) VOCALOID シーケンス (ソング) トラック1 パート1 ノート1 ノート2 パート2 トラック2 ©2016 VOCALOID Group, Yamaha Corporation 76
Playback 合成 -歌声合成の準備-
/*---- 歌声合成の準備 ---*/
// 開始 tick を指定し, イベントデータを生成
YVF.YVFResult result = YVF.YVFSetupMidiEventsToEONInPart(songHandle, partHandle, partHead.posTick);
if (result != YVF.YVFResult.Success) {
return;
}
int totalFrame = 0;
// パートの総フレーム数の取得
result = YVF.YVFGetTotalFrameByPart(partHandle, out totalFrame);
if (result != YVF.YVFResult.Success) {
return;
}
if (totalFrame <= 0) {
return;
}
// 獲得する歌声合成データの総サンプル数 (総サンプル数 = フレームあたりのサンプル数 x 総フレーム数)
int targetRenderSamples = YVF.YVFSamplesPerFrame * totalFrame;
/*---- 歌声合成処理の実行へ続く---*/
Playback/VocAudio.cs
©2016 VOCALOID Group, Yamaha Corporation
77
Playback 合成 -歌声合成の準備- Unity アプリケーション上位層 [合成するパートの指定, イベントデータの生成] [歌声合成データの フレーム数の取得] 歌声合成データのフレーム数 VOCALOID プラグイン 歌声ライブラリ シーケンスデータ (オンメモリ) VOCALOID シーケンス (ソング) トラック1 パート1 ノート1 ノート2 パート2 トラック2 今ココ ©2016 VOCALOID Group, Yamaha Corporation 78
Playback 合成 -歌声合成処理の実行-
/*---- 歌声合成処理の実行 ---*/
// 歌声合成処理の開始
result = YVF.YVFBeginRender(engineHandle);
if (result != YVF.YVFResult.Success) {
return;
}
while (true) {
int renderSamples = 0;
// 歌声合成処理を実行し, short[] renderData に値を書き込む
// renderSamples に書き込んだサンプル数が設定される
result = YVF.YVFRender(partHandle, renderData, targetRenderSamples,
out renderSamples);
if (result != YVF.YVFResult.Success) {
return;
}
totalRenderSamples += renderSamples;
if (renderSamples < targetRenderSamples) {
break; // 指定したイベントデータの合成が完了したらループを抜ける
}
}
// 歌声合成処理の終了
result = YVF.YVFEndRender(engineHandle);
if (result != YVF.YVFResult.Success) {
return;
}
/*---- 後処理へ続く---*/
Playback/VocAudio.cs
©2016 VOCALOID Group, Yamaha Corporation
79
Playback 合成 -歌声合成処理の実行- Unity アプリケーション上位層 [歌声合成処理の実行] 歌声合成データ short[] VOCALOID プラグイン 歌声ライブラリ シーケンスデータ (オンメモリ) VOCALOID シーケンス (ソング) トラック1 パート1 ノート1 ノート2 パート2 トラック2 今ココ ©2016 VOCALOID Group, Yamaha Corporation 80
Playback 合成 -後処理-
/*---- 後処理 ---*/
// イベントデータのクリア.
result = YVF.YVFClearMidiEventsInPart(songHandle, partHandle);
if (result != YVF.YVFResult.Success) {
return;
}
Playback/VocAudio.cs
©2016 VOCALOID Group, Yamaha Corporation
81
Playback 合成 -後処理- Unity アプリケーション上位層 歌声合成データ short[] [イベントデータのクリア] VOCALOID プラグイン 歌声ライブラリ シーケンスデータ (オンメモリ) VOCALOID シーケンス (ソング) トラック1 パート1 ノート1 ノート2 パート2 トラック2 今ココ ©2016 VOCALOID Group, Yamaha Corporation 82
Playback 合成 -オーディオ出力用オブジェクトの設定, 出音-
public void Play (){
// 獲得歌声合成データのサンプル数分の長さを確保し, オーディオクリップを作成.
AudioClip clip = AudioClip.Create("VOCALOID", totalRenderSamples, 1, YVF.YVFSamplingRate, false,
OnAudioRead, OnAudioSetPosition);
// オーディオソースの取得, クリップ設定, 出音.
AudioSource source = gameObject.GetComponent<AudioSource>();
source.clip = clip;
source.Play();
}
// オーディオクリップに歌声合成データを設定するデリゲート.
void OnAudioRead(float[] data) {
for (int i = 0; i < data.Length; ++i, ++audioPosition) {
data[i] = renderData[audioPosition] / 32768.0f;
// convert [-32768, 32767] (short) to [-1.0, 1.0] (float).
}
}
// オーディオクリップの読み取り位置変更時に呼ばれるデリゲート.
void OnAudioSetPosition(int newPosition) {
audioPosition = newPosition;
}
Playback/VocAudio.cs
©2016 VOCALOID Group, Yamaha Corporation
83
Playback 合成 -オーディオ出力用オブジェクトの設定, 出音- Unity アプリケーション上位層 AudioSource AudioClip VOCALOID プラグイン 歌声ライブラリ シーケンスデータ (オンメモリ) VOCALOID シーケンス (ソング) トラック1 パート1 ノート1 ノート2 パート2 トラック2 今ココ ©2016 VOCALOID Group, Yamaha Corporation 84
Playback 合成 -合成タイミング, 伴奏との同期- • 事前にまとまったフレーズを合成 • 子音明瞭化のために, VOCALOID プラグインで 500ms を確保 → (500ms + 処理時間) の余裕をもって歌声合成処理, オーディオオブジェクトの設定を行う 500ms ♪“さ” sa sa # s s a a a s s a a a ... ... ... ... ©2016 VOCALOID Group, Yamaha Corporation 85
Playback 合成 -合成タイミング, 伴奏との同期-
// 歌声の再生
public void Sing(float startTime) {
// 先読み時間 [msec] -> [sec]
float presend = YVF.YVFGetPresendTime() * 0.001f;
// 先読み時間分もって再生する必要がある
source.PlayDelayed(startTime - presend);
}
500ms
♪“さ”
sa
sa
# s s a
a
a s s a
a a ... ... ... ...
Playback/VocAudio.cs
©2016 VOCALOID Group, Yamaha Corporation
86
Playback 合成 -合成タイミング, 伴奏との同期- // Tick を秒 [sec] に変換 public float TickToTime(int tick, float bpm) { // 1Tick あたりの時間 [sec] float tickSecond = 60 / bpm / YVF.YVFResolution; return tick * tickSecond; } • VOCALOID が扱う時刻単位 Tick から 秒 [sec] への変換が必要 • 伴奏の開始時刻を基準にして, 歌声合成データを伴奏の時刻に合わせて 再生するとよい TEMPO BEAT 120.00 4/4 Track VOCALOID WAV(MONO) 伴奏を基準にする 伴奏 Common/VocSystem.cs ©2016 VOCALOID Group, Yamaha Corporation 87
Realtime 合成 流れ 1. リアルタイム合成処理の開始 (イベントの待ち受け開始) 2. 歌詞設定 (事前に設定した歌詞でループする) 3. イベントの追加 4. イベントの確定 5. Unity のオーディオ出力データに歌声合成データを設定, 出音 6. リアルタイム合成処理の終了 イベント ノートオン/オフや表情パラメータ設定の変更などの情報 ©2016 VOCALOID Group, Yamaha Corporation 88
Realtime 合成 Unity アプリケーション上位層 オーディオ出力データ VOCALOID プラグイン inactive VOCALOID エンジン 歌声ライブラリ ©2016 VOCALOID Group, Yamaha Corporation 89
Realtime 合成 -リアルタイム合成処理の開始- Unity アプリケーション上位層 オーディオ出力データ [リアルタイム合成処理の開始] VOCALOID プラグイン active VOCALOID エンジン 歌声ライブラリ ©2016 VOCALOID Group, Yamaha Corporation 90
Realtime 合成 -歌詞設定- Unity アプリケーション上位層 オーディオ出力データ [歌詞の設定] VOCALOID プラグイン active VOCALOID エンジン よろしくね 歌声ライブラリ ©2016 VOCALOID Group, Yamaha Corporation 91
Realtime 合成 -イベントの追加, 確定- Unity アプリケーション上位層 オーディオ出力データ [イベントの追加, 確定] e.g. ノートオン VOCALOID プラグイン active VOCALOID エンジン よろしくね 歌声ライブラリ ©2016 VOCALOID Group, Yamaha Corporation 92
Realtime 合成 -歌声合成データの取得- Unity アプリケーション上位層 オーディオ出力データ 歌声合成データ short[] よー [歌声合成データの取得] VOCALOID プラグイン active VOCALOID エンジン よろしくね 歌声ライブラリ ©2016 VOCALOID Group, Yamaha Corporation 93
Realtime 合成 -歌声合成データの設定, 出音- Unity アプリケーション上位層 オーディオ出力データ Unity のオーディオ出力用データに 歌声合成データを設定, 出音 VOCALOID プラグイン active VOCALOID エンジン よろしくね 歌声ライブラリ ©2016 VOCALOID Group, Yamaha Corporation 94
Realtime 合成 -リアルタイム合成処理の終了- Unity アプリケーション上位層 オーディオ出力データ [リアルタイム合成処理の終了] VOCALOID プラグイン inactive VOCALOID エンジン 歌声ライブラリ ©2016 VOCALOID Group, Yamaha Corporation 95
Realtime 合成 OnAudioFilterRead を利用した実装 • OnAudioFilterRead – 短いインターバルで呼ばれる, オーディオフィルタリングを行うメソッド – 優れたレイテンシ • オーディオフィルタリングを実行するのではなく, 直接歌声合成データを 書き込む ©2016 VOCALOID Group, Yamaha Corporation 96
Realtime 合成 -リアルタイム合成処理の開始・終了, 歌詞設定- // リアルタイム合成処理の起動. public void RealtimeStart() { YVF.YVFResult result = YVF.YVFRealtimeStart(); } // 歌詞の設定. public void SetLyrics(string lyrics) { // 歌詞設定を行うと, 内部で VOCALOID エンジンの再起動がかかる. YVF.YVFResult result = YVF.YVFRealtimeSetLyrics(lyrics, YVF.YVFLang.Japanese); } // リアルタイム合成処理の終了. public void RealtimeStop() { YVF.YVFResult result = YVF.YVFRealtimeStop(); } Realtime/VocAudio.cs ©2016 VOCALOID Group, Yamaha Corporation 97
Realtime 合成 -歌詞設定- Unity アプリケーション上位層 オーディオ出力データ [歌詞の設定] VOCALOID プラグイン active VOCALOID エンジン よろしくね 歌声ライブラリ 今ココ ©2016 VOCALOID Group, Yamaha Corporation 98
Realtime 合成 -イベントの追加, 確定- // ダイナミクスパラメータ設定, ノートオンを送信. int dynamics = 32; int noteNumber = 69; // イベントの追加. YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.Dynamics, dynamics); YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.NoteOn, noteNumber); // イベントの確定. YVF.YVFRealtimeCommitMidi(); Realtime/VoiceWall.cs // ノートオフを送信. YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.NoteOff, noteNumber); YVF.YVFRealtimeCommitMidi(); Realtime/BallController.cs ©2016 VOCALOID Group, Yamaha Corporation 99
Realtime 合成 -イベントの追加, 確定- Unity アプリケーション上位層 オーディオ出力データ [イベントの追加, 確定] e.g. ノートオン VOCALOID プラグイン active VOCALOID エンジン よろしくね 歌声ライブラリ 今ココ ©2016 VOCALOID Group, Yamaha Corporation 100
Realtime 合成 -Unity のオーディオ出力の準備-
public void AudioStart() {
// OnAudioFilterRead による音声出力のためのAudioClip, AudioSource.
AudioClip clip = AudioClip.Create("VOCALOID", YVF.YVFSamplingRate, 1, YVF.YVFSamplingRate, true);
AudioSource source = gameObject.GetComponent<AudioSource>();
// ループさせて, 止まらないようにする.
source.loop = true;
source.clip = clip;
source.Play();
}
Realtime/VocAudio.cs
©2016 VOCALOID Group, Yamaha Corporation
101
Realtime 合成 -歌声合成データの取得, 設定, 出音-
void OnAudioFilterRead(float[] data, int channels) {
// 取得可能な歌声合成データのサンプル数を取得.
int numBufferSamples = (int)YVF.YVFRealtimeGetAudioNumData();
if (numBufferSamples <= 0) {
return;
}
// 歌声合成データをshort[] renderData に書き込む.
YVF.YVFRealtimePopAudio(renderData, numBufferSamples);
// 歌声合成データを出力用データに書き込む.
for (int i = 0; i < numBufferSamples; ++i) {
float value = renderData[i] / 32768.0f;
int index = i * channels;
for (int j = index; j < index + channels; ++j) {
data[j] = value;
}
}
}
Realtime/VocAudio.cs
©2016 VOCALOID Group, Yamaha Corporation
102
Realtime 合成 -歌声合成データの取得- Unity アプリケーション上位層 オーディオ出力データ 歌声合成データ short[] よー [歌声合成データの取得] VOCALOID プラグイン active VOCALOID エンジン よろしくね 歌声ライブラリ 今ココ から 次ページ -> ©2016 VOCALOID Group, Yamaha Corporation 103
Realtime 合成 -歌声合成データの設定, 出音- Unity アプリケーション上位層 オーディオ出力データ Unity のオーディオ出力用データに 歌声合成データを設定, 出音 VOCALOID プラグイン active VOCALOID エンジン よろしくね 歌声ライブラリ -> 前ページ ココ まで ©2016 VOCALOID Group, Yamaha Corporation 104
サンプルプロジェクト ご興味ある方は, こちらもご参照ください ユニティちゃんライブステージ! CRS 〜 VOCALOID Edition HelloVOCALOID ゆにてぃちゃんだよ きみにあいたい あいうえお ぼーかろいど いつもありがとう るらら http://business.vocaloid.com/unitysdk/download/ ©2016 VOCALOID Group, Yamaha Corporation 105
ありがとうございました unity WITH VOCALOID™ ©2016 VOCALOID Group, Yamaha Corporation