package com.orctom.rnnoise;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Closeable;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicBoolean;
public class Denoiser implements Closeable {
private static final Logger LOGGER = LoggerFactory.getLogger(Denoiser.class);
private static final int FRAME_SIZE = 960;
private Pointer state;
private AtomicBoolean stopped = new AtomicBoolean(false);
public Denoiser() {
LOGGER.debug("Denoiser started");
state = Rnnoise.INSTANCE.rnnoise_create();
}
public void close() {
LOGGER.debug("Denoiser closed");
if (stopped.getAndSet(true)) {
return;
}
Rnnoise.INSTANCE.rnnoise_destroy(state);
state = null;
}
public byte[] process(byte[] pcm) {
int len = pcm.length;
if (len < FRAME_SIZE) {
return pcm;
}
byte[] denoised = new byte[len];
int startIndex = 0;
int endIndex = FRAME_SIZE;
while (startIndex < len) {
if (endIndex > len) {
endIndex = len;
}
LOGGER.trace("start: {}, end: {}", startIndex, endIndex);
byte[] frame = Arrays.copyOfRange(pcm, startIndex, endIndex);
byte[] processed = processFrame(frame);
System.arraycopy(processed, 0, denoised, startIndex, processed.length);
startIndex += FRAME_SIZE;
endIndex += FRAME_SIZE;
}
return denoised;
}
private byte[] processFrame(byte[] frame) {
if (frame.length != FRAME_SIZE) {
return frame;
}
float[] pcmIn = Bytes.toFloatArray(frame);
float[] pcmOut = new float[pcmIn.length];
Rnnoise.INSTANCE.rnnoise_process_frame(state, pcmOut, pcmIn);
return Bytes.toByteArray(pcmOut);
}
public interface Rnnoise extends Library {
Rnnoise INSTANCE = (Rnnoise) Native.loadLibrary("rnnoise", Rnnoise.class);
Pointer rnnoise_create();
int rnnoise_get_size();
int rnnoise_init(Pointer state);
void rnnoise_process_frame(Pointer state, float[] out, float[] in);
void rnnoise_destroy(Pointer stata);
}
}
rnnoise-java-master.zip_RNN_cookiesp6x_rnnoise-java_rnnoise-java
版权申诉
2 浏览量
2022-09-23
03:58:35
上传
评论
收藏 677KB ZIP 举报
御道御小黑
- 粉丝: 61
- 资源: 1万+
最新资源
- keil2 + proteus + 8051.exe
- 1961ee27df03bd4595d28e24b00dde4e_744c805f7e4fb4d40fa3f695bfbab035_8(1).c
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- windows注册表编辑工具
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- 校园通行码预约管理系统20240522075502
- 车类型数据集6250张VOC+YOLO格式.zip
- The PyTorch implementation of STGCN.STGCN-main.zip
- 092300108.cpp
- 车类型数据集6000张VOC+YOLO格式.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