Wwise 2023.1의 WAAPI

오디오 프로그래밍 / 신규 출시 / Wwise에 대한 팁과 도구

Wwise 2023.1은 2017년 API 도입 이후 가장 방대한 Wwise Authoring API (WAAPI) 업데이트를 포함하고 있습니다. 아직 Wwise 2023.1 새로운 기능 의 목록을 확인하지 못했다면 한 번 살펴보세요. WAAPI 관련 업데이트가 아주 많답니다. 이 블로그에서 그 중 몇 가지를 자세히 살펴보겠습니다.

먼저, WAAPI란 무엇일까요?

WAAPI는 Python 스크립트나 C++ 프로그램과 같은 외부 애플리케이션과 Wwise Authoring 애플리케이션 간의 통신에 사용됩니다. 더 자세히 알고 싶다면 다음 페이지를 확인하세요. https://www.audiokinetic.com/ko/library/edge/?source=sdk&id=waapi.html.

일반적으로 WAAPI를 활용해서 수행할 수 있는 작업은 다음과 같습니다.

  • 오디오 파일 가져오기
  • 오디오 구조 만들기
  • SoundBank 생성하기
  • 프로젝트 쿼리하기 (WAQL 사용)
  • 이게 끝이 아니랍니다!

WAAPI를 이미 사용하고 있지만 그 사실을 모르고 있을 수도 있습니다. WAAPI는 엔진 내부에서 다음과 같은 곳에 사용됩니다.

또한 WAAPI를 게임 개발 파이프라인에 통합하면 특정 작업을 자동화할 수 있고 일반적인 작업 과정에서 데이터 품질을 향상시킬 수 있습니다.

다음은 이번 출시를 통해 Audiokinetic이 제공하려는 내용입니다.

Wwise를 출시할 때 저희는 고객의 의견을 반영하는 것과 기존 로드맵을 유지하는 것 사이의 균형을 맞추려고 노력하고 있습니다. 이번 출시에서 눈의 띄는 특정 고객의 사례 중 하나는, 소스 컨트롤 환경에서 WAAPI를 사용하는 것이었습니다. 두 번째 사례는 Interactive Music 오브젝트를 포함한 일부 데이터 모델을 리팩터링해서 WAAPI 적용 범위를 늘리는 것이었습니다. 이것은 우리의 로드맵과도 일치하는 방향이었죠. 음악 오브젝트 대해서는 이 블로그의 뒷부분에서 더 자세히 다루도록 하고, 그 전에 먼저 소스 컨트롤과 관련해 이야기해보겠습니다.

소스 컨트롤 지원

Audiokinetic이 2017년 WAAPI를 처음 개발했을 때, 최소 기능 제품(MVP, minimum viable product)을 제공하기 위해서는 몇 가지 요소를 빼야 했습니다. 그 중 하나가 바로 소스 컨트롤 관련 지원이었죠. 오늘날의 WAAPI는 수많은 사용자 파이프라인과 통합되었기 때문에 이 부분을 해결해야 했습니다.

다음은 저희가 해결하고자 노력한 내용입니다.

  • 오디오 파일을 가져올 때 팝업 차단하기. 간단한 예시로, ReaWwise를 사용할 때 REAPER에서 렌더링할 때마다 Wwise에서 소스 컨트롤 팝업이 떠서 REAPER 사용자 인터페이스를 가리기 때문에 사용할 때 꽤 불편합니다.
  • Work Unit 생성, 삭제, 이동, 이름 바꾸기. 파일 시스템 작업과 관련된 모든 것들은 소스 컨트롤에 함께 기록되어야 합니다. 많은 WAAPI 함수가 Work Unit을 생성할 수 있죠.
  • 명령줄에서 소스 컨트롤 사용하기. WwiseConsole.exe를 사용할 때 소스 컨트롤을 아예 사용할 수 없었습니다.
  • 오디오 파일 관리하기. Original 오디오 파일을 자동으로 정리하는 것은 불가능했습니다. File Manager를 사용하는 것이 프로젝트를 멈추지 않고 오디오 파일을 이동하거나 이름을 바꿀 수 있는 유일한 방법이었죠. 규모가 큰 프로젝트에서는 자동으로 정리된 에셋 구성이 매우 중요합니다.

