Voiceイントロ

目次

はじめに

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

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

Photon Voice 2は、こちらからUnity Asset Storedでダウンロードおよびインポートできます。

トップに戻る

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

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

トップに戻る

インストール手順

Unityの2018.4.22f1以上のバージョンが必要です。

Photon Voice 2は こちらのUnityアセットストアからダウンロードおよびインポート可能です。

Photon Voice 2パッケージにはPUN2が含まれます。 PUN 2はPhoton Realtime Unity SDK、Photon Chat、Photon Unityライブラリに依存するため、Photon Realtime Unity SDKを含みます。 必要に応じてプロジェクトからPUN2のクリーンアップ or Photon Chatのクリーンアップ が可能ですが、その他の部分がPhoton Voiceの作動に必要です。

他のPhotonパッケージとの互換性を維持するため、また円滑なアップデートを保証するため、PhotonアセットをルートPhotonフォルダ("Assets\Photon")から移動しないよう推奨します。

Photon Voice 2はPUN Classicと互換性がありません。 Photon Voice ClassicはPUN Classicと共に使用しますが、これらのパッケージは今後なくなる予定です。

トップに戻る

クリーンインポート

すでにPUN 2を含むプロジェクトにPhoton Voice 2をインポートする場合、バージョンの不適合によるコンフリクトエラーを防ぐため、事前にPhotonアセットをクリーンアップすることを推奨します:

  • 別のPhotonパッケージ(例:Photon Bolt)を使用していない場合には、"Assets\Photon"フォルダを削除してください。
  • 別のPhotonパッケージをインポート済みの場合には、以下のフォルダを削除してください:
    • "Assets\Photon\PhotonChat"
    • "Assets\Photon\PhotonRealtime"
    • "Assets\Photon\PhotonUnityNetworking"
    • "Assets\Photon\PhotonLibs"

Photon Voice 2のアップデート後、または別のPhotonパッケージをインポート後に何らかの問題が発生し、クリーンインポートをおこないたい場合にも上記の手順に従ってください。

トップに戻る

アップデート

Photon Voice 2の上位にPUN 2をインポートすることは推奨しません。 弊社は常にPUN 2のアップデート後にPhoton Voice 2の新しいバージョンをリリースするため、Photon Voice 2から最新のPUN 2を入手できます。

UnityアセットストアからPhoton Voice 2をアップデートする際に問題が生じた場合には、クリーンインポートをおこなってください。

トップに戻る

主要コンポーネント

VoiceConnection

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

トップに戻る

Recorder

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

トップに戻る

Speaker

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

トップに戻る

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コンポーネントに設定されたカスタムオブジェクト。

トップに戻る

デフォルトのSpeakerFactory

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

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

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

トップに戻る

「聞く相手」を選択する

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

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

トップに戻る

「話す相手」を選択する

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

recorder.InterestGroup = targetGroup;

トップに戻る

ユースケース

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

トップに戻る

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

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

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

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

注:

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

トップに戻る

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

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

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

トップに戻る

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

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

トップに戻る

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;

トップに戻る

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

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

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

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

トップに戻る

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を含めませんでした。

トップに戻る

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;

トップに戻る

PUNなしでPhoton Voiceを使用する方法

簡単な方法

  1. シーンにVoiceConnectionコンポーネントを追加し、「Don't Destroy On Load」を有効にします。
  2. VoiceConnection.SettingsでAppSettingsを設定します。
  3. シーンにRecorderを追加して、プロパティを更新し、VoiceConnection.PrimaryRecorderに割り当てます。
  4. Speakerプレハブ(Speakerコンポーネントを持つプレハブ)を追加して、VoiceConnection.SpeakerPrefabに割り当てます。
  5. ルームに参加します。これにはPhoton Realtimeのマッチメイキング・オペレーションのいずれかを使用します(例として "ConnectAndJoin.cs "ユーティリティ・スクリプトを参照してください)。

トップに戻る

高度なオプション

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

トップに戻る

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をインポートすることで、いつでもファイルを元に戻すことができます。

トップに戻る

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をインポートすることで、いつでもファイルを元に戻すことができます。

ドキュメントのトップへ戻る