目次

Wwise SDK 2018.1.11
外部ソースの統合

外部ソースは、Wwiseのサウンドオブジェクトに置くことのできる、特別な種類のソースです。実際のサウンドデータは、ランタイム時に提供されます。これは、例えば大量のダイアログがある場合、それぞれのサウンドとイベントを作成してバンクに入れ、これを適切に分割して管理する方法より便利です。また、AI を使用したスピーチジェネレータなど他のシステムを介してダイアログを既に管理している場合にも非常に便利です。

他のソースプラグインと同様に、Add Source(ソースの追加)" ボタンから、Wwise に外部ソースを作成することができ、必要であればこれを複雑な構造の一部にすることも可能です。ゲーム側では、外部ソースでのイベント再生は、他のサウンドの場合と同様に、AK::SoundEngine::PostEventAK::SoundEngine::DynamicSequence::Playlist::Enqueue を介して実行可能です。外部ソースを置き換えるために再生する(1つまたは複数の)WAV ファイルは、イベントがポストされる時に提供される必要があります。どのファイルを再生するかの決断は、完全にプログラマーの手にゆだねられています。つまり、ソースファイルのファイル管理は、Wwise サウンドエンジンの外部で行われます。より多くの作業を伴うことになりますが、結果としてより多くの柔軟性を得られます。

外部ソースの変換

サウンドエンジンが使用するwaveデータは、独自の形式なので、入力ファイルをランタイム時にサウンドエンジンに渡すためには、これを変換する必要があります。これは、Wwise の External Sources File List(外部ソースファイルリスト)を介して実行可能です。変換する必要のある全てのファイルが使用する変換設定とともに非常にシンプルな XML ファイルに含まれています。Wsources ファイルを指定するには、External Sources タブの Project Settings で設定します。以下は、このファイルの例です:

<?xml version="1.0" encoding="UTF-8"?>
<ExternalSourcesList SchemaVersion="1" Root="d:\TestProject\ExternalSources">
<Source Path="kaaboom.wav" Conversion="VeryCompressed" />
<Source Path="SomeOtherFolderInTheProject\working.wav" Conversion="PCM"/>
<Source Path="d:\FolderOutsideTheProject\out.wav" Conversion="PCM" Destination="out.wav"/>
<Source Path="..\RelativeOutsideTheProject\relative.wav" Conversion="PCM" Destination="relative.wav"/>
<Source Path="MyHdrSound.wav" Conversion="PCM" AnalysisTypes="6"/>
</ExternalSourcesList>

Root 属性は、ソースエントリのルートパスを指定します。省略されると、プロジェクトディレクトリがルートとみなされます。ルートパスは、完全修飾パスまたはプロジェクトディレクトリへの相対パスです。

Source (ソース) アイテムは、変換するファイルを1つ特定します:

  • Path は常に、Root パスに対応しています。
  • Conversion 属性は、ファイルの変換に使用する Conversion Setting シェアセット名です。特定していないと、プロジェクトの Default Conversion Setting を使用します。
  • Destination 属性はオプションであり、異なる宛先ファイルとパスを特定することができます。このパスは、Project Settings またはコマンドラインで特定した出力パスに対応しています。この属性を用いて、ファイルの名前を変更することもできます。ファイルパスのみを使用することはできないことに注意してください: ファイル名も特定する必要があります。さらに、変換したファイルの拡張子は、Destination属性の拡張子と関係なく、".wem"である必要があります。 Destination属性が特定されていない場合、Rootディレクトリ内のフォルダ階層が、常に出力パスに複製されます。Rootディレクトリ外のファイルを使用する場合には、Destination 属性を特定する必要があります。
  • AnalysisTypes を使って、変換ファイルのヘッダーにどのような分析メタデータを含めるべきかを決定します。現在、サウンドエンジンでラウドネスとHDRの2種類の分析を利用することができます。 – ラウドネスは、ラウドネスの正常化に使用されます。よって、"Enable Loudness Normalization (ラウドネス正常化を有効)" チェックボックスがチェックされているサウンドストラクチャーで使用する場合には、外部ソースにこれを追加します。これを含めるには、AnalysisTypes に 2 を設定します。 – HDR はサウンドのエンベロープのみを含んでいます。"Enable Envelope" チェックボックスがチェックされているストラクチャーの、HDRシステム内でこのソースを使用する予定の場合にはこれを含みます。これを含めるには、AnalysisTypes に 4 を設定します。 – 両方のタイプを含むには、AnalysisTypes に 6 (つまり、2 + 4) を設定します。

バンク生成が発生すると、他のファイル変換とともに外部ソースの変換も自動的に行われます。すでに変換済みのファイルは、不必要に再変換されないことに注意してください。

Caution: 再変換を避けるために、Wwise は出力ディレクトリ内の Wwise.dat ファイルにいくつかのデータを保存します。このファイルはゲームには必要のないものなので、最終ファイルにこれを含めないようにしてください。このファイルが削除されると、すべてのwaveファイルが再変換されます。

入力ディレクトリのディレクトリ構造は、ルートパスに相対的な出力ディレクトリに複製されます。上の例では、出力ディレクトリには、"ExternalSources" フォルダと "Lower Tests\Originals\SFX" フォルダが含まれます。".." を含むパスは取り除かれ、最初の本当のフォルダから開始します。

コマンドラインの変換

コマンドラインツールを使用して、プロジェクトの外部ソースのみを変換することも可能です。例えば、以下は、バンクを生成せずに Xbox One 用の外部ソースを変換します。

"%WWISEROOT%\Authoring\x64\Release\bin\WwiseCLI.exe" "C:\Project name.wproj" -ConvertExternalSources XBoxOne

