Change Log
오픈소스 사용 고지문
- Android SDK : 오프소스 라이브러리 사용에 대한 고지문
1.4.1 (2022-12-13)
라이선스가 만료되어 isExpired()가 true를 반환하는 경우 아래와 같이 동작합니다.
다음 표의 bypass는 denoise.process()로 전달되는 파라미터 enableBypass를 의미합니다
| isExpired | bypass | 동작 | 
|---|---|---|
| True | True | bypass (입력 음원 그대로 출력) | 
| True | False | mute (zero filled buffer 출력) | 
1.4.0 (2022-12-07)
노이즈 제거 Neural Network(14MMACs & 31MMACs) 통합.
- enum DenoiseEngine에서- class DHDenoise로 변경되었습니다.
- class DHDenoise에서 빌드 시, 노이즈 제거 모델(14MMACs 또는 31MMACs)을 선택할 수 있습니다.
DHDenoise Init
노이즈 제거 모듈을 초기화 시키는 메소드입니다.
DenoiseEngine.denoise(...)에서 전달 받던 frames를 초기 빌드 시 설정하도록 변경되었습니다.
모델을 선택할 수 있도록 통합을 진행하면서 설정 및 초기화를 하는 방식에 빌더 디자인 패턴(Builder Design Parttern)을 적용하였습니다.
예시
- java
DHDenoise denoise = new DHDenoise.Builder(DHDenoise.NNet.BASE,
                                          DHDenoise.SampleRate.SAMPLE_RATE_16K)
                                .setFrames(160)
                                .build();
