ボイス
ボイスクリップをエンジンに公開するには、それらを Resources/Naninovel/Voice フォルダー(オーディオ構成の 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 に保存されているボイスクリップアセットを再生します。
注意
@voice コマンドは、特定の瞬間にボイスクリップを時々再生することを目的としており、完全なボイスオーバーの実装には適していません。ほとんどのテキスト行にボイスクリップが関連付けられているプロジェクトでのボイス処理方法の詳細については、以下の「オートボイス」セクションを参照してください。一部の組み込み機能(バックログでのボイスリプレイ、ボイスオーバードキュメントなど)は、オートボイスワークフローでのみ機能します。
オートボイス
フルボイスのゲームでは、ボイスのある行ごとに @voice コマンドを指定するのは面倒になる可能性があります。オートボイス機能を使用すると、ボイスのあるテキスト行の一意の識別子に関連付けられたボイスクリップを自動的に再生できます。オートボイスを有効にするには、オーディオ構成メニューの Enable Auto Voicing トグルを有効にします。
ボイスオーディオクリップをボイスのあるテキスト行に関連付けるには、ボイスマップユーティリティを使用するか、UnityのAddressable Asset Systemでオーディオクリップアセットにアドレスを割り当てます。別の リソースプロバイダー にアセットを公開する方法もあります。
オートボイスが有効になっている場合、オーディオ構成メニューに「Open Voice Map Utility」ボタンが表示されます。Naninovel -> Tools -> Voice Map エディターメニューからもユーティリティにアクセスできます。
まず、ボイスクリップをマップするスクリプトファイルを選択します。選択したスクリプトにprintコマンド(または汎用テキスト行)が含まれている場合は、オーディオクリップフィールドとペアで一覧表示されます。フィールドにボイスクリップをドロップ(または選択)して、テキストに関連付けます。クリップを自動マップすることも可能です。これを行うには、ボイスのある行のテキストの冒頭と一致するようにクリップアセットに名前を付け、クリップ(またはそれらを含むフォルダー)をボイスマップユーティリティにドラッグします。
警告
ボイスマップウィンドウを介してクリップを割り当てる場合は、競合を防ぐために、ボイスクリップはどの「Resources」フォルダーにも含まれない場所に保存してください。
ソースロケール以外のロケールのボイスクリップを関連付けるには、Localization Document フィールドを使用して スクリプトローカライズドキュメント を選択します。有効なドキュメントが選択されると、割り当てられたボイスクリップには、ドキュメントが保存されているロケールが自動的にプレフィックスとして付けられ、対応する ボイス言語 が選択されたときに使用されます。
同じ話者に同一のテキストメッセージが(同じスクリプト内に)ある場合、両方のメッセージが同じボイスクリップに関連付けられます。これが望ましくない場合は、どちらかのメッセージに一意のテキスト識別子を追加します。例:
こんにちは。
こんにちは。|#uniqueid|ヒント
エディターメニューの Naninovel -> Tools -> Text Identifier を使用すると、ボイスのある行を含むすべてのローカライズ可能なスクリプトテキストに対して、Naninovelに一意のIDを自動生成させることができます。これにより、重複する行にIDを手動で割り当てる必要がなくなり、すでにマップされた行を編集しても関連付けが壊れることはありません。詳細については、テキスト識別 を参照してください。
ボイスマップユーティリティを使用せずにクリップを関連付けるには、テキストIDの前にスクリプトパスとボイスローダープレフィックス(デフォルトでは Voice)を付け、それをリソース名としてアセットをリソースプロバイダーに公開します。特定のボイスのある行のスクリプトパスとテキストIDを調べるには、ボイスオーバードキュメント を使用します。たとえば、パスが Script01 のスクリプト内で、テキストIDが 2670eb4 の行にボイスを関連付ける場合、Addressableリソースプロバイダーで次のアドレスを使用します:Naninovel/Voice/Script01/2670eb4。
ゲームの実行中に現在表示されているテキストに関連付けられたオートボイスIDを見つけるには、デバッグウィンドウを使用します。
ウィンドウを表示するには、エンジン構成で Enable Development Console がオンになっていることを確認し、プレイモード中に ~ キーを押し、debug と入力して Enter を押します。
例
オートボイスサンプル で、複数のロケール向けにオートボイスをセットアップする例を確認できます。
話者の音量
オートボイスを使用する場合、特定の キャラクター、より正確には表示されるテキストメッセージの話者のボイス音量をプレイヤーが制御できるようにしたい場合があります。たとえば、プレイヤーが主人公のボイスをミュートしたり、特定のキャラクターのボイスを小さくしたりしたいと考えるかもしれません。
話者ごとのボイス制御をセットアップするには、カスタム設定UIを作成 し、新しいスライダーを追加し(プレハブにすでにある「VoiceVolumeSlider」を複製できます)、Author IDs リストに話者(キャラクター)IDを追加します。
追加されたスライダーは、指定されたキャラクターのボイス音量を制御するようになります。1つのスライダーで複数の話者を制御するには、リストに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コマンドに対して 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());
}
}