Java jni调用nnom rnn-denoise 降噪

音频降噪算法 java_基于RNN的音频降噪算法 前几天无意间看到一个项目rnnoise。项目地址:https://github.com/xiph/rnnoise基于RNN的音频降噪算法。采用的是 GRU/LSTM模型。阅读下训练代码,可惜的是作者没有提供数据训练集。不过基本可以断定他采用的数据集里,肯定有urbansound8k。urbansound8k数据集地址:https://serv.cusp.nyu.edu/projects/ur... 阅读详情

介绍:https://github.com/majianjia/nnom/blob/master/examples/rnn-denoise/README_CN.md

默认提供了一个wav的例子


#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>

#include "nnom.h"
#include "denoise_weights.h"

#include "mfcc.h"
#include "wav.h"

 // the bandpass filter coefficiences
#include "equalizer_coeff.h" 

#define NUM_FEATURES NUM_FILTER

#define _MAX(x, y) (((x) > (y)) ? (x) : (y))
#define _MIN(x, y) (((x) < (y)) ? (x) : (y))

#define NUM_CHANNELS 	1
#define SAMPLE_RATE 	16000
#define AUDIO_FRAME_LEN 512

// audio buffer for input
float audio_buffer[AUDIO_FRAME_LEN] = {0};
int16_t audio_buffer_16bit[AUDIO_FRAME_LEN] = {0};

// buffer for output
int16_t audio_buffer_filtered[AUDIO_FRAME_LEN/2] = { 0 };


// mfcc features and their derivatives
float mfcc_feature[NUM_FEATURES] = { 0 };
float mfcc_feature_prev[NUM_FEATURES] = { 0 };
float mfcc_feature_diff[NUM_FEATURES] = { 0 };
float mfcc_feature_diff_prev[NUM_FEATURES] = { 0 };
float mfcc_feature_diff1[NUM_FEATURES] = { 0 };
// features for NN
float nn_features[64] = {0};
int8_t nn_features_q7[64] = {0};

// NN results, which is the gains for each frequency band
float band_gains[NUM_FILTER] = {0};
float band_gains_prev[NUM_FILTER] = {0};

// 0db gains coefficient
float coeff_b[NUM_FILTER][NUM_COEFF_PAIR] = FILTER_COEFF_B;
float coeff_a[NUM_FILTER][NUM_COEFF_PAIR] = FILTER_COEFF_A;
// dynamic gains coefficient
float b_[NUM_FILTER][NUM_COEFF_PAIR] = {0};

// update the history
void y_h_update(float *y_h, uint32_t len)
{
	for (uint32_t i = len-1; i >0 ;i--)
		y_h[i] = y_h[i-1];
}

//  equalizer by multiple n order iir band pass filter. 
// y[i] = b[0] * x[i] + b[1] * x[i - 1] + b[2] * x[i - 2] - a[1] * y[i - 1] - a[2] * y[i - 2]...
void equalizer(float* x, float* y, uint32_t signal_len, float *b, float *a, uint32_t num_band, uint32_t num_order)
{
	// the y history for each band
	static float y_h[NUM_FILTER][NUM_COEFF_PAIR] = { 0 };
	static float x_h[NUM_COEFF_PAIR * 2] = { 0 };
	uint32_t num_coeff = num_order * 2 + 1;

	// i <= num_coeff (where historical x is involved in the first few points)
	// combine state and new data to get a continual x input. 
	memcpy(x_h + num_coeff, x, num_coeff * sizeof(float));
	for (uint32_t i = 0; i < num_coeff; i++)
	{
		y[i] = 0;
		for (uint32_t n = 0; n < num_band; n++)
		{
			y_h_update(y_h[n], num_coeff);
			y_h[n][0] = b[n * num_coeff] * x_h[i+ num_coeff];
			for (uint32_t c = 1; c < num_coeff; c++)
				y_h[n][0] += b[n * num_coeff + c] * x_h[num_coeff + i - c] - a[n * num_coeff + c] * y_h[n][c];
			y[i] += y_h[n][0];
		}
	}
	// store the x for the state of next round
	memcpy(x_h, &x[signal_len - num_coeff], num_coeff * sizeof(float));
	
	// i > num_coeff; the rest data not involed the x history
	for (uint32_t i = num_coeff; i < signal_len; i++)
	{
		y[i] = 0;
		for (uint32_t n = 0; n < num_band; n++)
		{
			y_h_update(y_h[n], num_coeff);
			y_h[n][0] = b[n * num_coeff] * x[i];
			for (uint32_t c = 1; c < num_coeff; c++)
				y_h[n][0] += b[n * num_coeff + c] * x[i - c] - a[n * num_coeff + c] * y_h[n][c];
			y[i] += y_h[n][0];
		}	
	}
}