이를 위해 저희는 소스 컨트롤 플러그인이 작동하는 방식을 다시 검토해야 했습니다. 주요 목표는 모든 API가 조용히 소스 컨트롤과 완벽하게 호환되도록 하는 것이었죠.

테스트 전략

그 전에 먼저 어떻게 제대로 테스트 할 것이가에 대해 생각했습니다. 소스 컨트롤을 테스트 하는 것은 매우 지루한 작업이지만 그렇다고 대충 넘어갈 수는 없었죠. 업데이트된 범위가 너무 크기 때문에 만약 놓친 부분이 있다면 다른 무언가를 망가뜨릴 수 있기 때문입니다. 그런데 저희가 추가한 기능을 이용하면 이전에는 불가능했던 테스트를 자동화할 수 있었죠.

따라서 자동화된 테스트 프레임워크(automated testing framework)에서 Perforce를 지원하는 부분은 자연스러운 일이었습니다. 그리고 모든 WAAPI 기능은 테스트 프레임워크에서 이미 확인됬기 때문에, 새로운 소스 컨트롤 기능에도 같은 접근 방식으로 새로 업데이트된 부분의 품질을 더욱 확신할 수 있었습니다.

사용자 인터페이스

첫째, 소스 컨트롤 플러그인으로 생성된 사용자 인터페이스를 제어할 수 있어야 했습니다. 이것은 자동화에서 가장 중요한 부분입니다. 팝업에는 두 종류가 있었습니다. 

  • Checkout Dialog와 같은 사용자 지정 팝업 (아래 이미지)
  • 소스 컨트롤 Log

img1

대화 상자를 없앨 때마다 WAAPI 함수에 동등한 옵션을 제공해서 파일에 자동으로 Check Out 또는 Mark for Add를 하도록 해야 했습니다. 최종적으로 총 10개의 서로 다른 WAAPI 함수가 자동 소스 컨트롤 작업을 지원합니다.

  • ak.wwise.console.project.open
  • ak.wwise.ui.project.open
  • ak.wwise.core.audio.import
  • ak.wwise.core.audio.importTabDelimited
  • ak.wwise.core.object.copy
  • ak.wwise.core.object.create
  • ak.wwise.core.object.delete
  • ak.wwise.core.object.move
  • ak.wwise.core.object.set
  • ak.wwise.core.project.save

이렇게 모든 API에 소스 컨트롤 지원을 추가하는 것은 쉬운 작업이 아니었습니다. Wwise Authoring의 코어에는 수정할 코드 경로가 너무 많았기 때문이었죠. 이미 많은 부분이 자동화돼있었지만, 이번 기회를 통해 Work Unit을 조작할 때 더 많은 부분을 자동화할 수 있었습니다.

둘째, 로그 대화 상자를 대체할 것을 찾아야 했습니다. 이를 위해 모든 소스 컨트롤 메시지를 Logs 뷰로 리디렉션하고 새로운 탭을 만들었습니다.

img2

좋은 소식은 중앙 집중식 로그(centralized log)가 이미 WAAPI에 노출되어있다는 것입니다. 이제 API에 새 채널을 추가하기만 하면 되었죠.

자동화를 한계까지 밀어붙이다

이 시점부터는 대부분의 간접적인 소스 컨트롤 작업이 가능해졌습니다. 예를 들어 ak.wwise.core.object.set로 Work Unit 오브젝트를 생성하면 연결된 WWU 파일에서 Add 작업이 트리거됩니다. 하지만 WAV 파일의 이름을 바꾸거나 이동하는 것과 같이 WAV 파일에서 직접 소스 컨트롤 작업을 수행한다면 어떨까요? 이전에는 소스 컨트롤 코어를 테스트할 수 있는 직접적인 방법이 없었습니다. 지금까지는 소스 컨트롤이 아닌 작업을 통해서만 테스트할 수 있었죠.