コマンドラインツール (WwiseCLI) に関する詳細は、コマンドラインを使う を参照してください。

ストリーミング VS インメモリ

オーディオデータをサウンドエンジンに提供するには、ファイル名またはデータポインタを AkExternalSourceInfo 構造体で指定します。これにより、Wwise プロジェクト内の Sound オブジェクト上にある Streaming チェックボックスが完全に上書きされます。データポインタを使用する場合、メモリ管理を行い、データが再生中ずっとメモリ内に留まっていることを確認する必要があります。

ファイル名を指定すると、ファイルが開き、通常のストリーミングファイルと同様にディスクからストリーミングされます。ディスク上のそのロケーションは、低レベル I/O サブシステムの File Location Resolver(ファイルロケーションリゾルバ)実装内で解決される必要があります。低レベル I/O サブシステムの詳細については、 低レベル I/O を参照してください。

デフォルトの File Location Resolver サービスは、CAkFileLocationBase に実装されており、SDK のサンプルとして提供されています( デフォルト低レベル I/O の実装 参照)。この実装は、サブフォルダをサポートしないので、すべての外部ソースストリーミングファイルが "標準" ストリーミングファイルと同じ場所にあるとみなします。

Wwise Stream Manager は、フラグを AK::StreamMgr::IAkFileLocationResolver::Open() に渡し、ファイルロケーションを正しく解決するサポートをします(AkFileSystemFlags)。このレベルでは、外部ソースと標準的なストリーミングファイルを"company ID" で区別可能です(AkFileSystemFlags::uCompanyID)。Wwise は、サウンドバンクおよび標準的なストリーミングファイル用に AKCOMPANYID_AUDIOKINETIC を、外部ストリーミングソース用に AKCOMPANYID_AUDIOKINETIC_EXTERNAL を渡します。したがって、この値を使用して、ディスク上の別のロケーションで外部ソースを検索することができます。

Note: AkFileSystemFlags::bIsLanguageSpecific は、外部ソースが「ボイス」サウンド構造に含まれていても、常に外部ソース false に設定されています。実際、ボイスではなく、言語に依存しない SFX 内にで外部ソースを使用するよう、推奨しています。ファイル名、またはAkExternalSourceInfoのIDを指定する場合、ローカリゼーションは最初から扱う必要があります。

例:外部ソースメカニズムによる単独サウンド再生

プロジェクトには以下が含まれている必要があります:

  • "MySound" という名前のサウンドと("Add Source" ボタンで追加された)"MyExternal" という名前の外部ソース。
  • "Play_MySound" という再生イベント。
  • イベントの入ったバンク。
  • Project Settings 内の外部ソースリスト(上の例を参照)。
  • 外部ソースリストが、(暗黙的にそれぞれ "One.wem" と "Two.wem" に変換されている)ソース "One.wav" および "Two.wav" を定義。
source.iExternalSrcCookie = AK::SoundEngine::GetIDFromString("MyExternal"); //The cookie is a hash of the name of the external source object.
source.szFile = AKTEXT("One.wem"); //The file we're going to play.
source.idCodec = AKCODECID_PCM; //The file is in PCM.
AK::SoundEngine::PostEvent( "Play_MySound", 2, 0, NULL, 0, 1, &source );
source.szFile = AKTEXT("Two.wem"); //Let's play a different file with the same event/source
AK::SoundEngine::PostEvent( "Play_MySound", 2, 0, NULL, 0, 1, &source );
Note: 外部ソースの拡張子は、".wem" である必要があります。External Sources File List(外部ソースファイルリスト)で、宛先ファイル名を変更することはできますが、拡張子は変更できません。変換後は、ファイルの拡張子は常に".wem"になります。File Package(ファイルパッケージ)に、変換されたファイルをパッケージする場合、コード内で拡張子 ".wem" を使用してこのファイルを参照する必要があります:File Packagerは、拡張子を含めた完全な名前をハッシュして、ルックアップ ID を生成します。

例:複数外部ソースでイベント再生

複数のwaveファイルを、単一イベントに置き換えることができます。例えば、3つの外部ソースでシーケンスコンテナをセットアップ可能です。イベントが1つ以上の外部ソース再生をトリガーする場合、これらのソースは、AkExternalSourceInfo 構造体を充填する時に区別可能であるよう、プロジェクト内で独自の名前を持つ(したがって独自の cookie を持つ)必要があります。

プロジェクトには以下が含まれている必要があります:

  • 3つのサウンドと1つの外部ソースを持つ MyExternalSequence というシーケンスコンテナ。
  • ソース名は、これらを別々に置換できるように、1、2 または 3 であること。
  • "Play_MyExternalSequence" という再生イベント。
  • イベントの入ったバンク。
  • Project Settings 内の外部ソースリスト(上の例を参照)。
  • 外部ソースリストが、(暗黙的にそれぞれ "One.wem" と "Two.wem" に変換されている)ソース "One.wav" および "Two.wav" を定義。
sources[0].iExternalSrcCookie = AK::SoundEngine::GetIDFromString("Extern_1st_number");
sources[0].szFile = AKTEXT("Five.wem");
sources[0].idCodec = AKCODECID_PCM;
sources[1].iExternalSrcCookie = AK::SoundEngine::GetIDFromString("Extern_2nd_number");
sources[1].szFile = AKTEXT("One.wem");
sources[1].idCodec = AKCODECID_PCM;
sources[2].iExternalSrcCookie = AK::SoundEngine::GetIDFromString("Extern_3rd_number");
sources[2].szFile = AKTEXT("Four.wem");
sources[2].idCodec = AKCODECID_VORBIS; //The codec can be different for each source, if needed
AK::SoundEngine::PostEvent( "Play_MyExternalSequence", 2, 0, NULL, 0, 3, sources );