tencent cloud

Game Multimedia Engine

レンジボイス

PDF
フォーカスモード
フォントサイズ
最終更新日: 2024-01-18 15:47:47

機能の説明

音声ルーム内では、ユーザーはある距離内にいる他のユーザーとリアルタイムで音声通話を行うことができます。この機能は、ビジネス層でGMEクライアントインターフェースを呼び出して音源の方位を更新します。サーバーに自端の位置を通知することを目的とします。自端の世界座標+自端が受信した音声の範囲他端の世界座標+他端が受信した音声の範囲によって判断した後、サーバーでプレイヤーの範囲内の音声ストリームを転送し、デフォルトでは、プレイヤーから最も近い20本の音声ストリームに転送します。最大数万人がルーム内に同時にマイクをオンにすることができます

ユースケース

PUBGゲーム
PUBGゲーム、生存射撃モバイルゲーム特有の「チームのみ」または「全員」のボイスモードを提供します。ゲームの設定で、プレイヤーが次の項目を選択できます: 1.「チームのみ」モードを使用すると、チーム内のチームメイトが話している声だけが聞こえます。 2.「すべての人」モードを使用すると、チーム内のチームメイトの声や、ある範囲内で他の対局者が話している声を聞くことができます。
没入型バーチャルシーン
例えばゲームのコンサートなどのバーチャルシーンでは、レンジボイスを使ってボーカリストがバーチャルルーム内で歌い、聴衆全員が歌声を聞きながら、自分の一定範囲内の他の聴衆とコミュニケーションをとるようになっています。最高で同ルーム内の1万人以上が同時にマイクをオンにすることができます。

体験効果

Demo体験で体験プログラムをダウンロードし、3Dサウンドやレンジボイスの効果を体験することができます。

基本コンセプト

レンジボイス機能を使用するには、音声モード音声受信範囲TeamIDという3つのコンセプトがあります。

ボイスモード

レンジボイスルームに参加した時に、2種類の音声モードを選択することが可能です。
ボイスモード
パラメータ名
機能
すべての人
RANGE_AUDIO_MODE_WORLD
設定されると、プレイヤーの近くにいる一定範囲の人がプレイヤーの話を聞くことができます。その範囲内にこのモードが設定されているプレイヤーがいれば、お互いに話をすることもできます。
チームメンバーがお互いに聞こえます
チームのみ
RANGE_AUDIO_MODE_TEAM
チームメンバーだけがお互いに聞こえます
ご注意:
チームメイト間の通話は、距離や音声モードに左右されません。

音声受信範囲




音声モードがすべての人(RANGE_AUDIO_MODE_WORLD)に設定されている場合、この場合の音声受信範囲はUpdateAudioRecvRangeインターフェースの影響を受けます。
次の2人のプレイヤーAとBが異なるチームで、音声モードがすべての人(RANGE_AUDIO_MODE_WORLD)に設定されているとします。
プレーヤー座標
音声受信範囲
他のプレイヤーとの音声到達可能状況
チームメンバーとの音声到達可能状況
A(0,0,0)
10メートル
プレイヤーBはプレイヤーAから10メートル以内にいるため、プレイヤーBの声を聞くことができます
同じチームのメンバー同士の通話には影響しません
B(0,8,0)
5メートル
プレイヤーAとプレイヤーBは5メートル以上離れているため、プレイヤーAの声は聞こえません。
同じチームのメンバー同士の通話には影響しません
説明:
プレイヤー音声到達状況の詳細については付属書をご参照ください。

TeamID

