Photon Voice 1 is the original and first major version of Photon Voice. It is now replaced by Photon Voice 2 which is refactored and enhanced. We highly recommend starting new projects with Photon Voice 2 and if possible migrating existing ones from Photon Voice 1 to Photon Voice 2. Photon Voice will be maintained for the coming months. We will fix important bugs and support new Unity versions but new features will be added only to Photon Voice 2.

PUN용 Photon Voice

시작하기

PUN용 Photon Voice는 PUN 에서 음성과 오디오 기능을 수행할 수 있도록 해주는 애드온입니다. PUN 에 따라 독립적인 Photon Realtime 어플리케이션이 필요 합니다.

PUN용 Photon Voice는 PUN 이 이미있고 설정되어 있는 유니티 프로젝트에서 임포트 되어야 합니다.

"Voice room" 은 Photon Voice 클라이언트에 의해서 생성된 룸을 말 합니다. 이 문서에서 종종 사용되는 용어이며 PUN 클라이언트가 참여한 룸과 혼선을 피하기 위해서 이 용어를 사용 합니다. 반면에 "PUN 룸"은 PUN 클라이언트가 참여한 룸을 말합니다.

PUN 클라이언트의 상태가 "Joined" 일 때 ("PUN room" 에 있는), 클라우드에서 Photon Voice 어플리케이션에 접속 또는 접속해제가 가능 합니다. 이 외에는 사용자들이 Photon Voice 어플리케이션에 명시적으로 작용 할 수가 없습니다. Photon Voice 클라이언트는 자동적으로 연결 작업흐름을 처리 합니다. Photon Voice 클라이언트는 참여한 "PUN 룸" 과 동일한 이름으로 "voice 룸"을 생성하거나 참여할 것 입니다.

Back To Top

Configure

프로젝트에 Photon Voice 를 임포트 하면 "Photon Voice 설정" 섹션이 PhotonServerSettings 의 PUN 설정 바로 밑에 나타나야 합니다. 여기에 Photon Voice 어플리케이션의 AppIdRegion을 선택 할 수 있습니다. 다음 단계를 따라서 유니티 인스펙터의 PhotonServerSettings 를 항상 다시 오픈 할 수 있다는 것을 기억 하세요: "Window" -> "Photon Unity Networking" -> "Resources" -> "Highlight Server Settings".

오디오와 음성관련된 고급 설정을 수정하기 위해서는 신 하나의 객체에 PhotonVoiceSettings 스크립트가 붙여져 있어야 합니다. 사용할 수 있는 설정은 아래에 설명 되어 있습니다:

  1. PUN 관련 설정:
    • AutoConnect: PUN 클라이언트가 "PUN 룸" 에 참여했을 때 자동으로 "Voice 룸"에 Photon Voice 클라이언트를 자동으로 참여 하게 함
    • AutoDisconnect: PUN 클라이언트가 접속 해제 되면 자동으로 Photon Voice 클라이언트도 접속 해제 됩니다.
    • AutoTransmit: Photon 클라이언트가 "voice 룸"에 접속하자마자 자동으로 오디오 전송을 시작 합니다.
  2. 마이크와 "로컬" 오디오 녹음 설정은 생성된 모든 "레코더"에 적용 됩니다:
    • SamplingRate: 초당 얼마나 많은 오디오가 측정되는지에 대한 빈도. 일반적으로 필요한 오디오 품질을 정의 합니다. 사용할 수 있는 값: 8, 12, 16, 24 그리고 48 kHz. 디폴트는 24 kHz 입니다.
    • Delay: 전송되는 오디오 스트림 인코드 지연을 1/1000 초로 나타냅니다. (시간에 대한 버퍼 크기). 사용할 수 있는 값은 5, 10, 20, 40, 80 과 120 ms 입니다. 디폴트는 20 ms 입니다.
    • Bitrate: 특정 시간(초)에 대한 처리 되는 데이터의 양 (비트 수)입니다. 일반적으로 이 값은 압축 품질을 정의 합니다. 디폴트 값은 30000 b/s 입니다.
  3. "Remote" 오디오 스트리밍 설정으로 모든 "스피커"인스턴스가 생성될 때 적용 됩니다:
    • PlayDelayMs: 1/1000 초 단위의 플레이백 지연. 수신되는 패킷의 지연 변이를 보정하기 위해서 사용됨.
  4. 음성감지 기능 (생성된 "레코드" 인스턴스 모드에 적용 됩니다):
    • VoiceDetection: 음성 감지 기능 토글.
    • VoiceDetectionThreshold: 음성 감지가 설정 되어있을 경우 전송을 시작 하기 위한 최소한의 시그널 레벨. 0.01 은 디폴트 값으로 권장되는 값 입니다.
  5. 기타:
    • DebugInfo: 정보 레벨 유니티 콘솔의 Photon Voice 디버그 로그기록을 토글 합니다.
    • DebugLostPercent: 손실 프레임 시뮬레이션 비율.

