ゲーム開発におけるボイスデータの効率的な管理 with CRI ADX2 (前編)

# この記事の対象者
* キャラクターのボイスがあるゲームを作っている開発者
* 「ADX2」を使っている開発現場のプランナーさん・ゲームデザイナーさん
* ボイスデータが大量にあるので効率的に管理したい人
* 音量バランスや設定をプログラマー以外に任せたいと考えている方

# ボイスデータの設定・管理におけるADX2の使い方
この記事では、ゲームサウンド開発のツール「ADX2」を使ってキャラクターボイスの管理・制御を行う例を紹介します。
ADX2の初期設定や組み込みについては、本投稿では触れません。
記事を読んでADX2を試してみたい、と思った方は以下の投稿も一緒にご覧ください。

* Unity向け: Unityのサウンド機能をADX2で強化する
https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377

* Unreal Engine 4向け: ADX2 for UE4の導入で、一歩上のサウンド表現を（導入編）
https://qiita.com/SigRem/items/4250925f6d66a4fd287a

すでにADX2が開発ワークフローに組み込まれている現場で、ツールを使った音声の設定をプランナーさんにも任せられるような説明書としても書かれています。
ゲームプログラマーでなくても理解できるように、極力プログラム寄りの専門用語を減らしています。
「ADX2」の概念説明にも利用できます。

なお、本記事の書き手はUnityを使ったインディーゲームを開発しているプログラマーです。
今作にはキャラクターのボイスを導入するため、自分の備忘録としてもまとめました。

## ゲーム開発用サウンドツールCRI ADX2とは
「CRI ADX2」は、簡単に言えばゲームで再生する音を管理・制御するソフトウェアです。

UnityやUE4を使っている開発現場では、まずエディターに音声ファイルを登録して、C#スクリプトないしはブループリント等でそれらの再生を実行します。
その際、単純な再生開始処理だけではなく、「一時停止」「フェードインアウト」「同時再生数の抑制」「優先度設定と管理」「サウンドエフェクトのオンオフ」など、多岐にわたる処理を組む必要があります。
ADX2は、ゲームに頻出の音の演出設定を「音声データ側に埋め込む」ことで、開発省力化を図ることができる製品です。

またADX2では、音声データの圧縮に「HCA」という圧縮形式を利用します。
これは本ツールの独自形式で、圧縮率はOggとほぼ同じです。Oggと比較して再生時のCPU負荷が低く、高音域の再現に強く、高圧縮にした際に女性の声がよりきれいに再現できる特徴があります。

エディションは、法人向けの「ADX2」と、同人・インディーゲーム開発者向けの無償版「ADX2 LE」があります。

![ADX2_r600.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/b0b9d5c6-2c6b-c62a-656a-6cb9d1330692.jpeg)

ADX2のシステムでは、音声ファイル単独に対して再生を行うのではなく、音声ファイルをラップした「キュー」という単位で音を再生します。

たとえば、「2個の音からランダムに効果音を鳴らす」という処理を考えてみます。ゲームエンジンの標準機能などでは、通常はゲームプログラム側で開発する必要があります。
しかし、ADX2にはプラグイン内に「ランダム再生」の汎用機能が用意されており、この処理を個別に作る必要がありません。
「キュー」に再生する音声データとランダム再生の設定を指定しておけば、実行時にADX2が設定に従ってランダム再生が行われます。

![ADX2キューの概念図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/15903e63-05a5-0cac-9a4a-90a6c451934b.jpeg)

キューに「この音は2種類の音からランダムに効果音を鳴らす」というフラグをセットしておくことで、その演出を含んだ音の再生が可能になります。このワークフローによって、プログラミングの総量を減らしつつ、サウンド再生の演出を作りこむことができます。
キューの設定は、同梱の専用ツール「Atom Craft」で行います。

![ADX2ツールオフィシャル画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/ec39eab7-d089-d6c4-975b-7cd57944d655.png)

ツールはWindows用とmac用が用意されています。見た目は作曲ツールっぽいですが、ADX2はキャラクターボイスや効果音の管理・制御に役立つ機能も多く入っています。
たとえば、キューには制御パラメーターの他に文字データを埋め込むことができます。ボイスデータの管理においては、セリフ文字そのものを埋め込むことで、このキューがなんのセリフなのか目視で確認できます。