// set dynamic gains. Multiple gains x b_coeff
void set_gains(float *b_in, float *b_out,  float* gains, uint32_t num_band, uint32_t num_order)
{
	uint32_t num_coeff = num_order * 2 + 1;
	for (uint32_t i = 0; i < num_band; i++)
		for (uint32_t c = 0; c < num_coeff; c++)
			b_out[num_coeff *i + c] = b_in[num_coeff * i + c] * gains[i]; // only need to set b. 
}

void quantize_data(float*din, int8_t *dout, uint32_t size, uint32_t int_bit)
{
	float limit = (1 << int_bit); 
	for(uint32_t i=0; i<size; i++)
		dout[i] = (int8_t)(_MAX(_MIN(din[i], limit), -limit) / limit * 127);
}

void log_values(float* value, uint32_t size, FILE* f)
{
	char line[16];
	for (uint32_t i = 0; i < size; i++) {
		snprintf(line, 16, "%f,", value[i]);
		fwrite(line, strlen(line), 1, f);
	}
	fwrite("\n", 2, 1, f);
}

int main(int argc, char* argv[])
{
	wav_header_t wav_header; 
	size_t size;

	char* input_file = "sample.wav";
	char* output_file = "filtered_sample.wav";
	FILE* src_file;
	FILE* des_file;

	char* log_file = "log.csv";
	FILE* flog = fopen(log_file, "wb");

	// if user has specify input and output files. 
	if (argc > 1)
		input_file = argv[1];
	if (argc > 2)
		output_file = argv[2];

	src_file = fopen(input_file, "rb");
	des_file = fopen(output_file, "wb");
	if (src_file == NULL) 
	{
		printf("Cannot open wav files, default input:'%s'\n", input_file);
		printf("Or use command to specify input file: xxx.exe [input.wav] [output.wav]\n");
		return -1;
	}
	if (des_file == NULL)
	{
		fclose(src_file); 
		return -1; 
	}
		
	// read wav file header, copy it to the output file.  
	fread(&wav_header, sizeof(wav_header), 1, src_file);
	fwrite(&wav_header, sizeof(wav_header), 1, des_file);

	// lets jump to the "data" chunk of the WAV file.
	if (strncmp(wav_header.datachunk_id, "data", 4)){
		wav_chunk_t chunk = { .size= wav_header.datachunk_size};
		// find the 'data' chunk
		do {
			char* buf = malloc(chunk.size);
			fread(buf, chunk.size, 1, src_file);
			fwrite(buf, chunk.size, 1, des_file);
			free(buf);
			fread(&chunk, sizeof(wav_chunk_t), 1, src_file);
			fwrite(&chunk, sizeof(wav_chunk_t), 1, des_file);
		} while (strncmp(chunk.id, "data", 4));
	}
	
	// NNoM model
	nnom_model_t *model = model = nnom_model_create();
	
	// 26 features, 0 offset, 26 bands, 512fft, 0 preempha, attached_energy_to_band0
	mfcc_t * mfcc = mfcc_create(NUM_FEATURES, 0, NUM_FEATURES, 512, 0, true);

	printf("\nProcessing file: %s\n", input_file);
	while(1) {
		// move buffer (50%) overlapping, move later 50% to the first 50, then fill 
		memcpy(audio_buffer_16bit, &audio_buffer_16bit[AUDIO_FRAME_LEN/2], AUDIO_FRAME_LEN/2*sizeof(int16_t));

		// now read the new data
		size = fread(&audio_buffer_16bit[AUDIO_FRAME_LEN / 2], AUDIO_FRAME_LEN / 2 * sizeof(int16_t), 1, src_file);
		if(size == 0)
			break;
		
		// get mfcc
		mfcc_compute(mfcc, audio_buffer_16bit, mfcc_feature);
		
//log_values(mfcc_feature, NUM_FEATURES, flog);

		// get the first and second derivative of mfcc
		for(uint32_t i=0; i< NUM_FEATURES; i++)
		{
			mfcc_feature_diff[i] = mfcc_feature[i] - mfcc_feature_prev[i];
			mfcc_feature_diff1[i] = mfcc_feature_diff[i] - mfcc_feature_diff_prev[i];
		}
		memcpy(mfcc_feature_prev, mfcc_feature, NUM_FEATURES * sizeof(float));
		memcpy(mfcc_feature_diff_prev, mfcc_feature_diff, NUM_FEATURES * sizeof(float));
		
		// combine MFCC with derivatives 
		memcpy(nn_features, mfcc_feature, NUM_FEATURES*sizeof(float));
		memcpy(&nn_features[NUM_FEATURES], mfcc_feature_diff, 10*sizeof(float));
		memcpy(&nn_features[NUM_FEATURES+10], mfcc_feature_diff1, 10*sizeof(float));

//log_values(nn_features, NUM_FEATURES+20, flog);
		
		// quantise them using the same scale as training data (in keras), by 2^n. 
		quantize_data(nn_features, nn_features_q7, NUM_FEATURES+20, 3);
		
		// run the mode with the new input
		memcpy(nnom_input_data, nn_features_q7, sizeof(nnom_input_data));
		model_run(model);
		
		// read the result, convert it back to float (q0.7 to float)
		for(int i=0; i< NUM_FEATURES; i++)
			band_gains[i] = (float)(nnom_output_data[i]) / 127.f;

log_values(band_gains, NUM_FILTER, flog);
		
		// one more step, limit the change of gians, to smooth the speech, per RNNoise paper
		for(int i=0; i< NUM_FEATURES; i++)
			band_gains[i] = _MAX(band_gains_prev[i]*0.8f, band_gains[i]); 
		memcpy(band_gains_prev, band_gains, NUM_FEATURES *sizeof(float));
		
		// apply the dynamic gains to each frequency band. 
		set_gains((float*)coeff_b, (float*)b_, band_gains, NUM_FILTER, NUM_ORDER);

		// convert 16bit to float for equalizer
		for (int i = 0; i < AUDIO_FRAME_LEN/2; i++)
			audio_buffer[i] = audio_buffer_16bit[i + AUDIO_FRAME_LEN / 2] / 32768.f;
				
		// finally, we apply the equalizer to this audio frame to denoise
		equalizer(audio_buffer, &audio_buffer[AUDIO_FRAME_LEN / 2], AUDIO_FRAME_LEN/2, (float*)b_,(float*)coeff_a, NUM_FILTER, NUM_ORDER);

		// convert the filtered signal back to int16
		for (int i = 0; i < AUDIO_FRAME_LEN / 2; i++)
			audio_buffer_filtered[i] = audio_buffer[i + AUDIO_FRAME_LEN / 2] * 32768.f *0.6f; 
		
		// write the filtered frame to WAV file. 
		fwrite(audio_buffer_filtered, 256*sizeof(int16_t), 1, des_file);
	}

	// print some model info
	model_io_format(model);
	model_stat(model);
	model_delete(model);

	fclose(flog);
	fclose(src_file);
	fclose(des_file);

	printf("\nNoisy signal '%s' has been de-noised by NNoM.\nThe output is saved to '%s'.\n", input_file, output_file);
	return 0;
}