denoise.init();
if (denoise.isExpired()) {
   Log.e("DHDenoise", "SDK is expired");
   return;
}
DHDenoise Frame
setFrames 메소드를 통해 처리할 frames 설정합니다. frames의 default 값은 160(10ms @16KHz) 이며, 160의 배수로만 설정 가능합니다.
| Frame Size | 
|---|
| 160 (default) | 
DHDenoise Enum Values
DHDenoise.NNet enum에 정의된 타입(TINY, BASE)을 통해 사용할 Neural Network(노이즈 제거 모델)를 설정 가능합니다.
| Type | Computational Complexity | 
|---|---|
| TINY | 14MMACs | 
| BASE | 31MMACs | 
DHDenoise.SampleRate enum에 정의된 타입(SAMPLE_RATE_16K, SAMPLE_RATE_48K)을 통해 사용할 Sample Rate 설정 가능.
| Type | SampleRate | 
|---|---|
| SAMPLE_RATE_16K | 16000Hz | 
| SAMPLE_RATE_48K | 48000Hz | 
기존 방식
- 이전에는 DenoiseEngine 에서 initialize한 모델의 포인터를 반환받았었습니다.
int sampleRate = 16000;
long modelPtr = DenoiseEngine.initModel(sampleRate);
변경된 방식
- 빌더 디자인 패턴(Builder Design Pattern)이 적용되었습니다.
- DenoiseEngine에서 반환하던 model(neural network) pointer는- DHDenoise내부에서 가지고 있도록 변경되었습니다. 따라서 따로 관리를 할 필요가 없어졌습니다.
- DHDenoise내부에 선언되어있는- Builder를 사용해 initialize에 필요한 값들을 선언합니다.
- DHDenoise.NNet과- DHDenoise.SampleRate는 필수로 설정해야합니다.
- setFrames을 설정하지 않으면 default 값인 160으로 설정되게 됩니다.
- DHDenoise.Builder()로 DHDenoise 객체를 생성한 뒤에- init()을 통해 노이즈 제거의 모델을 initialize 할 수 있습니다.
DHDenoise denoise = new DHDenoise.Builder(DHDenoise.NNet nn, DHDenoise.SampleRate sampleRate).build();
denoise.init();
if (denoise.isExpired()) {
   Log.e("DHDenoise", "SDK is expired");
   return;
}
frame을 따로 설정할 경우의 예시
int frames = 320;
DHDenoise denoise = new DHDenoise.Builder(...).setFrames(frames).build();
denoise.init()
if (denoise.isExpired()) {
   Log.e("DHDenoise", "SDK is expired");
   return;
}
DHDenoise Destory
노이즈 제거 모듈을 통해 노이즈 제거를 종료시키는 메소드입니다.
기존 방식
- 선언된 DenoiseEngine.deleteModel로 현재 사용 중인 모델의 포인터를 전달했었어야 했습니다.
DenoiseEngine.deleteModel(modelPtr);
변경된 방식
- deleteModel()메소드가- destroy()로 변경되었습니다.
- 이제는 DHDenoise 내부에서 모델의 포인터를 가지고 있기 때문에 destroy로 전달할 필요가 없습니다.
- 선언한 DHDenoise에서 간단하게 destroy() 만을 호출해서 해제할 수 있습니다.
DHDenoise denoise = new DHDenoise.Builder(...).setFrames(...).build();
// ...
denoise.destroy();
DHDenoise Process
노이즈 제거 모듈을 통해 노이즈 제거를 실행시키는 메소드입니다.
기존 방식
- 미리 선언해둔 모델의 포인터와 frame size를 노이즈 제거 모듈로 전달했어야 했습니다.
int frames = 160;
boolean enableBypass = false;
boolean enableAGC = false;
float[] input = new float[frames];
float[] output = new float[frames];
DenoiseEngine.denoise(modelPtr, input, output, frames, enableBypass, enableAGC);
변경된 방식
- 노이즈 제거 모듈의 이름이 denoise에서process로 변경되었습니다.
- DHDenoise 내부에서 모델의 포인터를 가지고 있기 때문에 노이즈 제거 모듈에 포인터를 전달할 필요가 없습니다.
- frames 역시 Builder를 통해 설정할 수 있으므로 노이즈 제거 모듈에 전달할 필요가 없어졌습니다.
int frames = 160;
boolean enableBypass = false;
boolean enableAGC = false;
float[] input = new float[frames];
float[] output = new float[frames];
DHDenoise denoise = new DHDenoise.Builder(...).setFrames(frames).build();
// ...
denoise.process(input, output, enableBypass, enableAGC);
DHDenoise isExpired
노이즈 제거 모듈의 인증 만료를 확인할 수 있는 메소드입니다.
기존 방식
- DenoiseEngine.initModel을 통해 모델의 포인터를 받아왔을 때, 모델의 포인터 값이 0일 경우 인증이 만료된 상태였었습니다.
long modelPtr = DenoiseEngine.initModel(sampleRate);
if(modelPtr === 0) { Log.e('Library expired'); return;}
변경된 방식
- DHDenoise에서- isExpired()메소드를 통해 라이선스가 만료되었는지 확인할 수 있습니다.
- denoise.init()이후에- denoise.isExpired()를 호출하여 라이선스가 만료되었는지 확인할 수 있습니다.
DHDenoise denoise = new DHDenoise.Builder(...).build();
denoise.init();
if (denoise.isExpired()) {
	Log.e("DHDenoise", "SDK is expired");
	return;
}
1.3.0 (2022-11-28)
- 라이선스 만료된 상태에서 DenoiseEngine.denoise()호출시 무음(Zero Filled Buffer) 출력.
1.2.0 (2022-09-29)
Feature
- 48kHz 샘플레이트 지원. DenoiseEngine.initModel(int samplerate)를 통해 설정.
long modelPtr = DenoiseEngine.initModel();           // 기존
int samplerate = 48000;
long modelPtr = DenoiseEngine.initModel(samplerate); // 변경된 버전
1.1.0 (2022-09-26)
Feature
- AGC 활성화 옵션 추가. DenoiseEngine.denoise()의 enableAGC 파라미터를 통해 AGC 활성화 가능
- Java
denoise(long modelPtr,
        float[] inputAudio,
        float[] outputAudio,
        int frames,
        boolean enableBypass,
        boolean enableAGC);
1.0.0 (2022-09-23)
Android SE SDK Release.