효과음의 평균 db이 서로 달라 별도의 프로그램으로 조절해야하는 불편함이 있어 이 문제를 해결하기 위해 unity editor에서 wav 파일의 db을 손쉽게 조절할 수 있는 tool을 만들어 배포합니다.


📺 미리 보기

 

💬 서론

  • 이 기능은 Github에 업로드 되어있습니다.
  • Unity Editor 2021.3.5f1 및 2022.3.7f1에서 테스트 되었습니다.
 

GitHub - Bonnate/Unity-WAV-Easy-Volume-Editor: Unity Editor extension designed for developers working with WAV files.

Unity Editor extension designed for developers working with WAV files. - GitHub - Bonnate/Unity-WAV-Easy-Volume-Editor: Unity Editor extension designed for developers working with WAV files.

github.com

 

⚒️ 구현

  • 이 Tool은 WAV. 파일을 읽고, 가장 큰 데시벨을 기준으로 지정한 데시벨에 대해 상대적으로 소리의 크기를 조절하여 파일을 작성하는 방법으로 구현하였습니다.
  • 전체 스크립트가 아닌 핵심 일부 부분만 간단히 다루겠습니다.
private float GetMaxDB()
{
    if (mAudioClip == null)
    {
        return 0f;
    }

    float[] samples = new float[mAudioClip.samples * mAudioClip.channels];
    mAudioClip.GetData(samples, 0);

    // Find the highest decibel value
    mMaxDb = -Mathf.Infinity;
    for (int i = 0; i < samples.Length; i++)
    {
        float sample = Mathf.Abs(samples[i]);
        float db = 20.0f * Mathf.Log10(sample);
        if (db > mMaxDb)
        {
            mMaxDb = db;
        }
    }

    return mMaxDb;
}
  • WAV 파일 중 모든 채널에 대하여 가장 큰 데시벨을 리턴하여 저장합니다.
  • 이 값은 다음으로 설정할 데시벨의 상대적으로 데시벨을 올리거나, 내리는것에 대한 계산할 수 있도록 합니다.

 

private (float[], int, int) ProcessAndExport()
{
    int sampleRate = mAudioClip.frequency;
    int channels = mAudioClip.channels; // Get the channel count from the original WAV file

    float[] samples = new float[mAudioClip.samples * channels];
    mAudioClip.GetData(samples, 0);

    // Calculate the multiplier to adjust the decibel value
    float dbDifference = (-mTargetDb) - mMaxDb;
    float multiplier = Mathf.Pow(10.0f, dbDifference / 20.0f);

    // Adjust the decibel value by multiplying the multiplier to all samples
    for (int i = 0; i < samples.Length; i++)
    {
        samples[i] *= multiplier;
    }

    // Export as WAV format
    return (samples, channels, sampleRate);
}
  • mTargetDb(설정할 데시벨)에 대하여 상대적으로 dbDifference를 구하여 설정할 데시벨로 계산한 후 샘플, 채널, 샘플레이트 값을 리턴합니다.

 

private void SaveWav(string path, float[] samples, int channels, int sampleRate)
{
    using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create)))
    {
        // Write the WAV header
        writer.Write(new char[4] { 'R', 'I', 'F', 'F' });
        writer.Write(36 + samples.Length * 2);
        writer.Write(new char[8] { 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ' });
        writer.Write(16);
        writer.Write((ushort)1);
        writer.Write((ushort)channels);
        writer.Write(sampleRate);
        writer.Write(sampleRate * 2 * channels);
        writer.Write((ushort)(2 * channels));
        writer.Write((ushort)16);
        writer.Write(new char[4] { 'd', 'a', 't', 'a' });
        writer.Write(samples.Length * 2);

        // Write WAV data
        foreach (float sample in samples)
        {
            writer.Write((short)(sample * 32767.0f));
        }
    }
}
  • 샘플, 채널, 샘플레이트를 이용하여 실제 파일로 작성하는 코드입니다.
  • 바이너리라이터에서 WAV 포맷에 대한 헤더를 작성한 후 샘플을 작성하여 파일을 생성합니다.

 

✅ 사용 방법

  • 위 Github 페이지에서 다운로드 받을 수 있습니다.
  • 또는 아래 첨부파일에서 unitypackage를 다운로드 받아서 사용할 수 있습니다.

WAV Easy Volume Editor.unitypackage
1.78MB

 

  • Tools/Bonnate/WAV Easy Volume Editor을 선택합니다.

 

  • 창이 열린 상태에서 Project 창에서 WAV. 파일을 선택합니다.

 

  • Target Decibel 입력란에 설정할 데시벨을 입력합니다.
    • 입력된 데시벨이 이 WAV. 파일에서 가장 큰 데시벨로 설정됩니다.
  • 데시벨 입력 란 우측의 파란색 듣기 버튼을 누르면 현재 설정된 데시벨의 소리 크기로 소리르 들어볼 수 있습니다.

 

  • 예시로, 데시벨을 -9로 설정한 후 Process and Replace 버튼을 누르면 현재 선택된 파일이 수정되며 inspector에서 파형의 변화가 나타난것을 볼 수 있습니다.

 

  • _Backup 폴더 안에 수정 전 원본 파일이 저장되어 원본 파일 누락에 대한 위험을 보호할 수 있습니다.

 

🕹️ Unity Affiliate

  • Unity Affiliate Program 파트너로서 아래의 배너를 통해 접속하신 경우 수수료를 받을 수 있습니다.
  • 아래 배너의 에셋들은 '실시간 무료 에셋 랭킹'을 나타냅니다.
bonnate