範囲ボイスを使用するには、SetRangeAudioTeamIDインターフェースを呼び出してチーム番号TeamIDを設定し、EnterRoomインターフェースを呼び出してボイスルームに入る必要があります。
ルームに参加するときに指定されたTeamID != 0の場合、範囲ボイスルームモードに切り替えます。メンバーがTeamID=1を使用してボイスルームに入った場合、そのボイスモードがRANGE_AUDIO_MODE_TEAMに設定されると、TeamID=1のメンバーだけが彼の声を聞くことができます、設定された音声モードがRANGE_AUDIO_MODE_WORLDであれば、TeamID=1のメンバー以外の一定範囲のプレイヤーにもその音声を聞くことができます。
TeamIDの状況
ボイスモード
範囲
音声到達可能状況
TeamID != 0で、仮にTeamID=1とします
RANGE_AUDIO_MODE_TEAM
10メートル
TeamID=1のメンバーと通話できます
RANGE_AUDIO_MODE_WORLD
10メートル
TeamID=1のメンバーと、音声モードがRANGE_AUDIO_MODE_WORLDに設定されている同室10メートル以内のメンバーと通話できます
チームID=0を使用して音声ルームに入室したメンバーは、レンジボイスのホストモードとなり、ルーム内の全員(音声モードがすべての人であるか、チームのみであるかにかかわらず)がそのメンバーの音声を聞くことができます。
TeamIDの状況
TeamIDの変更タイミング
範囲
音声到達可能状況
TeamID = 0
ルームに入る前にTeamID!=0、ルームに入ったらTeamID=0に変更します
10メートル
話し声はルーム内のすべての人に聞こえます(音声モードがすべての人かチームのみかを問わない)
TeamID=0のメンバーとコミュニケーションが取れます
RANGE_AUDIO_MODE_WORLDに設定された同ルーム、10メートルの範囲内でメンバーの声が聞こえます
ルームに入る前にTeamID=0であり、TeamID=0でルームに入ります
10メートル
話し声はルーム内のすべての人に聞こえます(音声モードがすべての人かチームのみかを問わない)
TeamID=0のメンバーとコミュニケーションが取れます
ルーム内の他の人の声が聞こえません

シナリオ例

PUBGゲーム:例えばPUBGタイプのゲームでは、4人でチームを組む場合、この4人に同じチーム番号TeamIDを設定する必要があります。100人ごとに1つの対局ルーム、1つの対局に25チームがある場合、25チームは同じ音声ルームに入る必要があります。対局中、あるプレイヤーが10メートル範囲内の見知らぬ人とコミュニケーションを取りたい場合、音声距離範囲を10に設定し、音声モードをRANGE_AUDIO_MODE_WORLDに設定し、またマイクとスピーカーをオンにします。チーム以外のメンバーでなく、チームメンバーとコミュニケーションを取りたい場合は、音声モードをRANGE_AUDIO_MODE_TEAMに設定するだけでよい。
ゲームコンサート:ゲーム中にコンサートを開催し、歌手とゲームプレイヤーが対話しない場合、ゲームプレイヤーがTeamID=OpenIDを使用してレンジボイスルームに入ることができます。また音声モードをRANGE_AUDIO_MODE_WORLDに設定し、ゲームのプレイ方法に応じて音声距離の範囲を設定します。これにより、ゲームプレイヤーは近くのプレイヤーとコミュニケーションを取ることができます。歌手がTeamIDを0に設定してルームに入ると、歌手の声はルームの人全体に聞こえるが、歌手には他の人の声は聞こえません。
ホストモード:ゲーム中の仮想テーブルゲームのようなシーンでは、ホストの話し声はルーム内のすべての人に聞こえると同時に、範囲内のプレイヤーの話し声も聞こえるようにしなければなりません。ホストはまずTeamID!=0の形でルームに入り、ルームに入ってからTeamIDを0にすると、その時点でホストの話はルーム内のすべての人に聞こえ、ホストも範囲内のプレイヤーの声を聞くことができます。

前提条件

リアルタイム音声サービスが有効になっていること音声サービス有効化ガイドをご参照ください。
GME SDK導入済み:コアインターフェースとリアルタイム音声インターフェースの導入を含みます。詳細については、Native SDKクイックスタートUnity SDKクイックスタートUnreal SDKクイックスタートをご参照ください。
万人レンジボイス:同室でレンジボイスを使用する人数は1000人を超えた場合は、チケットを提出してGME開発者に連絡してください。

使用手順




ご注意:
この手順に従ってインターフェースを呼び出してください。
フローチャットの青い部分はレンジボイスに必要な手順です。
通常のチーム音声ルームとは異なり、レンジボイス機能を使用しているは、スムーズな音質でルームに入る必要があります
入室が成功した後、UpdateAudioRecvRangeを1回以上呼び出し、フレームごとにUpdateSelfPositionを呼び出します。

