버전

menu_open
Wwise SDK 2023.1.3
External Source 통합하기

External Source는 Wwise에서 Sound 오브젝트에 넣을 수 있는 특별한 타입의 음원입니다. 이는, 실제 사운드 데이터가 런타임에 제공될 것을 의미합니다. External Source 통합은, 방대한 양의 대사 라인을 관리할 때 매우 유용합니다. 개별적으로 필요한 Sound와 Event를 뱅크에 포함시켜 적절히 분리하고 관리해줘야 하는 대량의 대사를 효과적으로 관리합니다. 또한, AI에 의해 작동되는 음성 발생기(speech generator)같이 다른 시스템이 이미 관리하고 있는 대사에도 매우 유용하게 쓰입니다.

외부 음원(External Source)은 Wwise 안에서 다른 음원 플러그인과 동일하게 Add Source 버튼을 이용해 생성할 수 있으며, 필요한 경우 복잡한 구조체의 일부로 사용할 수도 있습니다. 게임 측면에서는, 다른 사운드와 동일하게 AK::SoundEngine::PostEventAK::SoundEngine::DynamicSequence::Playlist::Enqueue 를 이용해 외부 음원으로 이벤트를 재생할 수 있습니다. Event가 게시될 때, 해당 외부 음원을 대신해 재생할 WAV 파일이 필요합니다. 어느 파일을 재생할 지는 전적으로 프로그래머의 결정에 달렸습니다. 즉, 음원 파일 관리가 Wwise 사운드 엔진 밖에서 이뤄진다는 뜻이기도 합니다. 손이 좀 더 가지만, 그만큼 더 자유로운 유연성을 누릴 수 있기도 합니다.

외부 음원 변환

사운드 엔진이 사용하는 wave 데이터가 고유의 포맷으로 돼 있는 경우, 입력 파일을 변환해줘야 런타임에 사운드 엔진으로 전달할 수 있습니다. This is done through the External Sources List file in Wwise Authoring. This is an XML file that contains all files that you need to convert along with the conversion settings you want to use. 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 입력값의 루트 경로를 지정합니다. 만약 아무 내용도 입력하지 않으면 프로젝트 디렉터리를 루트로 간주합니다. Root 경로는 절대 경로여도 되고 프로젝트 디렉터리에 대한 상대 경로여도 됩니다.

Source 요소는 변환할 파일 하나를 지정합니다.

  • Path는 항상 Root 경로에 대한 상대 경로입니다.
  • Conversion 속성은 파일을 변환하는 데 사용할 Conversion Setting ShareSet의 이름입니다. 지정되지 않을 경우, 프로젝트의 Default Conversion Setting을 사용하게 됩니다.
  • Destination 속성은 선택 사항으로, 이를 이용해 서로 다른 도착 파일이름과 경로를 지정할 수 있습니다. 이 때 경로는, Project Settings나 명령줄에서 지정한 출력 경로에 대한 상대 경로입니다. 이 속성으로 파일 이름을 변경할 수도 있습니다. 파일 경로만 단독으로 사용할 수 없다는 점에 주의하세요. 반드시 파일 이름도 지정해줘야 합니다. 뿐만 아니라, 전환된 파일의 확장자는 Destination 속성의 확장자와 상관 없이 무조건 '.wem'이 됩니다. Root 디렉터리 안에 있는 폴더들의 계층 구조는, Destination 속성이 따로 지정돼있지 않으면 항상 출력 경로에 복제됩니다. 만약 Root 디렉터리의 외부 파일을 사용할 경우, Destination 속성을 지정해줘야 합니다.
  • Analysis Type은, 전환된 파일의 헤더에 어떤 분석 메타 데이터를 포함시킬 지 결정할 때 사용합니다. 현재 사운드 엔진에서 사용할 수 있는 두 가지 분석이 있는데, 라우드니스와 HDR입니다. – 라우드니스(loudness)는 라우드니스 정규화에 사용됩니다. 외부 음원에 이를 추가해야 할 경우 'Enable Loudness Normalization' 체크 상자를 선택해서 사운드 구조체를 이용해 사용할 수 있습니다. Analysis Type을 2로 설정해 라우드니스를 포함시키세요. – HDR는 오직 사운드의 엔벨로프로만 구성돼있습니다. HDR 시스템에서 이러한 음원을 사용할 경우, 구조체에서 'Enable Envelope' 체크 상자를 체크해 포함시키세요. Analysis Type을 4로 설정해 HDR를 포함시키세요. – Analysis Type을 6(즉, 2+4)으로 설정하면 두 타입 모두를 포함시킵니다.