Back To Top

"오디오 소스" 프리팹

PUN용 Photon Voice 는 프리팹에 의하여 "오디오 소스" 객체가 제공된다는 것을 예측 하고 있습니다. 최소 요구되는 프리팹은 두 개의 스크립트 컴포넌트가 동일한 GameObject 에 추가 되어야 합니다:

  • PhotonView
  • PhotonVoiceRecorder

PhotonVoiceRecorder 스크립트를 추가한 후에, AudioClip 컴포넌트와 PhotonVoiceSpeaker 스크립트가 추가된 것을 알 수 있을 것 입니다. 이 두개 컴포넌트는 동일한 룸에 참여한 다른 클라이언트에서 발생되어 수신된 원격 오디오를 재생성 하는데 필수 요소 입니다.

이 프리팹은 런타임시 PUN 을 이용한 룸 참여 이후에 인스터스가 생성되어야만 합니다. 신 객체 인스턴스들은 지원 되지 않습니다. 따라서 신에 PhotonVoiceRecorder 인스턴스들을 가지고 있지 않아야 합니다.

오디오 소스 프리팹은 두 개의 다른 목적으로 사용 됩니다:

  1. "로컬" 사운드를 녹음하고 전송 합니다:
    PhotonVoiceRecorder 가 처리 해 줍니다. 동일한 컴포넌트의 IsTransmitting 을 체크하여 녹음된 오디오의 전송여부를 파악 할 수 있습니다.

  2. 수신된 "원격" 사운드를 재생성하여 플레이 합니다:
    PhotonVoiceSpeaker 가 처리 해 줍니다. IsPlaying 프로퍼티를 체크 하여 원격에서 수신된 오디오가 플레이 되고 있는지 파악 합니다.

이 오디오 소스 프리팹은 두 가지 다른 방식으로 사용 될 수 있습니다:

  1. 음성 채팅:
    PhotonVoiceRecorder 에 오디오 클립이 지정되어 있지 않고 마이크 장치가 감지되면 오디오가 녹음되고 참여한 다른 모든 플레이어에게 전송 될 것 입니다. 여러개의 녹음 장치를 사용하는 경우에 사용되는 장치중의 하나는 PhotonVoiceRecorder.MicrophoneDevice 프로퍼티에 설정되어 있어야 합니다.

  2. 스트리밍 오디오 클립:
    이 옵션은 Photon Voice 전송 테스트를 위해 도입 되었습니다. 하지만 이 옵션은 다른 목적에서 사용 될 수 있습니다. 오디오 클립을 동일한 룸에 참여한 다른 플레이어들에게 브로드 캐스트 하기 위해서는 유니티에서 제공되는 오디오 미디어 파일을 PhotonVoiceRecorder.AudioClip 에 지정해야 할 필요가 있습니다. 이 작업은 Unity 에디터의 인스펙터에서 드래그앤 드롭으로 수행 할 수 있습니다. 매번 오디오 클립을 재 플레이 하고 싶다면 PhotonVoiceRecorder.Looptrue 로 설정했는지 확인 해주세요.

Back To Top

음성 감지

음성 감지는 사전 정의된 시그널 레벨을 초과한 것만이 음성 녹음이 되고 전송되는 선택적인 기능 입니다. 이 뜻은 음성 전송은 말하는 것이 끝났을 때 자동적으로 전송은 잠시 멈추고 다시 말을 시작 할 때 재개 된다는 것입니다. 이렇게 하면 필요없는 잡음이 전송되는 것을 방지하여 대역폭 소비를 감소시키는데 도움을 줄 것 입니다. VoiceDetectionThreshold 의 기본값은 0.01 입니다. 이 값은 음성 감지 보정과 잡음 정도 측정에 대한 실험의 결과로 얻은 일반적인 환경에서 권장되는 값입니다.

Back To Top

음성 캘리브레이션

음성 감지가 켜져 있음에도 불구하고 소리를 녹음할 때 이슈가 여전히 있다면 음성 캘리브레이션이 필요 할 수 도 있습니다. Photon Voice 는 제한된 시간동안에 자동 캘리브레이션 모드를 제공 합니다. 캘리브레이션 모드를 시작하기 위해서는 PhotonVoiceRecorder.VoiceDetectorCalibrate(period) 를 호출 해야 합니다. 디폴트 캘리브레이션 기간은 2000 밀리세컨드이지만 언제라도 변경 할 수 있습니다. 캘리브레이션을 사용함으로써 Photon Voice 는 자동적으로 소리없음과 시끄러움의 기준치를 조정 합니다.

Back To Top

Push-to-Talk