去掉wav的信息就能解析pcm了

创建cmake 文件 编译dll

cmake_minimum_required(VERSION 3.10)

project(RnnDenoise)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
include_directories(nnom-master/port/)
include_directories(nnom-master/inc/) 
include_directories(nnom-master/examples/rnn-denoise/)
include_directories(D:/java/jdk1.8x64/include/)
include_directories(D:/java/jdk1.8x64/include/win32/)
set(EXPLICIT_SOURCES
   RnnDenoise.c
   nnom-master/examples/rnn-denoise/mfcc.c
)
file(GLOB_RECURSE SRC_FILES "nnom-master/src/*/*.c")
set(SOURCES ${EXPLICIT_SOURCES} ${SRC_FILES})


add_library(RnnDenoise SHARED ${SOURCES})


java 库封装示例

package com.lilin.demoasr.nnom;

public class RnnDenoise implements AutoCloseable{

    private long rnndenoise;

    public long getRnndenoise() {
        return rnndenoise;
    }
    public void setRnndenoise(long rnndenoise) {
        this.rnndenoise = rnndenoise;
    }

    private static final Object globalLock = new Object();

    /**
     *https://github.com/majianjia/nnom/blob/master/examples/rnn-denoise/
     *
     *
     *
     * @throws Exception
     */
    public RnnDenoise() throws Exception {
        synchronized (globalLock) {
            RnnLoad.load("RnnDenoise");
        }
        this.rnndenoise = createRnnDenoise0();
    }

