tencent cloud

フィードバック

レンジボイス

最終更新日: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
    
    
    
    お問い合わせ

    カスタマーサービスをご提供できるため、ぜひお気軽にお問い合わせくださいませ。

    テクニカルサポート

    さらにサポートが必要な場合は、サポートチケットを送信して弊社サポートチームにお問い合わせください。24時間365日のサポートをご提供します。

    電話サポート(24 時間365日対応)