![ユーザーデータによるセリフの埋め込み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/b3bd3a54-6e11-3340-cf09-15fca13a2cf5.png)

（上記はAtom Craftでパラメーターを一括表示する「リストエディター」ウィンドウを使っています。後ほど解説します。）
この埋め込み情報はゲームエンジンやエディター側からも確認できますので、エディター上で確認しながら組み込んだり、ゲームの中でこの文字列を使ってセリフの表示をすることも可能です。

この記事では次の活用方法について紹介します。

* ADX2でボイス音声のデータを用意する手順
* ボイス音声データを一覧表示しながらボリューム調整
* BGMや環境音を同時再生しながらボイス音声データの聞こえ具合を確かめる
* カテゴリ分け機能で、ゲームの音量を音の種類ごとに管理
* 音声データに文字列を埋め込んで、何のセリフか判断しやすくする設定

また、次回の記事では次の活用方法を紹介します。

* カテゴリ分けを使って同一キャラのボイスは複数同時に再生させない設定
* BGMが鳴っているときにボイスを再生するとBGMの音量を落とす設定
* 複数のファイルからランダムに選んで再生する仕掛けを作る設定


# ADX2でボイス音声のデータを用意する手順

まずは、元となる音声データをツール「Atom Craft」に登録します。圧縮前の音声素材データは、AtomCraftの中の「マテリアル」ウィンドウで管理します。
マテリアルツリーウィンドウは、デフォルトでは左下に開いています。
閉じている場合は、下部のウィンドウ呼び出しボタンから「マテリアルツリー」を選んでクリックすると開きます。

![マテリアルツリーウィンドウ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/e2c84a7e-044c-8ce6-d892-b45fd54ad049.png)

このマテリアルツリーウィンドウにWaveファイルをドラッグ&ドロップすれば、ツールに登録されます。
なお、エクスプローラー側でwaveファイルを配置した場合は、マテリアルツリーウィンドウのフォルダ上右クリックメニューで出る「未登録ファイルの登録」でツール側が認識します。
ボイスデータはキャラクターごとのフォルダに分けて登録しておくと見やすいです。

## wavファイルをインポートして圧縮設定

ADX2のシステムでは、サウンドデータの圧縮設定は元素材データ単位で設定できます。設定は、プロジェクト全体の圧縮設定、フォルダごと、ファイルごとで細かく指定できます。

例として、ボイスデータのルートフォルダでボイス全体の圧縮設定を行います。キャラクターごとにボイスのフォルダを分けている場合は、フォルダ単位で一気に設定を適用しましょう。

![圧縮設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/f35a0a82-eb0f-bfbe-a960-09bbe2075aa8.png)

設定については、現代のゲーム機やスマホ、モバイル機器で動作させるならば「HCA」形式の「最高品質」モードで問題ないです。
データ容量の制限が厳しい場合は、重要度の低い音や容量にインパクトが大きい音のエンコード品質を下げることで対応します。

## サウンド再生単位である「キュー」を作成
waveファイルをAtom Craftに登録しただけでは、まだ再生用のデータを出力できません。
次の段階として、プログラムから再生される単位である「キュー」を作成します。

ボイス用のキューは、マテリアルツリーウィンドウから一括で生成・登録ができます。
マテリアルツリー内のフォルダを「ワークユニットツリー」のワークユニットフォルダへドラッグ＆ドロップすることで、マテリアルの名前と同じキューが一括生成されます。

![２新規キューの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/212b12c1-2c4c-4a16-fd9e-6c82d09732e1.png)

ワークユニットツリーのデフォルト設定では、「WorkUnit_0」というフォルダがあります。その下にドラッグアンドドロップすると、フォルダ単位の「キューシート」が生成され、マテリアルごとにキューが生成されます。
（ワークユニットツリーの名前はプロジェクトによって異なります）

![キュー一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/399c2950-13ef-96d8-662b-7eb6e1e9404c.png)

「キューシートは」、複数のキューをひとまとめにしたファイル単位です。Atom Craftからデータを出力する際は、キューシート単位でデータが生成されます。
プログラムからは、キューシート単位でデータの読み込みを行います。

ボイスデータ向けのキューシートの分け方ですが、アクションゲーム・RPGなどでは、バトルやフィールド場面用のサウンドデータはキャラクターごとのキューシートにまとめ、アドベンチャーゲームや会話パートなどでは、そのシーンのボイス音声データごとにまとめたりします。
キューシートの分け方についてはプロジェクトによって異なるので、実装担当と相談しておきましょう。