    private static native long createRnnDenoise0();

    private native short[] denoise0(long rnndenoise,short[] var1);

    /**
     * 固定320 每次 可以修改c 改大
     * @param input
     * @return
     */
    public   short[] denoise(short[] input) {
            // synchronized (this) {
                return this.denoise0(this.rnndenoise ,input);
            // }
    }

    private native long destroyRnnDenoise0();

    public void close() {
        synchronized (this) {
            this.destroyRnnDenoise0();
            this.rnndenoise = 0L;
        }
    }

    public boolean isClosed() {
        synchronized (this) {
            return this.rnndenoise == 0L;
        }
    }
}

test:

 public static void main (String[] args) {

        String sList []= new String[]{"G:\\work\\ai\\ZipEnhancer\\r1.pcm","C:\\Users\\\\lilin\\Desktop\\16k.pcm"};
       // String sList []= new String[]{"C:\\Users\\\\lilin\\Desktop\\16k.pcm"};
        List< Thread> lts= new ArrayList<>();

        for (int i = 0; i < sList.length; i++) {
            String file =sList[i];
            int finalI = i;
            lts.add(new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        RnnDenoise rnnDenoise = new RnnDenoise();
                        System.out.println(rnnDenoise.getRnndenoise());
                        FileInputStream f = new FileInputStream(file);
                        FileOutputStream f1 = new FileOutputStream("C:\\Users\\\\lilin\\Desktop\\"+ finalI +".pcm");
                        int n=0;
                        byte[] z = new byte[640];

                        while ((n = f.read(z)) != -1) {


                            short [] sa = new short[320];
                            ByteBuffer.wrap(z).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(sa);


                                short[] denoisedAudio = rnnDenoise.denoise(sa);

                                byte[] z1 = new byte[640];
                                ByteBuffer.wrap(z1).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(denoisedAudio);

                                f1.write(z1);

                        }
                        System.out.println(finalI+"end.");
                        rnnDenoise.close();
                        f1.close();
                    }catch (Exception e){e.printStackTrace();}
                }
            }));
        }


        for (Thread  y:  lts  ) {
            y.start();
        }

        for (Thread  y:  lts  ) {
           try{ y.join();}catch (Exception e){e.printStackTrace();}
        }
        System.out.println("end...");

    }
}

nnom 默认的denoise_weights.h 是单例的无法同时创建多个实例 所以java无法在多线程使用,  可以自己更改下  主要涉及static变量和nnom_tensor_t 需要改用malloc的方式创建。

测试速度挺快的 ,几十分钟的很快降噪完成 ,也可以和freeswitch对接多路实时降噪 在识别,

