This document is about: VOICE 2
SWITCH TO

레코더 컴포넌트

레코더는 오디오 스트림을 전송하는 컴포넌트입니다. 이 컴포넌트를 사용하여 스트리밍 할 대상 입력 오디오 소스, 스트리밍 방법(오디오 품질), 전송 시작 및 중지 시기(트랜스미션 토글) 및 전송 대상을 선택할 수 있습니다. 또한 리코더는 초기화가 필요합니다.

입력 오디오 소스

레코더는 스트림 하기 위한 다양한 형태의 오디오 입력 피드 형식을 지원합니다. 가장 분명한 것은 음성 채팅에 사용되는 마이크입니다. 그러나 레코더는 두 가지 유형의 입력 소스를 지원합니다.

마이크

Recorder에 의해 전송되는 음성 스트림용 형식으로 입력 소스 마이크를 사용하기 위해서는, 간단하기 Recorder.SourceTypeRecorder.InputSourceType.Microphone 로 설정하면됩니다.

마이크 선택

Photon은 사용할 마이크 API를 선택할 수 있는 두 가지 옵션을 제공합니다. 각 레코드에는 Recorder.MicrophoneType을 사용하여 설정할 수 있는 자체 마이크 입력 기기의 형식을 가질 수 있습니다.

두 개의 값은 다음과 같습니다:

유니티:

기본적으로, 모든 플랫폼에 유니티의 마이크 API를 사용하고 있습니다. 유니티는 문자열 배열의 Microphone.devices를 사용하여 사용 가능한 모든 오디오 입력 장치를 표시합니다. 마이크 장치는 스트링 이름 또는 배열의 인덱스로 식별될 수 있습니다. 기본적으로 배열의 첫 번째 요소가 사용될 것입니다. 명시적으로 다른 기기로 설정하고 싶으시면, Recorder.PhotonMicrophoneDeviceId를 이용하여 설정하세요.

유니티의 마이크 API를 사용하기 위해서는 Recorder.MicrophoneTypeRecorder.MicType.Unity로 단순하게 설정하면 됩니다.

Photon:

유니티는 거의 동일한 코드 기반을 사용하여 여러 플랫폼을 쉽게 타겟팅할 수 있도록 하는 데 유용합니다. 하지만, 어떤 면에서는 유니티의 마이크 API가 제한적이거나 여기저기서 몇 가지 문제가 발생하기도 합니다. 이것이 바로 우리가 오디오 입력 장치와 직접 상호작용하고 유니티의 마이크 API를 우회하는 우리만의 방법을 소개한 이유입니다. 이 작업의 주요 이유 중 하나는 장치의 하드웨어 내장 에코 취소를 활용하기 위한 것입니다. 당사는 Android, iOS, Windows 및 MacOS 등 4대 플랫폼에 네이티브 플러그인을 구현했습니다.

그러나 사용 가능한 마이크 목록을 나열하는 작업은 MacOS 및 Windows에서만 사용할 수 있습니다. Android 및 iOS에서는 시스템에서 사용하는 기본 오디오 입력 장치를 사용합니다. 다음처럼 Recorder.PhotonMicrophoneEnumerator를 사용하는 이용할 수 있는 "Photon microphones" 목록은 다음과 같이 확인할 수 있습니다:

C#

var enumerator = Recorder.PhotonMicrophoneEnumerator;
if (enumerator.IsSupported) 
{
    for (int i = 0; i < enumerator.Count; i++) 
    {
        Debug.LogFormat("PhotonMicrophone Index={0} ID={1} Name={2}", i, enumerator.IDAtIndex(i), 
            enumerator.NameAtIndex(i));
    }
}

Recorder.PhotonMicrophoneDeviceId를 사용하여 마이크를 설정할 수 있습니다.

Photon의 마이크 API를 사용하려면 Recorder.MicrophoneTypeRecorder.MicType.Photon로 설정합니다.