그래서 모든 소스 컨트롤 API를 WAAPI에 추가하기로 결정했습니다. 그리고 소스 컨트롤 기능에 직접 매핑되는 다음 함수들이 추가되었습니다:

  • ak.wwise.core.sourceControl.add
  • ak.wwise.core.sourceControl.checkOut
  • ak.wwise.core.sourceControl.commit
  • ak.wwise.core.sourceControl.delete
  • ak.wwise.core.sourceControl.getSourceFiles
  • ak.wwise.core.sourceControl.getStatus
  • ak.wwise.core.sourceControl.move
  • ak.wwise.core.sourceControl.revert
  • ak.wwise.core.sourceControl.setProvider

더 나아가서 waapi-server, generate-soundbank, tab-delimited-import를 사용할 때 WwiseConsole에 직접적으로 소스 컨트롤 지원을 추가했습니다. 이를 통해 자동화를 더욱 강화하고 기능들을 분리할 수 있습니다.

WAAPI 적용 범위 증가

이제 WAAPI의 적용 범위를 늘리는 것에 대해 좀 더 이야기해 볼까요? 지난 몇 년 동안 저희는 Wwise에서 점점 더 많은 데이터 모델을 리팩토링해서 기존 WAAPI 기능을 통해 일반화하며 접근할 수 있도록 했습니다. 이번 출시에서는 Interactive Music Hierarchy에 중점을 두었죠. 예를 들어 이전에는 WAAPI에서 특정 음악 오브젝트를 구성할 수 없었습니다. 다음은 음악 오브젝트와 관련하여 2023.1에서 공개한 목록입니다.

  • Music Switch Container의 AssociationsArgument
  • Music Sequence Container의 Playlist Root
  • Music Stinger의 TriggerSegment Reference
  • 음악 오브젝트의 Transition Root

위에 나열된 음악 요소 외에도 다음 요소들을 공개했습니다:

  • Dialogue Event의 Entries
  • 오디오 파일 음원의 Marker
  • Playlist Random/Sequence Container

상호작용 음악 예제

이제 몇 가지 코드를 살펴보겠습니다. Music Switch Container, Music Playlist Container, Music Segment, Music Tracks, Music Cues, Music Transition으로 재생 가능한 Interactive Music 구조를 만들어 봅시다. 이 코드를 따라 하려면 GitHub에서 전체 예제를 다운로드하세요.

https://gist.github.com/ak-brodrigue/b98d12e67167eb0e00291cd9c2c02164

이 예제에서는 ak.wwise.core.object.set를 사용하여 하나의 고유한 WAAPI 호출로 전체 음악 구조를 생성하게 됩니다. 해당 구조를 생성하려면 오디오 파일도 가져와야 하는 것을 명심하세요. Wwise의 이전 버전에서는 이것이 불가능했습니다.

먼저 객체를 정의하는 개념부터 시작하겠습니다. ak.wwise.core.object.set을 호출할 때 객체 정의를 함수에 전달합니다. 최소 객체 정의는 다음 입력란입니다.

그리고 객체 정의에 다음 입력란이 선택적으로 포함될 수 있습니다:

  • children: 다른 객체 정의의 배열을 정의합니다. 
  • import: 객체로 가져올 오디오 파일을 정의합니다. (2023.1에서 새롭게 소개된 기능)
  • @로 시작하는 Volume 또는 OutputBus와 같은 속성, 참조 또는 목록 값.

좀 더 쉬운 작업을 위해 ak.wwise.core.object.set에 전달된 객체 정의에 해당하는 필수 JSON 코드 생성을 처리하는 일반 유틸리티 함수를 Python으로 작성했습니다. 이 함수를 깊이 이해하지 않아도 사용하는데에는 아무 지장이 없습니다. 아래는 사용 예제입니다.

def Object(type, name, *children, **properties):

    # 기본 정의
    definition = {
        "type" : type,
        "name" : name
    }

   
# 키워드 인자를 가져와서 속성으로 변환합니다.
    for key, value in properties.items():
        definition['@'+key] = value

   