如果模块或流程觉得麻烦可以到 

https://item.taobao.com/item.htm?id=653611115230

 视频教程yuexiajiayan的个人空间-yuexiajiayan个人主页-哔哩哔哩视频

单通道的神经网络语音降噪模型 一、前言        语音增强,经过近50年的研究发展,涌现出了很多优秀的降噪算法,从最简单的谱减法,到维纳滤波,再到子空间的方法以及基于统计模型的MMSE估计器,传统的数字信号处理的方法让语音降噪在20世纪90年代左右达到了一个高峰。自此以后,对于语音降噪的研究在很长一段时间内处于平缓的发展状态,很多的研究都是基于之前提出的... 阅读详情

相关推荐

RNNoise: Learning Noise Suppression(深度学习噪声抑制)(2)

这篇文章主要介绍如何进行RNNoise的训练和测试1、 网络结构GRU VS LSTM网络顺序2、 数据集3、 更改采样率4、 训练过程(1) step 1 转换为pcm格式(2) step2 提取特征(3) step 3 数据转换(4) step 4 训练神经网络(5)step 5 获取权重数据4、 降噪参考文档 1、 网络结构 RNNoise分为三层嵌入式网络,由全连接层,GR...

dakeboy的博客 1万+

NNOM神经网络语音降噪

NNOM神经网络语音降噪,让你的MCU也“神经”一把!

渣渣小码农的博客 1289

RNNoise原理部分(1)

​ ​论文:https://arxiv.org/pdf/1709.08243.pdf 官方博客链接:https://people.xiph.org/~jm/demo/rnnoise/?__s=sgkgganpatrhthvch4js github:https://github.com/xiph/rnnoise 改进github:https://github.com/GregorR/rnno...

qq249356520的博客 8412

音频降噪算法 java_基于RNN的音频降噪算法 (附完整C代码)