유니티 에디터 고려사항

유니티 에디터와 출력 빌드 사이에서 마이크 API(Unity 또는 Photon)의 선택은 계속되지만 실제 장치의 선택은 그렇지 않습니다. 빌드가 실행될 시스템에서 유니티 에디터에서 사용할 수 있는 마이크 장치 목록이 같을 수 없습니다. 빌드는 다른 시스템과 다른 오디오 입력 장치로 다른 플랫폼에서 실행될 수 있습니다. 따라서 필요한 경우 기본 마이크에서 다른 마이크(사용 가능한 경우)로, 빌드 클라이언트의 런타임에 코드를 통해 명시적으로 전환할 수 있습니다.

마이크 접근: 녹음과 뮤트

설계상 레코더 컴포넌트는 초기화되면 자동으로 기록을 시작합니다.

Photon Voice 버전 2.5 이후 새로운 속성 Recorder.IsRecording 을 도입했습니다. 이 값은 레코더가 초기화되면 런타임(재생 모드)에 설정할 수 있습니다.

따라서 녹화를 중지하고 마이크를 "릴리스" 하려면 Recorder.IsRecordingfalse로 설정할 수 있습니다. 녹화를 재개하려면 다시 true로 설정합니다.

설계상 녹화가 비활성화되면 음성 스트림이 완전히 사라집니다.

마이크를 'locally' ('self-muting') 으로 음소거하는 옵션을 찾는 경우 Recorder.TransmitEnabled 또는 Recorder.IsRecording을 사용할 수 있습니다.

오디오 클립 스트리밍

이 옵션은 Photon Voice 전송을 테스트하기 위해 도입되었습니다. 하지만, 다른 용도로도 사용할 수 있습니다. 같은 룸에 가입한 다른 플레이어로 오디오 클립을 브로드캐스트 하려면 유니티에서 지원하는 오디오 미디어 파일을 Recorder.AudioClip에 할당해야 합니다. Unity Editor에서 Inspector로 드래그 앤. 드롭하면 됩니다. 매번 오디오 클릭을 재생하려면 Recorder.LoopAudioClip값이 true로 설정되거나 유니티 에디터의 레코드의 인스펙터에서 "Loop"로 설정되었는지 확인하십시오.

사용자정의 팩토리

Photon Recorder를 사용하면 유즈 케이스에 상관없이 자신만의 사용자 지정 오디오 소스를 사용할 수 있습니다. 자세한 내용은 "커스텀 오디오 소스를 사용하는 방법?"을 읽어보십시오.

오디오 품질

다음은 코덱 파라미터들의 주요 팩터들입니다:

  • SamplingRate: 초당 오디오를 측정하는 빈도입니다. 일반적으로 원하는 오디오 음질을 정의합니다. 가능한 값은 8, 12, 16, 24 및 48kHz입니다. 기본값은 24kHz입니다.
  • FrameDuration: 밀리초로 출력 오디오 스트림 인코더 지연 시간입니다(시간 단위의 버퍼 크기). 가능한 값은 5, 10, 20, 40, 80 및 120 ms입니다. 기본값은 20 ms 입니다.
  • Bitrate: 데이터의 양(비트의 수)으로 일정 시간(초)에 걸쳐 처리됩니다. 일반적으로, 압축 품질을 정의하게 됩니다. 기본값은 30000 b/s 입니다.

기타 스트림 설정

  • Encrypt: true이면, 모든 출력 보이스 스트림은 암호화됩니다. 기본값은 false 입니다. "암호화"에 대해서는 여기를 읽어보십시오.
  • ReliableMode: true이면, 모든 출력 보이스 스트림은 신뢰모드입니다. 기본값은 false 입니다.

트랜스미션 토글

Recorder.TransmitEnabled를 이용하여 트랜스미션을 토글할 수 있습니다. 불필요한 배경 잡음을 전송하지 않도록 하는 데 사용할 수 있는 VoiceDetection도 있습니다.