1. TeamIDの設定

ルームに入る前に、このインターフェースでチーム番号を設定すると、次回の入室に有効です。
入室後、このインターフェースを使用してチーム番号を変更できます。設定後すぐに有効になります。
退室後、TeamIDが自動的に0にリセットされないため、当該ボイスモードを呼び出すことを決めたら、毎回はEnterRoomの前にこのメソッドを呼び出しTeamIDを設定してください。
退室してからもう一度入室した場合、退室成功のコールバックを実行した後、チーム番号設定インターフェースを呼び出してください。

関数のプロトタイプ

ITMGContext SetRangeAudioTeamID(int teamID)
パラメータ
タイプ
意味
teamID
int
チームナンバーであり、レンジボイスモードの利用中に使われています。TeamIDが0の場合は、通話モードは一般チームボイスで、デフォルトは0です。

2. 音声モードの設定

入室前に、このインターフェースを呼び出して音声モードを変更します。次回の入室に有効です。
入室後、このインターフェースを呼び出して音声モードを変更すると、現在のユーザーの音声モードが直接変更されます。
退室後、このパラメータは自動的にMODE_WORLDにリセットされないため、このメソッドを呼び出すことを決めたら、毎回はEnterRoomの前にこのメソッドを呼び出し、audioModeを設定してください。

関数のプロトタイプ

ITMGRoom int SetRangeAudioMode(RANGE_AUDIO_MODE rangeAudioMode)
パラメータ
タイプ
意味
rangeAudioMode
int
0(MODE_WORLD)が「全ての人」を表し、1(MODE_TEAM)が「チームのみ」を表します

3. 音声ルームに参加します

EnterRoomを呼び出す前に、SetRangeAudioTeamIDとSetRangeAudioModeの2つのAPIを呼び出す必要があります。

関数のプロトタイプ

ITMGContext.GetInstance(this).EnterRoom(roomId,ITMG_ROOM_TYPE_FLUENCY, authBuffer);
音声ルームに入るにはスムーズな音質を使用しなければなりません。その後、入室のコールバックを監視して処理します。
public void OnEvent(ITMGContext.ITMG_MAIN_EVENT_TYPE type, Intent data) {
if (ITMGContext.ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVENT_TYPE_ENTER_ROOM == type)
{
//イベントから返されたデータの分析
int nErrCode = data.getIntExtra("result" , -1);
String strErrMsg = data.getStringExtra("error_info");

if (nErrCode == AVError.AV_OK)
{
///入室シグナリングを受信し、入室が成功し、機器を操作できます
ScrollView_ShowLog("EnterRoom success");
Log.i(TAG,"EnterRoom success!");
}
else
{
//入室に失敗し、返されたエラーメッセージを分析する必要があります
ScrollView_ShowLog("EnterRoom fail :" + strErrMsg);
Log.i(TAG,"EnterRoom fail!");
}
}
}
入室が成功すると、UpdateAudioRecvRangeを少なくとも1回呼び出し、フレームごとにUpdateSelfPositionを呼び出します。

4. ボイス受信距離範囲の設定

このメソッドで設定された音声受信範囲(距離はゲームエンジンによって異なる)は、正常に入室した後に呼び出すことが可能です
このメソッドはUpdateSelfPositionと連携し音源位置を更新することに使われています
このメソッドは一度呼び出すだけで有効になり、変更が可能です。

関数のプロトタイプ

ITMGRoom int UpdateAudioRecvRange(int range)
パラメータ
タイプ
意味
range
int
音声を受信できる最大範囲(エンジン距離単位)

サンプルコード

ITMGContext.GetInstance().GetRoom().UpdateAudioRecvRange(300);

5. 音源方位の更新