/*Copyright (c) 2017 Mozilla*//*Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:- Redistributions of source ...

weixin_42502838的博客 604

基于循环神经网络的音频降噪算法:WebRTC

WebRTC提供了实时音频和视频通信的能力,并且包含了音频降噪功能,以提供更好的通信质量。循环神经网络(Recurrent Neural Network,简称RNN)是一种强大的神经网络架构,被广泛应用于音频处理任务中,其中包括音频降噪。通过使用基于RNN的音频降噪算法,结合WebRTC库,我们能够在实时音频通信中获得更好的音质和清晰度。接下来,我们加载了一个降噪配置文件,该配置文件包含了降噪算法的参数和设置。函数是用于读取和保存音频文件的示例函数,你可以根据自己的需求进行适当的修改。

syntax_bug719的博客 502

rnnoise.zip_LSTM-GRU_RNN 降噪_lstm代码_rnn音频降噪_音频降噪

改代码为音频降噪功能,是基于RNN的音频降噪算法。其中采用的是 GRU/LSTM 模型,支持wav格式。

Android下音视频对讲演示程序(声学回音消除、噪音抑制、语音活动检测、自动增益控制、自适应抖动缓冲)(2026年01月04日更新)

本软件根据《道德经》为核心思想而设计,实现了两个设备之间进行音视频对讲,一般可用于楼宇对讲、智能门铃对讲、企业员工对讲、智能对讲机、以及类似于微信QQ音视频对讲的其他场景。

赤勇玄心行天道的专栏 1624

编译好的 rnnoise 用于音频噪声消除

编译好的 rnnoise 用于音频噪声消除

Java与机器学习:深入理解循环神经网络(RNNs)

循环神经网络(RNNs)是一种专门用于处理序列数据的神经网络模型。与传统的前馈神经网络不同,RNNs具有循环结构,能够将前一时刻的隐藏状态传递到下一时刻,从而捕捉序列中的时间依赖关系。在本篇文章中,我们深入探讨了循环神经网络(RNNs)的基本概念,并通过实际代码示例展示了如何使用Deeplearning4j实现基本RNN和LSTM。RNNs是深度学习领域中一个重要且广泛应用的模型,掌握这些技术能够显著提升你的项目能力。在接下来的文章中,我们将继续探讨更多的机器学习算法和应用,敬请期待!

阿里渣渣java研发组-群主 3031

28-基于STM32单片机的便携式健康监测系统设计与实现(程序+原理图+元件清单)

本文详细介绍了基于STM32单片机的便携式健康监测系统设计与实现,该系统集成MAX30102光电传感器和MSP20压力传感器,实时监测心率、血氧和血压等关键生理指标。通过STM32F103C8T6主控芯片和HC-05蓝牙模块,实现数据采集、处理及无线传输,具有便携性高、操作简便等特点,适用于家庭健康监护和户外运动场景。

weixin_29191669的博客 420

解决Qt平台插件初始化失败:This application failed to start because no Qt platform plugin could be initialized

本文深入解析了Qt应用程序启动时常见的‘platform plugin’初始化失败报错,指出其核心在于环境变量冲突或多版本Qt共存导致的插件路径混乱。文章提供了从环境变量检查、路径调整到文件补全的完整解决方案,并给出了使用windeployqt工具等预防性开发实践,帮助用户和开发者彻底解决这一经典问题。

weixin_29229261的博客 2166

【免费下载】 RNNoise 项目使用教程

RNNoise 是一个基于循环神经网络(RNN)的音频降噪库。它结合了传统的数字信号处理(DSP)和深度学习技术,旨在提供一个实时、高效且高质量的音频降噪解决方案。RNNoise 的核心算法在处理音频时,能够有效地抑制各种背景噪声,同时保持语音的清晰度。 RNNoise 的主要特点包括: - **实时处理**:能够在实时通信场景中高效运行。 - **低资源消耗**:无需昂贵的GPU,可以在嵌入式...

gitblog_00002的博客 1456

文献阅读笔记:量子微波测量技术综述

量子微波测量技术研究进展:量子微波测量技术利用里德堡原子与微波电场的相干相互作用,突破了传统测量方法的物理限制。该技术基于电磁诱导透明效应和里德堡原子能级跃迁原理,通过激光激发原子并监测光谱变化来测量微波电场强度。相比传统方法,量子微波测量具有超高灵敏度(理论极限可达nV/cm)、宽动态范围(超过100dB)、小型化等显著优势,且测量结果可直接溯源至普朗克常数。典型实验系统包括光源、原子气室和探测器,采用光谱法、干涉法等多种测量方法。近年来,该技术在基础研究和应用方面取得重要进展,展现出在通信、雷达、计量等

Grow into a more wonderful you 987

MCU深度学习新选择:如何用NNoM在微控制器上部署神经网络模型?

NNoM(Neural Network on Microcontroller)是一款专为微控制器设计的超轻量级深度学习推理库,为嵌入式AI和边缘计算框架提供高效解决方案。它通过量化计算、动态内存管理和硬件优化,让ARM Cortex-M等资源受限设备也能运行神经网络模型,是物联网边缘计算的理想选择。 ## 项目定位与价值主张 在当今嵌入式AI技术生态中,NNoM填补了传统深度学习框架与微控制器

gitblog_00830的博客 160

三菱FX5U运动控制(步进)

三菱FX5U脉冲定位控制,原点回归,相对定位,绝对定位,运动控制案例。

weixin_55762091的博客 1万+

一次HTTP完整得请求过程

一次HTTP完整的请求过程 一,大致流程: 根据域名和DNS解析到服务器的IP地址(DNS+CDN) 通过ARP协议获得IP地址对应的物理机器得MAC地址 浏览器对服务器发起三次握手 建立TCP连接后发起HTTP请求报文 服务器响应HTTP请求,将响应报文返回浏览器 短连接情况下,请求结束通过TCP四次挥手关闭连接,长连接在没有访问服务器得若干时间后,进行连接关闭 浏览器得到响应信...

qq_40760617的博客 342

RNNoise训练步骤

RNNoise训练步骤 2.2 RNNoise训练步骤 ​ 步骤1) 〜/ rnnoise / wavutils / bin中/ wav2pcm speech_only.wav speech_only.pcm 〜/ rnnoise / wavutils / bin中/ wav2pcm noise_only.wav noise_only.pcm 〜/ rnnoise / wavutils / bin中/ wav2pcm speech_noise.wav speech_noise.pcm 步骤2)〜/ rnno

weixin_44493758的博客 2666

华为OD机试真题 - 矩阵匹配 牛客网

2024华为OD机试真题,代码包含语言java、js、python、c 代码基本都有详细注释。 题目描述 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式: N M K N*M矩阵 输出描述 N*M 的矩阵中可以选出 M! / N! 种组合数组,每个组合数组种第 K 大的数中的最小值。无需考虑重复数字,直接取字典排序结果即可。

2301_76543445的博客 497

rnnoise 48k采样率 转16k采样率有没有必要?

1、关于rnnoise ,因为语音增强大部分场景都是16k,所以很多人的就会想要16k 的模型,而作者提供的是48k的模型, 那到底有没有必要从新训练成16k 的呢? 优点: a、我们先来分析一下代码结构,从48k 降低到16k,fft 可以从960 降低到320,其他代码基本不会有效率上的减少。 b、可以减少一次上采样到48k以及一次下采样16k。 缺点: a、pitch 滤波提高基...

zeark的博客 4171

【Burp入门第三十一篇】Burp+SwitchyOmega实现本地localhost代理

在部分情况下(如本地靶场),当我们需要在Burp中查看、修改本地流量包的时候,按以下三个配置是不能得到本地流量包的。

等风来 3213

“软开关”硬技术!ZVS和ZCS到底谁更牛?看完这个例子你就懂了!

❌ ZVS 和 ZCS 是万能的?→ 不,它们都有实现条件,谐振参数选不好照样硬拐弯!❌ 只要有谐振就一定ZVS?→ 不,一定要设计合适的死区时间和负载条件才行!ZVS 是让电压先“冷静”,ZCS 是让电流先“退场”。一个是开门不撞墙,一个是关门不甩门。懂了它们,功率设计就是在跳华尔兹而不是打架!💃🔌。

weixin_43199439的博客 1234

rnnoise 降噪特征点分析

rnnoise  总共提取了42个输入特征点: a、针对输⼊入信号bark 22个频带的能量量做dct变换,得到22个BFCC系数。 b、针对22个中的前六个即1.2k 做导数处理,针对 当前及过去三帧处理理为(增加12个特征点): 6个:An+A(n-1)+A(n-2); +6个:An -A(n-2); +6个:An +A(n-2)-2A(n-1)。 c、针对基⾳周期相关性,做dct变换,得...

zeark的博客 3999

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【RNNoise】用深度学习抑制噪声

This demo presents the RNNoise project, showing how deep learning can be applied to noise suppression. The main idea is to combine classic signal processing with deep learning to create a real-time noise suppression algorithm that's small and fast. No expe

FENG_LIN的博客 3万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

rnnoise 训练步骤

git 下载rnnoise 源代码后,按照下面的步骤运行: (1) cd src ; ./compile.sh (2) ./denoise_training signal.raw noise.raw count > training.f32 (3) cd training ; ./bin2hdf5.py ../src/training.f32 50000000 87 training....

zeark的博客 8335

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

科大讯飞 java Web api语音生成和语音识别参考

对此感兴趣的可以加群261074724   文档地址   http://doc.xfyun.cn/rest_api/%E6%8E%A5%E5%8F%A3%E6%A6%82%E8%BF%B0.html     { "code":"10105", "desc":"illegal access|illegal client_ip", "data":"", "sid"

Java_lilin的专栏 1万+
上一篇: rust 桌面 sip 软电话(基于tauri 、pjsip库)
下一篇: baresip+sherpa-onnx在sip客户端实现自定义声源及本地、对方asr及实现中转英翻译
java_lilin
博客等级 码龄14年 364粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值