tencent cloud

Game Multimedia Engine

製品アップデート情報
製品紹介
製品概要
優位性のある特徴
製品機能
ユースケース
セキュリティコンプライアンス認証
初心者ガイド
SDKダウンロードガイド
製品機能体験
基本機能Demo
シーン化体験
コンソールガイド
使用量の表示
サービスの有効化
クイックスタート
Quick Integration of SDK
Quick Integration of Sample Project
基本機能開発ガイド
Authentication Key
リアルタイム音声ロール設定
音質設定
拡張機能開発ガイド
サーバー側のレコーディング
レンジボイス
3Dサウンド
効果音と伴奏
ネットワークオーディオストリーム転送ルーティング
カスタムメッセージチャネル
社内ファイアーフォール制限への対応について
Language Parameter Reference List
GMEルーム管理機能の導入
クライアントAPI
SDK for Unity
SDK for Unreal Engine
Cocos2D SDK
SDK for Windows
SDK for iOS
SDK for Android
SDK for macOS
H5 SDK
Electron SDK
SDK for Flutter
SDK Version Upgrade Guide
エラーコード
Toolchain
Server APIs
History
Introduction
API Category
Usage APIs
Recording APIs
Making API Requests
Voice Chat APIs
Application APIs
Data Types
Error Codes
よくある質問
製品機能質問
問題解決ガイド
課金について
Sample Projectの使用上の問題
一般的な質問
認証について
リアルタイム音声ルーム参加失敗について
リアルタイム音声利用時に音声が聞こえない問題とオーディオ関連について
ネットワークについて
ボイス・ツー・テキスト変換について
プロジェクトエクスポートについて
Service Agreement
Service Level Agreement
お問い合わせ
用語集
GME ポリシー
データ処理とセキュリティ契約
プライバシーポリシー

レンジボイス

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




ヘルプとサポート

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

フィードバック