Photon Voice 에서 push-to-talk 기능은 매우 쉽게 구현 할 수 있습니다. 음성 레코딩과 전송을 수동으로 토글 해야 합니다. 마치 마이크를 끄고 켜는 것과 같습니다. push-to-talk 를 시작하기 위해서는 PhotonVoiceRecorder.Transmittrue 로 설정 하면 됩니다. 중지하려면 다시 false 로 되돌리면 됩니다. 사용자 입력으로 프로퍼티를 바인딩 하여 수행 하게 할 수도 있습니다(UI 버튼 또는 키보드 단축키를 통해서).

Back To Top

오디오 그룹

Photon Voice 는 브로드캐스트만 위한 것이 아닙니다. 플레이어들이 동시에 서로에게 방해가 되지 않으면서 다수의 대화를 할 수 있게 해줍니다. Photon 의 "관심 그룹" 기능을 이용한 "오디오 그룹" 을 통해 수행 될 수 있습니다. "Audio Group" 은 숫자로 식별 됩니다(byte). 여러 그룹을 구독 또는 구독 해지 할 수 있습니다. 아무튼 한 번에 하나의 그룹으로 오디오를 전송 할 수 있습니다.

디폴트로 모든 voice 클라이언트들은 그룹 "0" 을 구독 합니다:각 플레이어는 모든 플레이어의 목소리를 듣고 모두에게 이야기 할 수 있습니다. 이 기본 행동을 교체하기를 원한다면 PhotonVoiceNetwork.Client.GlobalAudioGroup 과 같은 이름을 가진 프로퍼티를 이용하여 "Global Audio Group" 을 변경 합니다. 해당 그룹에 등록한 플레이어들만이 전송한 오디오를 들을 수 있을 것 입니다.

다른 한편으로 듣고 싶은 그룹을 하나 이상 선택할 수 있습니다. 그룹 목록을 갱신하기 위해서 다음의 메소드를 사용할 수 있습니다:

PhotonVoiceNetwork.Client.ChangeAudioGroups(byte[] groupsToRemove, byte[] groupsToAdd);

오디오 그룹을 변경할 때 다음 사항들을 고려 해 주어야 합니다:

  • "voice 룸" 에 참여하고 있을 때만 수행 될 수 있습니다.
  • 그룹을 추가하고 싶지 않거나 제거 하고 싶지 않을 경우에는 각각의 파라미터에 null 을 전달 해줍니다.
  • 기존의 모든 그룹을 추가 또는 제거 하려면 빈 배열 (byte[0]) 을 각각의 파라미터에 전달 해줍니다.
  • 디폴트 오디오 그룹 (0)은 구독해지 할 수 없습니다.

오디오 그룹은 Push-to-Talk 와 결합하여 게임에 멋진 효과를 얻을 수 있습니다.

* 유즈케이스 예제 1: 비밀 대화*

몇 단계를 거쳐서 비밀 대화를 추가할 수 있습니다.:

  • n 이 플레이어 수이면 n * (n - 1) 개의 오디오 그룹을 생성하고 플레이어 쌍을 바인드 합니다. 예제:Player1 과 Player 2 는 그룹 "12" 또는 "21"을 구독 할 수 있습니다.
  • 플레이어는 모든 오디오 그룹을 다른 플레이어와 공유 해야 하거나 필요시에 "전화" 기능을 구독 합니다.
  • 플레이어는 GlobalAudioGroup 에 상응하여 공유된 "binary audio group" 번호로 설정하여 한 플레이어와 대화 할 수 있습니다.

유즈케이스 예제 2: 팀 대화

게임에서 팀을 구현 하고 있다면 다음과 같이 "팀 채팅"을 추가 할 수 있습니다:

  • 팀별로 그룹 번호를 지정 합니다.
  • 플레이어는 소속한 팀의 오디오 그룹을 구독 해야 합니다.
  • 동일한 팀의 플레이어들은 GlobalAudioGroup 을 팀의 오디오 그룹 번호로 설정하여 대화 할 수 있습니다.

Back To Top

알려진 이슈들

안드로이드 6.0 권한 승인

일반적으로 안드로이드 플랫폼을 구축 할 때, 대부분의 권한승인은 자동적으로 유니티가 manifest 파일에 추가 해 줄 것 입니다. Photon Voice 에서 필요한 두개의 퍼미션은 다음과 같습니다:

  • android.permission.INTERNET: 유니티의 Player 설정을 통해 자동으로 추가 됨.
  • android.permission.RECORD_AUDIO: 유니티 마이크 API 가 사용될 때 자동으로 추가 됨

안드로이드 Marshmallow 에서는 새롭게 도입된 권한 승인 모델로 문제가 되고 있는 것 같습니다. 생성된 APK 에는 android.permission.RECORD_AUDIO 퍼미션이 누락되어 음성을 녹음 할 수 없을 것 입니다. Android SDK 레벨 23을 타겟팅 할 때 이러한 이슈를 피하려면 최신의 유니티 버전으로 업데이트 해주시기 바랍니다.

To Document Top