외부 음원 변환은 뱅크가 생성될 때 다른 모든 파일 변환과 함께 자동으로 실행됩니다. 이미 변환된 파일은 불필요하게 다시 변환되지 않는다는 점에 주의하세요.

경고: 재변환을 방지하기 위해 Wwise는 출력 폴더의 Wwise.dat 파일에 일부 데이터를 저장합니다. 게임에는 이 파일이 필요 없으므로 최종 파일에는 포함시키지 않는 것이 좋습니다. 이 파일이 삭제되면 모든 wave 파일이 재변환됩니다.

입력 디렉터리의 디렉터리 구조체는 루트 경로에 상대적인 출력 디렉터리에 복제됩니다. 위 예제에서 출력 디렉터리는 'ExternalSources' 폴더와 "Lower Tests\Originals\SFX" 폴더를 포함하게 됩니다. '..'가 포함된 경로는 해당 경로를 빠져나와 맨 처음 실제 폴더에서 시작합니다.

명령줄 변환

명령줄 도구(command-line tool)를 이용해 프로젝트의 외부 음원만 변환할 수도 있습니다. 예컨대, 이를 이용하면 Xbox One에 대해 뱅크를 생성하지 않고도 외부 음원을 변환할 수 있습니다.

"%WWISEROOT%\Authoring\x64\Release\bin\WwiseConsole.exe" convert-external-source "C:\Project name.wproj" --platform XBoxOne

명령줄 도구(WwiseConsole)에 대한 더 자세한 정보는 명령줄 사용하기 를 참고하세요.

스트리밍 vs 메모리 내장

사운드 엔진에 오디오 데이터를 보내려면 AkExternalSourceInfo 구조체에 파일 이름이나 데이터 포인터를 지정하면 됩니다. 이렇게 하면 Wwise 프로젝트에서 Sound 오브젝트에 대한 Streaming 체크 상자를 완전히 오버라이드하게 됩니다. 데이터 포인터를 사용할 때는, 메모리 관리를 철저히 해 전체 재생 시간 동안 데이터가 메모리에 머물게끔 하는 것이 중요합니다.

파일 이름을 지정하면, 일반 스트리밍 파일과 똑같은 방식으로 파일이 디스크로부터 스트리밍됩니다. 디스크에서 해당 파일의 위치는, 하위-레벨 I/O 시스템에 File Location Resolver의 구현으로 해결돼야 합니다. Low-Level I/O 하위시스템에 대한 더 많은 정보는 Low-Level I/O 을(를) 참고하세요.

기본 File Location Resolver 서비스는 CAkFileLocationBase 에 구현돼있으며, SDK의 예제를 통해 제공되고 있습니다 ( 기본 Low-Level I/O 구현 을(를) 참고하세요). 이 구현은 하위 폴더를 지원하지 않으며, 각 외부 음원 스트리밍 파일이 '기본' 스트리밍 파일과 동일한 위치에 있다고 간주합니다.

Wwise Stream Manager는 AK::StreamMgr::IAkLowLevelIOHook::BatchOpen()로 플래그를 보내 올바른 파일 위치를 찾을 수 있도록 돕습니다 (AkFileSystemFlags). 이 단계에서 'company ID'(AkFileSystemFlags::uCompanyID)를 이용해 기본 스트리밍 파일과 외부 음원을 구분할 수 있습니다. Wwise가 SoundBank와 기본 스트리밍 파일에 대해서는 AKCOMPANYID_AUDIOKINETIC 를 전달하고, 외부 음원 스트리밍에 대해서는 AKCOMPANYID_AUDIOKINETIC_EXTERNAL 를 전달하게 됩니다. 그러면 이 값을 이용해 디스크의 다른 위치에서 외부 음원을 검색할 수 있습니다.

참고: AkFileSystemFlags::bIsLanguageSpecific 은, 외부 음원이 'Voice' 사운드 구조체에 포함돼있다 하더라도 외부 음원에 항상 false로 설정돼있습니다. 사실 Voice 대신, 언어 독립적인 SFX 내에서 외부 음원을 사용하는 것이 더 낫습니다. 그리고 현지화는 AkExternalSourceInfo 파일 이름이나 ID를 지정하는 초기 단계부터 신경 써서 관리하는 것이 좋습니다.

예제: 외부 음원 체계를 통해 단일 사운드 재생하기

이 프로젝트는 다음 내용을 포함하고 있습니다.

  • 'MySound'라는 사운드와 'MyExternal'이라는 External Source ('Add Source' 버튼으로 추가)
  • 재생 이벤트인 'Play_MySound'
  • 해당 이벤트가 포함된 뱅크
  • An External Sources List file in the Project Settings (see example above)
  • The External Sources List file must define the source "One.wav" and "Two.wav" (implicitly converted in "One.wem" and "Two.wem" respectively).
