ボイス
ボイスクリップをエンジンに公開するには、それらを Resources/Naninovel/Voice フォルダ(オーディオ構成の Loader フォールドアウトで変更可能)の下に保存します。必要に応じて、さらにサブフォルダで整理することもできます。この場合、シナリオスクリプトで参照するときはスラッシュ(/)を使用します。たとえば、Resources/Naninovel/Voice/Intro/Day/25.wav として保存されているボイスオーディオクリップは、スクリプトで Intro/Day/25 として参照できます。
Addressable Asset System を使用してリソースを手動で公開することも可能です。詳細についてはガイドを参照してください。
ボイスクリップには、Unityでサポートされている 任意のオーディオ形式を使用できます。
ボイス再生の動作は、Naninovel -> Configuration -> Audio コンテキストメニューを使用して構成できます。利用可能なオプションについては、構成ガイド を参照してください。
シナリオスクリプトでボイスを再生するには、@voice コマンドに続けてクリップ名(パス)を使用します。例:
@voice Hello— Resources/Naninovel/Voice/Hello.wav に保存されているボイスクリップアセットを再生します。
NOTE
@voice コマンドは、特定の瞬間にボイスクリップを時々再生することを目的としており、完全なボイスオーバーの実装には適していません。ほとんどのテキスト行にボイスクリップが関連付けられているプロジェクトでのボイス処理方法の詳細については、以下の「オートボイス」セクションを参照してください。一部の組み込み機能(バックログでのボイスリプレイ、ボイスオーバードキュメントなど)は、オートボイスワークフローでのみ機能します。
オートボイス
フルボイスのゲームでは、ボイスのある行ごとに @voice コマンドを指定するのは面倒になる可能性があります。オートボイス機能を使用すると、ボイスのあるテキスト行の一意の識別子に関連付けられたボイスクリップを自動的に再生できます。オートボイスを有効にするには、オーディオ構成メニューの Enable Auto Voicing トグルを有効にします。
ボイスオーディオクリップとボイスのあるテキスト行の関連付けは、ボイスマップユーティリティを介して、またはUnityのAddressable Asset Systemを使用してオーディオクリップアセットにアドレスを割り当てる(またはアセットを別の リソースプロバイダー に公開する)ことによって実行できます。
オートボイスが有効になっている場合、オーディオ構成メニューに「Open Voice Map Utility」ボタンが表示されます。Naninovel -> Tools -> Voice Map エディタメニューからもユーティリティにアクセスできます。
まず、ボイスクリップをマップするスクリプトファイルを選択します。選択したスクリプトにprintコマンド(または汎用テキストライン)が含まれている場合は、オーディオクリップフィールドとペアでリストされます。フィールドにボイスクリップをドロップ(または選択)して、テキストに関連付けます。クリップを自動マップすることも可能です。これを行うには、ボイスのある行のテキストの開始と一致するようにクリップアセットに名前を付け、クリップ(またはそれらを含むフォルダ)をボイスマップユーティリティにドラッグします。
WARNING
ボイスマップウィンドウを介してクリップを割り当てる場合は、競合を防ぐために、ボイスクリップを「Resources」フォルダの外に保存してください。
非ソースロケールのボイスクリップを関連付けるには、Localization Document フィールドを使用して スクリプトローカライズドキュメント を選択します。有効なドキュメントが選択されると、割り当てられたボイスクリップには、ドキュメントが保存されているロケールが自動的にプレフィックスとして付けられ、対応する 音声言語 が選択されたときに使用されます。
同じ著者が同一のテキストメッセージを持っている場合(同じスクリプト内で)、両方のメッセージが同じボイスクリップに関連付けられます。これが望ましくない場合は、メッセージの1つに一意のテキスト識別子を追加します。例:
Hello.
Hello.|#uniqueid|TIP
エディタメニューの Naninovel/Tools/Text Identifer を使用して、Naninovelがボイスのある行を含むすべてのローカライズ可能なスクリプトテキストに対して一意のIDを自動的に生成するようにします。これにより、重複する行にIDを手動で割り当てる必要がなくなり、すでにマップされた行を編集しても関連付けが壊れることはありません。詳細については、テキスト識別 を参照してください。
ボイスマップユーティリティを使用せずにクリップを関連付けるには、スクリプトパスとボイスローダープレフィックス(デフォルトでは Voice)をプレフィックスとしたテキストIDをリソース名として使用して、アセットをリソースプロバイダーに公開します。特定のボイスのある行のスクリプトパスとテキストIDを見つけるには、ボイスオーバードキュメント を使用します。たとえば、Addressableリソースプロバイダーを介して公開された Script01 パス内の 2670eb4 テキストIDを持つボイスのある行を関連付けるには、次のアドレスを使用します:Naninovel/Voice/Script01/2670eb4。
ゲームの実行中に現在表示されているテキストに関連付けられたオートボイスIDを見つけるには、デバッグウィンドウを使用します。
ウィンドウを表示するには、エンジン構成で Enable Development Console がオンになっていることを確認し、プレイモード中に ~ キーを押し、debug と入力して Enter を押します。
EXAMPLE
オートボイスサンプル で、複数のロケールにオートボイスを設定する例を見つけてください。
著者の音量
オートボイスを使用する場合、特定の キャラクター、正確には表示されたテキストメッセージの著者のボイス音量をプレイヤーが制御できるようにしたい場合があります。たとえば、プレイヤーは主人公の声をミュートしたり、特定のキャラクターの声を小さくしたりすることを決定する場合があります。
著者ごとのボイス制御を設定するには、カスタム設定UIを作成 し、新しいスライダーを追加し(プレハブにすでにある "VoiceVolumeSlider" を複製できます)、Author ID フィールドに著者(キャラクター)IDを指定します。
追加されたスライダーは、指定されたキャラクターのボイス音量を制御するようになります。著者IDフィールドに何も割り当てられていない場合、スライダーはオーディオミキサーのボイスグループの音量を制御し、すべてのボイスに影響します。
音声言語
異なるローカライズ用のボイスオーバーを追加する場合、メインのローカライズとは独立して音声言語を選択できるようにすることが可能です(例:英語のテキストとUIでゲームをプレイするが、日本語のボイスオーバーを使用する)。
ゲーム設定に音声言語ドロップダウンを追加するには、オーディオ構成メニューで Voice Locales プロパティを割り当てます。対応するボイスリソースがあるロケールの言語タグを追加します。たとえば、以下の例では、プレイヤーが英語と日本語のボイスから選択できるようになります。
プロパティが割り当てられると、ゲーム設定メニューに「Voice language」ドロップダウンが表示されます。
ゲームリソースのローカライズ方法の詳細については、ローカライズガイド を参照してください。
ボイスオーバードキュメント
ボイスオーバードキュメントは、ボイスオーバーオーディオを制作する際に、音声録音エンジニアや声優が使用することを目的としています。
Naninovel -> Tools -> Voiceover Documents からアクセスできるボイスオーバードキュメント生成ユーティリティを使用して、@print コマンドと汎用テキストラインからの表示テキストを含むドキュメントを生成します。表示された各テキストメッセージは、オートボイスIDに関連付けられます。
Locale プロパティを使用すると、ドキュメントを生成する特定のロケールを選択できます(選択したロケールのローカライズされたシナリオスクリプトがプロジェクトに存在する必要があります)。
Format プロパティは、生成するボイスオーバードキュメントのファイルタイプとフォーマットを制御します。
- Plaintext — フォーマットなしのプレーンテキストファイル。
- Markdown — 読みやすくするための追加のフォーマットを備えた Markdown ファイル。
- CSV — GoogleスプレッドシートやMicrosoft Excelなどの表計算ソフトで使用される カンマ区切り値 ファイル。
以下は、Markdown形式で生成されたボイスオーバードキュメントの例です。
カスタムジェネレーター
ドキュメントを特別な方法でフォーマットおよび/またはシリアル化したい場合は、カスタムボイスオーバードキュメントジェネレーターを注入することが可能です。
カスタムジェネレーターを追加するには、パラメータなしのコンストラクタを持つ新しいC#クラスを作成し、IVoiceoverDocumentGenerator インターフェイスを実装します。ユーティリティはそのようなクラスを自動的に選択し、組み込みジェネレーターの代わりに使用します。
GenerateVoiceoverDocument メソッドは、選択したロケールに対してプロジェクト内で見つかった各スクリプトに対してユーティリティによって呼び出されます。list 引数は、スクリプトに含まれるコマンドのリストです。locale は、ユーティリティで選択されたロケール(言語)を表します。outDir は、ユーティリティで選択された出力パスです。
以下は、スクリプトパスとロケールを含むヘッダーを追加し、その後にスクリプト内で見つかった各print textコマンドに対して auto-voice id > author > text 行を追加するカスタムボイスオーバージェネレーターの例です。
public class VoiceoverGenerator : IVoiceoverDocumentGenerator
{
public void GenerateVoiceoverDocument (ScriptPlaylist list, string locale, string outDir)
{
var builder = new StringBuilder();
builder.AppendLine($"Voiceover for '{list.ScriptPath}' ({locale} locale)");
foreach (var cmd in list.OfType<PrintText>())
{
var voiceId = AutoVoiceResolver.Resolve(cmd.Text);
builder.AppendLine($"{voiceId} > {cmd.AuthorId} > {cmd.Text}");
}
File.WriteAllText($"{outDir}/{list.ScriptPath}.txt", builder.ToString());
}
}