音源方位の更新はサーバーに自端の位置を通知することを目的とします。自端の世界座標+自端が受信した音声の範囲と、他端の世界座標+他端が受信した音声の範囲で判断し、レンジボイス効果を達成します。
この関数は音源方位の更新に使用されます。入室が成功した後に呼び出すことができます。またフレームごとにを呼び出す必要があります。Unityエンジンの場合、このインターフェースはUpdateで呼び出される必要があります。
レンジボイスを使用して音源方位を更新する必要があります。範囲判断能力が不要な場合でも、ルームに入ってから一度このインターフェースを呼び出す必要があります
3Dサウンド効果を同時に使用する場合、このインターフェースのパラメータaxisForward、axisRightおよびaxisUpは下文の3Dボイスセクションに従って設定する必要があります。

関数のプロトタイプ

public abstract int UpdateSelfPosition(int position[3], float axisForward[3], float axisRight[3], float axisUp[3])
パラメータ
タイプ
意味
position
int[]
ワールド座標系中の座標で、前、右、上の順序で表示されます
axisForward
float[]
この製品では無視してください
axisRight
float[]
この製品では無視してください
axisUp
float[]
この製品では無視してください

レンジボイスと3D効果音

上文で紹介したレンジボイス機能は、距離によって音声の到達性を制御するもので、より没入感のある体験が必要な場合は、3D効果音と併用することをお勧めします。

使用手順

レンジボイスを使用すると同時に、3D効果音機能を使用する場合は、ルームに入ってから次のレンジボイスステップ1、2、3を完了した後、3Dエンジンを初期化し、3D効果音をオンにします。




説明:
フローチャートの緑の部分は、3D音声に必要な手順です。

前提条件

レンジボイスの利用手順 を参照して手順1、2、3を完了してください。

4. 3D効果音エンジンの初期化

この関数は、3Dサウンドエフェクトエンジンを初期化するために使用され、入室した後に呼び出します。このインターフェイスは、3Dサウンドエフェクトを使用する前に呼び出す必要があります、3Dサウンドエフェクトを送信せず受信するのみのユーザーでも、このインターフェイスを呼び出す必要があります。

関数のプロトタイプ

public abstract int InitSpatializer(string modelPath)
パラメータ
タイプ
意味
modelPath
string
空欄を埋めてください

5. 3D効果音のオン/オフ

この関数は、3Dサウンドエフェクトをオン/オフにするために使用されます。オンにした後、3Dサウンドエフェクトが聞こえます。

関数のプロトタイプ

public abstract int EnableSpatializer(bool enable, bool applyToTeam)
パラメータ
タイプ
意味
enable
bool
オンにすると3D効果音が聞こえます
applyToTeam
bool
3D音声はチーム内で機能するかどうかを示します。enbleがtrueである場合にのみ有効です。
IsEnableSpatializerインターフェースを使用して3Dサウンドの状態を取得します。

6. ボイス受信距離範囲(3D)の設定

このメソッドで設定された音声受信範囲(距離はゲームエンジンによって異なる)は、正常に入室した後に呼び出すことが可能です
このメソッドはUpdateSelfPositionと連携し音源位置を更新することに使われています
このメソッドは一度呼び出すだけで有効になります。
3Dサウンドエフェクトでは、音源のボリュームは音源の距離と減衰関係にあります。単位距離がrangeを超えた後、ボリュームはほぼゼロまで減衰します。
距離と音声の減衰の関係については、ドキュメント付属書をご参照ください。

関数のプロトタイプ

ITMGRoom int UpdateAudioRecvRange(int range)
パラメータ
タイプ
意味
range
int
音声を受信できる最大範囲(エンジン距離単位)

サンプルコード

ITMGContext.GetInstance().GetRoom().UpdateAudioRecvRange(300);

7. 音源方位(3D)の更新

音源方位の更新はサーバーに自端の位置を通知することを目的とします。自端の世界座標+自端が受信した音声の範囲と、他端の世界座標+他端が受信した音声の範囲で判断し、レンジボイス効果を達成します。
この関数は音源方位の更新に使用されます。入室が成功した後に呼び出すことができます。またフレームごとにを呼び出す必要があります。Unityエンジンの場合、このインターフェースはUpdateで呼び出される必要があります。
この機能を使用するには、サンプルコードを直接コピーして呼び出してください

関数のプロトタイプ