# 하위 항목으로는 다른 정의나 파일 가져오기가 될 수 있습니다. instructions
    if len(children) > 0 and isinstance(children[0], str):
        # 문자열을 첫 번째 인자로 찾으면 파일 경로를 고려합니다.
        definition["import"] = {}
        definition["import"]["files"] = []
        for file in children:
            definition["import"]["files"].append({
                    "audioFile" : file,
                })
    else:
        # 그렇지 않으면 하위 항목 정의의 배열을 고려합니다.
        definition["children"] = children
   
    return definition

이것은 처음 두 개의 인자가 고정된 반면 다른 인자는 자동으로 하위 항목 또는 오디오 파일 가져오기 정의로 변환되는 Python 인자 시스템을 활용한다는 점을 알아두세요. 마지막으로 해당 함수는 속성을 정의하기 위해 키워드 인자도 사용합니다.

위의 기능을 다시 사용하는 Music Segment를 생성하는 특수 함수를 소개합니다.

def MusicSegment(name, *children, **properties):
    #  Music Segment에 대한 정의 만들기
    return Object("MusicSegment", name, *children, **properties)

이제 이 함수를 사용해서 다음과 같은 Music Segment 정의를 생성할 수 있습니다.

MusicSegment("Segment1",  
    R"C:\MyAudio.wav",
    Volume = -3)

또는 여러 Music Track을 원할 경우 다음을 사용할 수 있습니다.

MusicSegment("Segment1", 
    MusicTrack("TrackA", 
        R"C:\TrackA.wav",
        Volume = -2
        ),
    MusicTrack("TrackB",
        R"C:\TrackB.wav",
        Volume = -2
        )  
    )

Music Playlist Container를 생성하는 것도 크게 다르지 않습니다. 그러나 이 경우 재생 목록 자체를 지정해야 합니다. 아래 예시에서는 Playlist Item (재생 목록 요소)의 트리인 컨테이너에 PlaylistRoot를 설정합니다. 또한 다른 Music Playlist 항목에서 LoopCountSegment를 설정합니다.

MusicPlaylistContainer(
    R"MPL1",
    MusicSegment("Segment1", R"C:\Segment1.wav"),
    MusicSegment("Segment2", R"C:\Segment2.wav"), 
    PlaylistRoot = 
        MusicPlaylistItem(
            MusicPlaylistItem( Segment = root + "\MSC\MPL1\Segment1"),
            MusicPlaylistItem( Segment = root + "\MSC\MPL1\Segment2"),
            LoopCount = 0 
            )
    )

마지막으로 Music Switch Container를 생성하려면 Switch를 하위 항목과 연결해야 합니다. 이것은 MusicSwitchContainer 함수의 처음 두 인자를 통해 수행됩니다. Switch와 하위 항목을 연결하는 세부 사항과 관련된 구현을 한번 살펴보면 좋습니다.

MusicSwitchContainer(root + R"\MSC",
    # 음악 컨테이너가 등록된 스위치 그룹
    [
        R"\Switches\Default Work Unit\SWG_1", 
        R"\Switches\Default Work Unit\SWG_2"
    ],
    # 연결 항목
    {
        R"SW_1_1.SW_2_1": R"MPL1",
        R"SW_1_2.SW_2_1": R"MPL1",
        R"*.SW_2_2": R"MPL2",
    },
    # 하위 항목
    MusicPlaylistContainer("MPL1", ...),
    MusicPlaylistContainer("MPL2", ...),

마지막으로 이러한 모든 정의는 WAAPI의 ak.wwise.core.object.set에 전달됩니다. 전체 정의 트리(tree of definition)는 음악 구조를 만드는 방법을 보여줍니다.

향후 업데이트 방향

Wwise 2023.1의 새로운 WAAPI 기능을 살펴보세요. 사용해보신 분들의 생각이 어떤지 궁금합니다. 어떤 작업에 이 새로운 기능들을 이용할 계획이신가요? 저희는 항상 저희 제품이 어떤 곳에 어떻게 쓰이고 있는지 궁금하답니다.

향후 WAAPI에 기대하는 다른 기능이 있나요? Q&A에서 Beta Feedback 카테고리로 알려주세요.

WAAPI에 대해 배우고 싶지만 어디서부터 시작해야 할지 모르겠다면 다음 링크를 참고해주세요.

 

베르나르 로드리그 (Bernard Rodrigue)

베르나르 로드리그 (Bernard Rodrigue)

Audiokinetic개발 감독Bernard Rodrigue는 Audiokinetic의 개발 감독입니다. Bernard는 2005년 Audiokinetic에 입사했으며 Wwise의 기초를 개발하는 데 큰 공헌을 했습니다. 현재 Bernard는 계속해서 Wwise의 발전과 확장에 관한 여러 프로젝트를 이끌어 나가고 있습니다.

 @decasteljau

댓글

댓글 달기

이메일 주소는 공개되지 않습니다.

다른 글

새로운 기능 개요 2019.2

Profiler Filtering (프로파일러 필터링) Capture 세션을 보면, 주어진 시간 안에 생기는 많은 캡처 데이터를 어렵지 않게 발견할 수 있습니다. 이는...

14.2.2020 - 작성자: Audiokinetic

이미지 기반 파라미터를 이용한 오픈 월드 앰비언트 디자인

Blend Container는 강력한 시퀀싱 및 믹싱 도구가 될 수 있습니다. 단순히 그것의 기능을 배우는 것이 게임 사운드 디자이너의 생각에 온갖 종류의 새로운 아이디어를...

13.3.2020 - 작성자: 톰 토디아 (TOM TODIA)

합성 만으로 빗소리 만들기

몇 년 전 저는 원하는 모든 사운드를 합성할 수 있을까 하는 궁금증이 생겼습니다. 바람, 새의 노랫소리, 곤충 소리 등 다양한 자연 소리를 합성하기 시작했죠. 이런 작업에서는...

3.9.2020 - 작성자: 알렉산더 킬코(ALEKSANDR KHILKO)

누구나 사용할 수 있는 WAAPI - 제 1부: 개요

안녕하세요. 저는 왕양 (汪洋) 이라고 합니다 (혹은 ‘씨 예’, 溪夜라고도 불립니다). 저는 작년 하반기에 WAAPI에 대해 알게 되었습니다 (Wwise 저작 API). 저같이...

30.3.2021 - 작성자: 토마스 왕 (THOMAS WANG, 汪洋)

Wwise 2023.1 새로운 기능

Wwise 2023.1이 출시되었으며 Audiokinetic 런처를 통해 다운받으실 수 있습니다. 이 버전이 제공하는 새로운 기능을 간략하게 소개해드리려고 합니다....

7.7.2023 - 작성자: Audiokinetic (오디오키네틱)

Wwise Spatial Audio 2023.1의 새로운 기능 | Reverb Zone (리버브 존)

Reverb Zone 소개 Wwise 2023.1은 Wwise Spatial Audio에 Reverb Zone (리버브 존)이라는 새로운 도구를 추가했습니다. Reverb...

10.1.2024 - 작성자: 토마스 한슨 (Thomas Hansen)

다른 글

새로운 기능 개요 2019.2

Profiler Filtering (프로파일러 필터링) Capture 세션을 보면, 주어진 시간 안에 생기는 많은 캡처 데이터를 어렵지 않게 발견할 수 있습니다. 이는...

이미지 기반 파라미터를 이용한 오픈 월드 앰비언트 디자인

Blend Container는 강력한 시퀀싱 및 믹싱 도구가 될 수 있습니다. 단순히 그것의 기능을 배우는 것이 게임 사운드 디자이너의 생각에 온갖 종류의 새로운 아이디어를...

합성 만으로 빗소리 만들기

몇 년 전 저는 원하는 모든 사운드를 합성할 수 있을까 하는 궁금증이 생겼습니다. 바람, 새의 노랫소리, 곤충 소리 등 다양한 자연 소리를 합성하기 시작했죠. 이런 작업에서는...