푸시투토크(Push-to-Talk)

Photon Voice로 푸시투토크(push-to-talk)를 갖도록 하는 것은 쉽습니다. 수동으로 음성 녹음과 전송을 토글 할 필요가 있습니다. 마이크를 뮤트 하거나 뮤트를 해제하는 것과 같습니다. 푸시투토크를 시작하기 위해서 Recorder.TransmitEnabledtrue로 설정합니다. 중지하려면 다시 false로 설정하면 됩니다. 속성을 사용자 입력(UI 버튼 또는 키보드 단축키)에 바인딩 하여 이 작업을 수행할 수 있습니다.

음성 감지

음성 감지 기능은 녹음된 소리를 필터링하여 신호 레벨의 사전 정의된 임계값을 초과할 때만 전송하는 옵션 기능입니다. 즉, 말을 멈추면 음성 전송이 자동으로 일시 중지되고 대화를 시작하면 다시 시작됩니다. 또한 불필요한 노이즈를 보내는 것을 방지하여 트래픽을 줄이는 데에도 도움이 됩니다.

VoiceDetectionThreshold의 기본값은 0.01입니다.

음성 보정

음성 감지가 켜져 있어도 음성을 녹음할 때 문제가 발생하는 경우 음성 보정이 필요할 수 있습니다. Photon Voice는 시간이 제한되는 자동 보정 모드를 제공합니다. 보정 모드를 시작하려면 Recorder.VoiceDetectorCalibrate(period)를 호출해야 합니다. 기본 교정 기간은 2000 밀리 초이지만 언제든지 변경할 수 있습니다. Photon Voice는 교정을 사용하여 자동으로 침묵 및 음소거 임계값을 조정합니다.

수신자 타겟

오디오 그룹을 이용하여 수행됩니다. 선택적으로 DebugEchoMode를 사용하면 내 스트림을 수신할 수도 있습니다.

관심 그룹

Photon Voice는 브로드캐스트 전용이 아닙니다. 플레이어에 서로 간섭하지 않고 여러 대화를 동시에 진행할 수 있는 기회를 제공할 수 있습니다. 이 작업은 Photon의 "관심 그룹" 기능을 사용하는 "오디오 그룹"을 사용하여 수행할 수 있습니다. "오디오 그룹"은 숫자(byte)로 식별됩니다. 여러 개의 그룹을 구독하거나 구독 해제할 수 있습니다. 그러나 한 번에 하나의 그룹에만 오디오를 전송할 수 있습니다. 기본적으로 모든 보이스 클라이언트는 그룹 "0"에 가입되어 있습니다: 각 플레이어는 다른 플레이어를 듣고 다른 모든 사람과 대화할 수 있습니다.

그러나 청취할 그룹을 여러 개 선택할 수 있습니다. 등록한 그룹 목록을 업데이트하려면 다음 방법을 사용할 수 있습니다:

C#

VoiceConnection.Client.OpChangeGroups(byte[] groupsToRemove, byte[] groupsToAdd);

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

  • "보이스 룸"에 가입해야만 가능합니다.
  • 그룹을 추가하거나 제거하지 않으려면 해당 매개 변수의 null을 전달합니다.
  • 존재하고 있는 모든 그룹에 추가하거나 제가하고 싶은 경우 각 파라미터에 빈 배열(byte[0])을 전달합니다.
  • 기본 오디오 그룹(0)을 구독 해제하지는 못합니다.

오디오 그룹을 푸시투토크와 결합하여 게임에 적합한 기능을 얻을 수 있습니다.

디버그 에코 모드