# ボイス音声データを一覧表示しながらボリューム調整
キューには様々な制御パラメータを含むことができます。このパラメータにはボリューム情報も含まれます。
ゲームの実装担当にデータを渡す前に、ツールで各ボイス音声のボリュームバランスを調整しておきましょう。
キューが持つパラメーターは、ワークユニットツリー上でキューを選択したときのインスペクターウィンドウで個別に編集できます。

![インスペクターでボリュームを確認2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/81af6996-59fc-4abb-4540-f2d293ad2812.png)

ボイスデータのように、同じように扱われるキューが大量にあるときはパラメータの編集を一括で行うと早いです。
その場合は「リストエディター」を使います。AtomCraftの下メニューから「リストエディター」を選択して開きます。

![リストエディターを開く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/29c3b860-fd81-a949-fa55-3455952cd0cc.png)

リストエディターは、ワークユニットツリー上で要素を選択したときに、その要素が含んでいるデータを一覧で表示します。キューの一覧を表示したいときは、その親となるキューシートを選択します。

はじめに、ボイスデータのボリュームパラメータを一括で0.7にします。これは他のボイス音声と比べて音量が小さかった時に、上げ幅を確保するための作業です。
（プロジェクトによっては0.4や0.5にするケースもあると思います）
リストエディターに表示されているアイコンのうち、スピーカーマークのようなアイコンをクリックすると「ボリューム」と「ボリュームランダム幅」の項目が現れます。
Ctrl + Aでキューを全選択してからどれかのボリューム項目を操作すると、選択したキュー全てに反映されます。

![一括ボリューム変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/49c313a1-1e2f-2f3b-4247-8c3c9a134fc6.png)

ADX2 LEの2.10系を使っている場合はリストエディターの見た目が少し違いますが、操作は同じです。「全て」または「ボリューム/ピッチ」ボタンで、各キューのボリューム項目を表示・操作できます。

![LE2.10系.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/42731524-4e89-7953-7b00-6a10a296a250.png)

一括操作した後は、上から順番にプレビュー再生しながら、ボリュームが大きすぎるキューが無いか確認しながら一つずつ修正していきましょう。
キューを選択しながら再生ボタンまたはF5キーでプレビュー再生が実行されます。

## BGMや環境音を再生しながらボイス音声を再生して確かめる

音楽プレイヤーなどと異なり、Atom Craftでは音声の同時再生が当たり前に行えます。
BGMのキューを再生開始させておき、そのままボイスデータのキューを再生することで、実際のゲームとほぼ同じ状況でボリュームを確認できます。
ツール上部の再生ボタンまたはF5キーで多重再生OK状態でのプレビュー再生を行います。
現在流れている音をすべて止めてからキューのプレビュー再生を行いたい場合は、スペースキーで実行できます。

ボイスが利用されるBGMや効果音と一緒に流したとき、意図した聞こえ方になっているかどうか確かめることができます、
ただしBGMの種類が多い場合は、キューシートを行ったり来たりすることが手間の場合もあります。
その際は、「セッションウィンドウ」機能を使うことで、キューシートをまたいだキューの一覧表示を行いながら再生できます。
また、より複雑な音の組み合わせを確かめることができます。「セッションウィンドウ」については、次のカテゴリ分けの後に説明します。

## カテゴリ分け機能による音量コンフィグ開発の簡略化

ADX2におけるボイスデータ管理において、「カテゴリ」機能は非常に便利です。
イメージとしては音声データにタグ付けが行われ、そのタグごとに音量や再生数制御が可能になります。

カテゴリそのものは、「プロジェクトツリー」で作成します。今回はカテゴリ分けとして、「BGM」「GameSe」「MenuSe」「EffectSe」「Voice」があるとします。
（適切な分け方はゲームジャンルによって異なります）

![カテゴリレイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/46d952b7-d6f0-1db1-7509-a5986507c065.png)

キューにカテゴリを設定してみましょう。リストエディターを開き、「◎」っぽいボタンでキュー情報を表示します。

![CRI Atom Craft Ver.3.44.08 (built on Jul 17 2020)2 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/f6dfe191-e3c4-4d29-433f-e5754645c1f6.png)

