Voiceイントロ

Contents

はじめに

Photon Voice 2はPhoton Voiceの後継です。以下の機能がアップデートされました:

  • より優れたUnityコンポーネントを持つAPI。
  • PUN2との互換性
  • 柔軟性:PUN2から切り離されたので、Photon Realtime、Photon Bolt、Photon Chat、さらにスタンドアロンでも使用できるようになりました。
  • WebRTCベースの新しいDSP(デジタルシグナルプロセッサー)
  • 更新された新しいデモ

Photon Voice 2は、こちらからUnity Asset Storedでダウンロードおよびインポートできます。 2017.4.7f1以上のUnityバージョンが必要です。

Back To Top

対応プラ​​ットフォーム

  • Windows
  • UWP
  • macOS
    • Android(64ビットへの対応についてはこちらをご覧ください。
  • iOS
  • PlayStation 4(特別なアドオンが必要です。こちらからダウンロードしてください。コンソールへのアクセスについては こちらをご覧ください。)
  • Nintendo Switch (特別なアドオンが必要です。こちらからダウンロードしてください。コンソールへのアクセスについてはこちらをご覧ください。)
  • MagicLeap(Lumin OSの特別なアドオンが必要です。こちらからダウンロードしてください。Magic Leapについてはこちらをご覧ください。)
  • Xbox One (こちらからダウンロードできる特別なアドオンが必要。コンソールへのアクセスについてはこちらをご確認ください。)

Back To Top

主要コンポーネント

VoiceConnection

VoiceConnectionコンポーネントインスタンスは、シーンでvoiceクライアントをPhoton Serverに接続するために必要です。 ボイスの通信はルーム内でしか行えないため、VoiceConnectionを使用してマッチメイキングを行い、クライアントが確実にルームに参加できるようにします。

Back To Top

Recorder

Recorderは非常に重要なコンポーネントです。こちらに専用のページがあります。

Back To Top

Speaker

Speakerコンポーネントは、受信したオーディオストリームを再生します。 UnityのAudioSourceコンポーネントを利用しています。このコンポーネントは、ボイスストリームのコンテキスト外や、 作成イベントを介して受信されるストリームの情報を取得するまでは、あまり意味を持ちません。 そのイベントとイベントに含まれるデータは、ローカルのSpeakerコンポーネントをリモートのボイスストリームにリンクするために重要です。 次のセクションでは、Speakerの使用方法について説明します。

Back To Top

SpeakerFactory

SpeakerFactoryメソッドは、新しいリモートボイスストリーム情報を受信するたびに呼び出されます。 SpeakerFactoryの役割は、受信されるリモートボイスストリーム(Recorderコンポーネントインスタンスを介して送信される)をローカルのSpeakerコンポーネントインスタンスとリンクまたはバインドすることです。 リモートのボイスストリームとローカルのSpeaker、またはリモートのRecorderとローカルのSpeakerの間の一対一の関係に対応しています。 デフォルトでは、単一のSpeakerコンポーネントインスタンスを使用して複数の受信オーディオストリームを混ぜて再生することはできません。 Speakerは1つのRecorderに1度リンクされますが、同じオーディオストリームに複数回リンクすることはできません。 複数のSpeakerコンポーネントインスタンスを使用して単一の受信オーディオストリームを再生することもできません。

Factoryで、そのリモートボイスストリームから受信したオーディオフレームを再生するために使用されるSpeakerコンポーネントを返す必要があります。 新しいSpeakerコンポーネントを作成するか、古いSpeakerコンポーネントを再利用するか、またはnullを返して、そのリモートボイスストリームによるすべての受信オーディオフレームの再生をスキップすることができます。

SpeakerFactoryメソッドに渡されるパラメーターは、オーディオストリームの発信元またはソースを識別するのに役立ちます。 SpeakerFactoryの本体のコードを使用して、リモートRecorderコンポーネントから発信される着信オーディオストリームから受信されるオーディオフレームを再生するための最適な候補Speakerコンポーネントを見つけます(または必要に応じて新しいものを作成します)。

SpeakerFactoryメソッドは3つのパラメーターを受け入れ、同じGameObjectにアタッチされたAudioSourceコンポーネントを使用して着信オーディオを再生するために使用されるSpeakerコンポーネントを返します。 SpeakerFactoryメソッドで受け入れられる3つのパラメーターは次のとおりです。

  • playerId: オーディオストリームの発信元のプレイヤーのアクター番号。
  • voiceId: 同じ playerIdから発生するオーディオストリームの番号。
  • userData: オーディオストリームを送信しているRecorderコンポーネントに設定されたカスタムオブジェクト。

Back To Top

デフォルトのSpeakerFactory

SpeakerFactoryを明示的に設定していない場合は、デフォルトのVoiceConnection.SimpleSpeakerFactoryが使用されます。 デフォルトのVoiceConnection.SimpleSpeakerFactoryは、リモートボイスストリームごとにローカルにインスタンス化されたSpeakerが設定されることを保証します。 SpeakerPrefabを設定すると、そのプレハブはデフォルトの回転とデフォルトの位置で階層内のルートオブジェクトとしてインスタンス化されます。 それ以外の場合、新しいGameObjectが作成されます。 Speakerコンポーネントが接続されているGameObjectは、 "Speaker for Player {0} Voice#{1}"と名前が変更され、 リモートボイスストリームが削除されると破棄されます。

## インタレストグループの使用法詳細説明

Photon VoiceはPhoton Realtimeの"インタレストグループ"を使用して、異なる「ボイス会話」に属する相互に排他的な「ボイスチャネル」を切り離しています。

Back To Top

「聞く相手」を選択する

各アクターは、興味のあるインタレストグループに登録する必要があります。 デフォルトで、すべてのアクターはボイスのブロードキャストについてグローバルインタレストグループとみなされる、インタレストグループ0をリッスンするようになっています。 他のグループに送信されたボイスを聞くには、送信先のグループに登録する必要があります。 一度登録したグループから登録解除することもできます。 これらすべての操作方法は以下の通りです。:

// PUN統合なし:
voiceConnection.Client.OpChangeGroups(groupsToRemove, groupsToAdd);
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(groupsToRemove, groupsToAdd);

Back To Top

「話す相手」を選択する

各アクターは、どのインタレストグループに音声を送信するか決定する必要があります。 送信先となるインタレストグループは以下のように設定します。

recorder.InterestGroup = targetGroup;

Back To Top

ユースケース

全てのケースにおいて、常にデフォルトのインタレストグループ0をリッスンしています。同時に Recorder コンポーネントごとにボイスを単一のインタレストグループに送信できます。 ユースケースは3つのカテゴリに分類できます:

Back To Top

1. シングルグローバルグループ

同時に単一のグループを1つ使用して、すべてのクライアントとすべての Recorderコンポーネントにボイスを送信する場合は、このグローバルグループに設定・切替を行うショートカットがあります。

// PUN統合なし:
voiceConnection.Client.GlobalInterestGroup = targetGroup;
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.GlobalInterestGroup = targetGroup;

この場合、ChangeAudioGroupsを呼び出したりPhotonVoiceRecorder.AudioGroupを設定する必要はありません。システムが行います。

注:

  • targetGroup0と等しい場合は、デフォルトの挙動になります。 変更を加えたり設定をリセットしない限り、グローバルグループとして明示的に設定する必要はありません。
  • targetGroup0 と等しくない場合でも、同グループに送信されたボイスストリームを受信します。
  • すべての Recorder コンポーネント送信はグローバルに設定された同じターゲットグループを使用します。

Back To Top

2. シングルグループをリッスンする

これは、以下が許可されている点でひとつ前のカテゴリとは異なります:

  • Recorderごとに別のターゲットグループを設定する
  • リッスンするグループは、話すグループとは別の可能性があります。

Back To Top

A. デフォルトグループ
// A. すべてのグループから登録解除します。グループが変更されていない場合は任意です。
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(new byte[0], null);
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(new byte[0], null);

// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;

Back To Top

B. 他のグループ
// A.リッスンするグループに登録します
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(new byte[0], new byte[1] { groupToListenTo });
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(new byte[0], new byte[1] { groupToListenTo });

// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;

Back To Top

3. 複数のグループをリッスンする

A. 既存のグループすべてをリッスンする
// A.既存のグループすべてに登録します
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(null, new byte[0]);
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(null, new byte[0]);

// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;

あとで、この呼び出しの後に生成されたグループに登録する必要があります。

Back To Top

B. グループのAリストをリッスンする
// A. グループのカスタムリストに登録します
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(new byte[0], new byte[0] { groupToListenTo });
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(new byte[0], new byte[0] { groupToListenTo });

// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;

自分がリッスンしているグループ以外のグループに話すことができます。 例 groupsToListenTotargetGroupを含めませんでした。

Back To Top

C. 可能なグループすべてをリッスンする

こちらは慎重に使用してください。使用されることのないグループにクライアントを登録してしまう可能性があります。

using System;
using System.Linq;
// [...]
byte[] allByteValues = Enumerable.Range(1, 255).SelectMany(BitConverter.GetBytes).ToArray(); 

// A.すべてのグループに登録します
// PUN統合なし:
voiceConnection.Client.OpChangeGroups(null, allByteValues);
// PUN統合あり:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(null, allByteValues);

// B. ターゲットインタレストグループを設定します
photonVoiceRecorder.InterestGroup = targetGroup;

Back To Top

ボイスの使い方(PUNを使用せずに)

  1. シーンにVoiceConnectionコンポーネントを追加する。
  2. VoiceConnection.SettingsでAppSettingsを設定する。
  3. シーンにレコーダーを追加し、そのプロパティを更新してVoiceConnection.PrimaryRecorderに割り当てる。
    3.a. 必要に応じてRecorder.TransmitEnabledを有効にして、準備ができ次第すぐに送信を開始することができます。
    3.b. 必要に応じてRecorder.DebugEchoModeを有効にして、自分の声を聞くことができます(ローカルスピーカーをリンクする必要があります。手順4を参照)。
  4. スピーカーコンポーネントをリモート音声ストリームにリンクする方法を決定: 4.a. 必要に応じてSpeakerFactoryメソッド を実装し、コードでVoiceConnection.SpeakerFactoryに割り当てる。
    4.b. デフォルトのSpeakerFactoryを使用する場合は、必要に応じてSpeakerプレハブ(Speakerコンポーネントを含むプレハブ)を追加してVoiceConnection.SpeakerPrefabに割り当てる。
  5. ルームに参加する。参加には、Photon Realtimeのマッチメイキングオペレーションのいずれかを使用("ConnectAndJoin.cs"ユーティリティスクリプトを参照)。
  6. [3.aで有効にしていない場合]ルームでRecorder.TransmitEnabledtrueに設定して送信を開始します。.
  7. [3.bで有効にしていない場合]必要に応じて、送信側レコーダーでRecorder.DebugEchoModeを有効にして、自分の声を聞くことができます。

Back To Top

PUNを削除する方法

PUNなしでPhoton Voiceを使用する場合は、PUNをプロジェクト内に保持するか、単に削除することができます。 これを行うためのショートカットがEditor上にあります:"Window" -> "Photon Voice" -> "Remove PUN"。

Remove PUN Menu Item
PUNメニューアイテムを削除

または、次の手順に従って手動で実行できます。

  1. Demos\DemoVoicePUNフォルダを削除する
  2. Photon\PhotonVoice\Code\PUNフォルダを削除する
  3. Photon\PhotonUnityNetworkingフォルダを削除する 4."Project Settings" - > "Player"> "Other Settings"> "Script Define Symbols"で、「PHOTON_UNITY_NETWORKING」、「PUN_2_X_OR_NEWER」、「PUN_2_OR_NEWER」が削除されていることを確認する。

Asset StoreからPhoton Voice 2をインポートすることで、いつでもファイルを元に戻すことができます。

Back To Top

Photon Chatを削除する方法

Photon ChatなしでPhoton Voiceを使用する場合は、Photon Chatをプロジェクト内に保持するか、単に削除することができます。 これを行うためのショートカットがEditor上にあります:"Window" -> "Photon Voice" -> "Remove Photon Chat"

Remove Photon Chat Menu Item
Photon Chatメニューアイテムを削除

または、"Photon\PhotonChat"フォルダーを削除して、手動で行うことも可能です。

Asset StoreからPhoton Voice 2をインポートすることで、いつでもファイルを元に戻すことができます。

To Document Top