이 모드를 활성화하면 로컬 레코더가 전송하는 오디오 스트림을 동일한 보이스 클라이언트에서 수신할 수 있습니다. 이 기능은 다음과 같은 사례에 디버깅 용도로 유용합니다:

  • 특히 초기 개발 단계에서 한 명의 액터만 룸에 가입한 상태에서 오디오 품질, 지연 또는 설정을 테스트합니다.
  • 한 명의 마이크 또는 스피커 테스트
  • 자체 에코 또는 실제 브로드캐스트가 필요한 기타 시나리오

디버그 에코 모드는 관심 그룹 0에서만 동작합니다.

기본 레코더

대부분의 경우, 단일 레코더 컴포넌트가 사용되기 때문에, "Primary Recorder"라고 하는 단일 기본 레코더에 대한 단축기를 제공해왔으며, 이 레코더는 VoiceConnection.PrimaryRecorder (또는 PhotonVoiceNetwork.PrimaryRecorder) 를 통해 접근할 수 있습니다. 유니티 에디터 또는 코드를 통해 설정할 수 있습니다.

초기화

작업을 수행하려면 VoiceClient 개체와 선택 사항인 사용자 정의 UserData 개체를 사용하여 레코더를 초기화해야 합니다. 초기화하기 전에 원하는 레코더 설정을 설정해야 합니다. 그렇지 않으면 다시 초기화해야 합니다. 다음은 변경 시 초기화가 필요한 항목 목록입니다:

  • VoiceConnection.InitRecorder(Recorder) (또는 PhotonVoiceNetwork.InitRecorder(Recorder))
  • Recorder.Init(VoiceConnection)

기본값으로, 레코더는 초기화되었을 때 자동으로 시작됩니다. 이 동작을 사용하지 않고 초기화 이후 수동으로 Recorder.StartRecording() 를 이용해서 시작하려면 Recorder.AutoStartfalse로 설정합니다. Recorder.StopRecording()를 이용하여 레코딩을 중지할 수 있습니다.

재시작

녹화를 시작하기 전에 원하는 레코더 설정을 설정해야 하며, 설정하지 않으면 Recorder.RestartRecording()를 이용하여 재시작해야 할 필요가 있습니다.

레코더가 재시작되었는지 파악하기 위해서는, Recorder.RequiresRestart 플래그처럼 'IsDirty' 를 확인할 수 있습니다.

다음은 재시작 시 효과를 적용하기 위한 다음은 변경 시 다시 시작해야 하는 항목 목록입니다:

  • Recorder.UserData
  • Recorder.AudioSourceFactory
  • Recorder.UnityMicrophoneDevice
  • Recorder.PhotonMicrophoneDeviceId
  • Recorder.Source
  • Recorder.MicrophoneType
  • Recorder.TypeConvert
  • Recorder.AudioClip
  • Recorder.SamplingRate
  • Recorder.FrameDuration
  • Recorder.Bitrate

다음은 재시동이 필요하지 않고 변속기가 활성화된 경우 즉시 적용되는 사항 목록입니다:

  • Recorder.TransmitEnabled
  • Recorder.Encrypt
  • Recorder.ReliableMode
  • Recorder.DebugEchoMode
  • Recorder.VoiceDetection
  • Recorder.VoiceDetectionThreshold
  • Recorder.VoiceDetectionDelayMs
  • Recorder.AudioGroup
  • Recorder.LoopAudioClip (조건이 맞는다면)

시스템 변경사항에 대한 대응

시스템 설정에서 입력 또는 출력 오디오 장치를 추가 또는 제거하거나 기본 장치로 전환한 경우 Photon Voice가 제대로 작동하지 않을 수 있습니다. Photon Voice 2.5 이후 새로운 속성 Recorder.ReactOnSystemChanges 를 도입했으며, 사용하도록 설정되면 레코더가 자동으로 다시 초기화되어 이러한 시스템 변경으로부터 복구되도록 합니다. 기본값은 이전 버전과의 호환성을 위해 false입니다. 이 값은 편집 모드 또는 플레이 모드에서 설정할 수 있습니다.

Back to top