public abstract int UpdateSelfPosition(int position[3], float axisForward[3], float axisRight[3], float axisUp[3])
パラメータ
タイプ
意味
position
int[]
ワールド座標系中の座標で、前、右、上の順序で表示されます
axisForward
float[]
ローカル座標系前軸の単位ベクトル
axisRight
float[]
ローカル座標系右軸の単位ベクトル
axisUp
float[]
ローカル座標系上軸の単位ベクトル

サンプルコード

Unreal
FVector cameraLocation = UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0)->GetCameraLocation();
FRotator cameraRotation = UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0)->GetCameraRotation();
int position[] = {
(int)cameraLocation.X,
(int)cameraLocation.Y,
(int)cameraLocation.Z };
FMatrix matrix = ((FRotationMatrix)cameraRotation);
float forward[] = {
matrix.GetColumn(0).X,
matrix.GetColumn(1).X,
matrix.GetColumn(2).X };
float right[] = {
matrix.GetColumn(0).Y,
matrix.GetColumn(1).Y,
matrix.GetColumn(2).Y };
float up[] = {
matrix.GetColumn(0).Z,
matrix.GetColumn(1).Z,
matrix.GetColumn(2).Z};
ITMGContextGetInstance()->GetRoom()->UpdateSelfPosition(position, forward, right, up);
Unity
Transform selftrans = currentPlayer.gameObject.transform;
Matrix4x4 matrix = Matrix4x4.TRS(Vector3.zero, selftrans.rotation, Vector3.one);
int[] position = new int[3] {
selftrans.position.z,
selftrans.position.x,
selftrans.position.y};
float[] axisForward = new float[3] {
matrix.m22,
matrix.m02,
matrix.m12 };
float[] axisRight = new float[3] {
matrix.m20,
matrix.m00,
matrix.m10 };
float[] axisUp = new float[3] {
matrix.m21,
matrix.m01,
matrix.m11 };
ITMGContext.GetInstance().GetRoom().UpdateSelfPosition(position, axisForward, axisRight, axisUp);

ホストに3D効果音を使用することを禁止する

もしシナリオの中でプレイヤーがレンジボイスのホストモードを使用する場合、つまり彼の声はルーム内のすべてのプレイヤーが聞くようにする場合、3D音声ブラックリストインターフェースを参照し、すべての聴取側でホストを聴取側の3D音声ブラックリストに追加する必要があります。これで、3D音声機能減衰効果がホストの音声到達性の影響を回避します。
各ロールのAPI呼び出しのタイミングは次のとおりです:
ホストAPIタイミング
視聴者APIタイミング



付録

各音声モード

各音声モードでのプレイヤーの音声到達状況:
仮にAプレイヤーの状態を「すべての人」とすると、対応するBプレイヤーの異なる音声モードでの到達可能状況は下記の通りです:
同じチームかどうか
範囲内かどうか
ボイスモード
AとBがお互いの声を聞いているかどうか
同じチーム
はい
MODE_WORLD
はい
MODE_TEAM
はい
いいえ
MODE_WORLD
はい
MODE_TEAM
はい
異なるチーム
はい
MODE_WORLD
はい
MODE_TEAM
いいえ
いいえ
MODE_WORLD
いいえ
MODE_TEAM
いいえ
仮にAプレイヤーの状態を「チームのみ」とすると、対応するBプレイヤーの異なる音声モードでの到達可能状況は下記の通りです:
同じチームかどうか
範囲内かどうか
音声状態
AとBがお互いの声を聞いているかどうか
同じチーム
はい
MODE_WORLD
はい
MODE_TEAM
はい
いいえ
MODE_WORLD
はい
MODE_TEAM
はい
異なるチーム
はい
MODE_WORLD
いいえ
MODE_TEAM
いいえ
いいえ
MODE_WORLD
いいえ
MODE_TEAM
いいえ

距離と音の減衰の関係

3Dサウンドエフェクトでは、音源のボリュームは音源の距離と減衰関係にあります。単位距離がrangeを超えた後、ボリュームはほぼゼロまで減衰します。
距離範囲(エンジン単位)
減衰公式
0 < N < range/10
減衰係数:1.0(音量が減衰しない)
N ≥ range/10
減衰係数:range/10/N




ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック