AudioClip의 소리 크기 결정


10

GetSpectrumData플레이어가 재생할 레벨 레이아웃을 만들기 위해 노래를 재생하는 AudioSource에서 사용하는 코드가 있습니다. 플레이어가 자신의 노래를 업로드하고이 노래의 데이터로 생성 된 레벨을 재생할 수있는 기능을 추가하고 싶습니다. 불행히도 다른 오디오 파일을 비교할 때 다음과 같은 문제가 발생했습니다.

여기에 이미지 설명을 입력하십시오

보시다시피, 진폭은 클립마다 크게 다르기 때문에 완성하기가 거의 불가능하거나 거의 불가능한 레벨을 만듭니다. 노래에서 데이터를 가져온 후이 "소리 강도"를 결정하는 방법을 찾고 싶습니다 . 또한 노래를 재생하지 않고이 데이터를 추출하는 방법이 있습니까?

답변:


9

이를 수행하는 수동 방법은 AudioClip.GetData 를 사용 하여 샘플 데이터를 배열로 가져 오는 것입니다. 그런 다음 데이터를 반복하고 근 평균 제곱 을 찾아 오디오 클립의 "소리 크기"를 찾으십시오.

그런 다음 최대 값이 1.0f가되도록 전체 배열의 크기를 조정하고 AudioClip.SetData로 오디오 클립에 다시 쓸 수 있습니다. 이를 오디오 표준화 (normalizing audio )라고 하며 샘플의 최대 볼륨을 가장 크게 나타냅니다. 오디오 클립의 볼륨이 매우 낮지 만 피크가 매우 높은 경우에는이를 고려하지 않습니다. 이에 대한 고급 기술이 있습니다 (아래 참고).

Unity는 기본적으로 자동으로 정규화를 수행합니다. 따라서 가져 오기 설정을 터치하지 않은 경우이 작업은 자동으로 수행되므로 걱정할 필요가 없습니다. 오디오가 정규화되었다고 확신하지만 여전히 문제가있는 경우 동적 범위 압축사용하여 오디오압축 해야합니다 (참고 : 데이터 압축과는 매우 다른 것, 파일 크기 또는 메모리 사용과는 무관). 외부 소프트웨어로 귀하의 요구를 충족 시키십시오.


굉장한 대답은이 모든 것을 더 자세히 살펴볼 것입니다. 감사합니다!
정원사

5
최대 값이 항상 최선의 선택은 아닙니다. 매우 짧은 시끄러운 스파이크 (클릭과 같은 소리)는 연속적인 소리만큼 크지 않습니다. 인지되는 소리 크기를 원하면 모든 값을 제곱하고 평균을 내고 제곱근을 취해야합니다. 이 방법을 사용하면 정규화가 수행되므로 Unity가 내장되어 있기를 바랍니다.
Jezzamon

2
음량은 음향 에너지와 관련이 있으며,이를 결정하는 방법은 @Jezzamon이 암시하는 것처럼 RMS (root-mean-square)를 계산하는 것입니다. dsp.stackexchange.com/questions/2951/loudness-of-pcm-stream
Zac Crites
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.