「ADX2 LE」の2.10系では「カテゴリ」をクリックすることでカテゴリ情報を表示します。

![LECategory2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/fa0b161c-aafb-73fe-e684-29933316c395.png)

キューシートをドラッグアンドドロップすれば、その下のキュー全てにカテゴリが設定されます。

![ドラッグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/d8334550-f579-ec69-a2c8-9616c611ba54.png)

また、キューを選んで一括指定することもできます。ALT + Aキーでキューを複数選択して、プロジェクトツリーウィンドウのカテゴリフォルダにドラッグアンドドロップします。これで、選択した全キューのカテゴリが一気に設定されます。

![カテゴリの編集 2020-11-21 00.26.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/7ef26f6e-5e29-d72f-8d04-3462bb4ab636.png)

これでボイスデータのキューに「VOICE」というカテゴリが付与されました。プログラムからは、このカテゴリごとにボリュームを変更することができます。
すなわち、ゲームでよくある「ボリュームコンフィグ」を簡単に作ることができます。
（ボイスの音量バランスをそろえる、といった静的な設定については、キューやトラック、キューシートのボリューム項目で調整するようにしましょう。）

実際にこのカテゴリでボリュームが変更されたときにどのような効果になるかを確かめてみましょう。ADX2の「セッションウィンドウ」という機能を使います。
メニューバーの「表示」「セッションウィンドウ」からセッションウィンドウ」を起動します。

セッションウィンドウは、ゲームから指定される様々なパラメータをエミュレートしつつ再生テストを行うウィンドウです。
今回はカテゴリによるボリューム調整を確かめるので、左上の「カテゴリ」ボタンを押してカテゴリを表示させ、下部の「player1」にはBGMのキューをドラッグアンドドロップ、「player2」にはボイスデータをドラッグアンドドロップします。
(player2はデフォルトではplaye1の裏側に別タブで隠れているので、いったんドラッグで分離してplayer1と2が並んで表示するようにしています）

![セッションウィンドウの活用例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/76b72d40-1220-8baf-23a2-80ed6c64203f.png)

上部の「カテゴリ」で影響を確かめたいカテゴリの「ボリューム」欄にチェックマークを入れ、スライダーを左右に操作することでボリュームの変化を確かめることができます。

また、セッションウィンドウではキーボードの左側エリアにキュー再生のショートカットが割り当てられていますので、複数の音を同時再生してみたり、連打してみたりすることが容易になっています。

## 音声データに文字列を埋め込んで、何のセリフか判断しやすくする設定

ボイス音声データにセリフの文字列を埋め込む作業を行ってみましょう。
リストエディターを表示し、ワークユニットツリー上でキューシートを選んでいる状態で「◎」アイコンをクリックします。
右側にある「ユーザーデータ」がキューに埋め込むことができる文字列データの領域です。
ここにセリフを記入していきます。

![ユーザーデータによるセリフの埋め込み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/b3bd3a54-6e11-3340-cf09-15fca13a2cf5.png)

どの名前のキューがなんのセリフが入っているか、非常に視認しやすくなりました。

例として、Unity Editorで表示させたときは次のように見ることができます。
(ADX2 for Unity SDKを少し改造しています。改造方法は[こちら](https://qiita.com/Takaaki_Ichijo/items/e39793805637a1bc576c) ）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">音響制作社さんからセリフデータが届いたので、さっそく組み込みチェック。Unity + ADX2。キューのユーザーデータ領域へセリフ文字列を埋め込んでおいて、Atom Browser(ADX2 LEの場合は旧Atom Window）を改造して一覧表示化、いい感じ。 <a href="https://twitter.com/hashtag/UnityTips?src=hash&amp;ref_src=twsrc%5Etfw">#UnityTips</a> <a href="https://twitter.com/hashtag/%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA?src=hash&amp;ref_src=twsrc%5Etfw">#ゲーム開発</a> <a href="https://t.co/JjJyjsCUKa">pic.twitter.com/JjJyjsCUKa</a></p>&mdash; ichijo (@Takaaki_Ichijo) <a href="https://twitter.com/Takaaki_Ichijo/status/1329965813445529601?ref_src=twsrc%5Etfw">November 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


「ユーザーデータ」はツールから出力する音声データに埋め込まれる情報ですが、似たような項目に「コメント」があります。これは出力データに含まれず、ツール上でのメモとしての機能で使います。

（後編に続く）