source.iExternalSrcCookie = AK::SoundEngine::GetIDFromString("MyExternal"); //쿠키는 외부 음원 오브젝트 이름의 해시임.
source.szFile = AKTEXT("One.wem"); //재생하려는 파일.
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"); //동일한 이벤트/음원을 이용해 다른 파일을 재생해봅시다.
AK::SoundEngine::PostEvent( "Play_MySound", 2, 0, NULL, 0, 1, &source );
참고: 외부 파일의 확장자명은 반드시 '.wem'이어야 합니다. In the External Sources List file, you may rename the destination file, but cannot change its extension. 파일 변환이 끝나면 파일 확장자명은 항상 '.wem'이 됩니다. 변환된 파일을 File Package로 패키징할 경우, 코드에서 이 파일을 '.wem' 확장자로 참조해야 합니다. 그러면 File Packager가 확장자를 포함한 전체 파일 이름을 해시해 식별 ID를 생성합니다.

예제: 복수의 외부 음원으로 이벤트 재생하기

하나의 이벤트에 여러 wave 파일을 교체하는 것이 가능합니다. 예를 들어 Sequence Container에 세 개의 외부 음원을 설정할 수 있습니다. 한 이벤트가 둘 이상의 외부 음원의 재생을 트리거하는 경우, 프로젝트 안에서 교유한 이름을 붙여줘야 (즉, 고유한 쿠키를 갖도록) AkExternalSourceInfo 구조체에 내용을 입력할 때 이 둘을 분리할 수 있습니다.

이 프로젝트는 다음 내용을 포함하고 있습니다.

  • MyExternalSequence라는 이름의 Sequence Container 및 세 개의 사운드와 그에 대한 각각의 External Source 한 개씩 ('Add Source' 버튼으로 추가)
  • 음원의 이름은 1, 2, 3으로 돼있어 개별적으로 분리해 교체할 수 있도록 합니다.
  • 재생 이벤트인 'Play_MyExternalSequence'
  • 해당 이벤트가 포함된 뱅크
  • Project Settings의 외부 음원 목록 (아래 예제 참고)
  • 외부 음원 목록은 반드시 'One.wav'와 'Four.wav', 'Five.wav' 음원(각각 함축적으로 'One.wem'과 'Four.wem', 'Five.wem'으로 변환됨)을 정의해야 합니다.
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; //코덱은 각 음원의 필요에 따라 달라질 수 있음.
AK::SoundEngine::PostEvent( "Play_MyExternalSequence", 2, 0, NULL, 0, 3, sources );

Wwise Unreal Integration Examples

For more information about how to use external sources in projects integrated with Unreal, see Wwise Unreal Integration documentation:

#define AKCODECID_VORBIS
Vorbis encoding
Definition: AkTypes.h:1077
AkCodecID idCodec
Codec ID for the file. One of the audio formats defined in AkTypes.h (AKCODECID_XXX)
Definition: AkTypes.h:342
AkOSChar * szFile
File path for the source. If not NULL, the source will be streaming from disk. Set pInMemory to NULL....
Definition: AkTypes.h:343
#define NULL
Definition: AkTypes.h:46
AkUInt32 iExternalSrcCookie
Cookie identifying the source, given by hashing the name of the source given in the project....
Definition: AkTypes.h:341
#define AKTEXT(x)
Definition: AkTypes.h:98
V1::Source Source
Latest version of the C++ Source interface.
Definition: Source.h:173
AKSOUNDENGINE_API AkUInt32 GetIDFromString(const char *in_pszString)
#define AKCODECID_PCM
PCM encoding
Definition: AkTypes.h:1074
AKSOUNDENGINE_API AkPlayingID PostEvent(AkUniqueID in_eventID, AkGameObjectID in_gameObjectID, AkUInt32 in_uFlags=0, AkCallbackFunc in_pfnCallback=NULL, void *in_pCookie=NULL, AkUInt32 in_cExternals=0, AkExternalSourceInfo *in_pExternalSources=NULL, AkPlayingID in_PlayingID=AK_INVALID_PLAYING_ID)

이 페이지가 도움이 되었나요?

지원이 필요하신가요?

질문이 있으신가요? 문제를 겪고 계신가요? 더 많은 정보가 필요하신가요? 저희에게 문의해주시면 도와드리겠습니다!

지원 페이지를 방문해 주세요

작업하는 프로젝트에 대해 알려주세요. 언제든지 도와드릴 준비가 되어 있습니다.

프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.

Wwise를 시작해 보세요