RNNoise降噪训练

Posted 韩搏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RNNoise降噪训练相关的知识,希望对你有一定的参考价值。

1.下载源码点击下载rnnoise代码,或者去github下载
2.编译源码

  • sudo apt-get install autoconf automake libtool
  • ./autogen.sh
  • ./configure
  • make3

3.训练

  • pip依赖
    pip install numpy h5py
    pip install grpcio==1.36.1
    pip install keras==2.2.4 tensorflow==1.12.0  #版本必须对应 tensorflow-gpu==1.12.0
    pip install protobuf==3.8.0  
    
  • cd src ; ./compile.sh
  • ./denoise_training signal.raw noise.raw 10000 > training.f32
  • cd training ; ./bin2hdf5.py …/src/training.f32 10000 87 training.h5
  • ./rnn_train.py
  • ./dump_rnn.py weights.hdf5 …/src/rnn_data.c rnn_data.h orig

4.降噪

  • ./rnnoise_demo noise.raw out.raw

附:

tensorflow: Your CPU supports instructions that this TensorFlow binary was not compiled to use: FMA
遇到了这个问题,意思是你的 CPU 支持AVX2 FMA(加速CPU计算),但安装的 TensorFlow 版本不支持


如果是初学者 或者 没有太大计算速度的需求,在开头加上这两行忽略这个提示即可

	import os
	os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
PS:
	os.environ["TF_CPP_MIN_LOG_LEVEL"] = '1' # 默认,显示所有信息 
	os.environ["TF_CPP_MIN_LOG_LEVEL"] = '2' # 只显示 warning 和 Error 
	os.environ["TF_CPP_MIN_LOG_LEVEL"] = '3' # 只显示 Error	
音频文件合并处理脚本
#coding: utf-8

import os 
import os.path 
import binascii

out_file_name='1.raw'

ignore_filename = [".raw", ".py"]

def ignore_check_file(file):
	for ignore in ignore_filename:
		if file.find(ignore) > 0:
			return True
	return False

#字符串 >> 二进制 >> hex >> hex 字符串
def str_to_hexStr(string):
    str_bin = string #string.encode('utf-8')
    return binascii.hexlify(str_bin).decode('utf-8')
#hex 字符串 >> hex >> 二进制 >> 字符串
def hexStr_to_str(hex_str):
    hex = hex_str.encode('utf-8')
    str_bin = binascii.unhexlify(hex)
    return str_bin.decode('utf-8')
def print_wav_head(head_msg):
	riff = head_msg[0:4]
	len_byte_0 = str_to_hexStr(head_msg[7:8])
	len_byte_1 = str_to_hexStr(head_msg[6:7])
	len_byte_2 = str_to_hexStr(head_msg[5:6])
	len_byte_3 = str_to_hexStr(head_msg[4:5])
	file_len = int(len_byte_0+len_byte_1+len_byte_2+len_byte_3, 16)
	wave = head_msg[8:12]
	fmt = head_msg[12:16]
	filtration = str_to_hexStr(head_msg[16:17])
	FormatTag = str_to_hexStr(head_msg[20:22])
	Channels = str_to_hexStr(head_msg[22:24])
	samp_byte_0 = str_to_hexStr(head_msg[27:28])
	samp_byte_1 = str_to_hexStr(head_msg[26:27])
	samp_byte_2 = str_to_hexStr(head_msg[25:26])
	samp_byte_3 = str_to_hexStr(head_msg[24:25])
	SamplesPerSec = int(samp_byte_0+samp_byte_1+samp_byte_2+samp_byte_3, 16)
	persec_byte_0 = str_to_hexStr(head_msg[31:32])
	persec_byte_1 = str_to_hexStr(head_msg[30:31])
	persec_byte_2 = str_to_hexStr(head_msg[29:30])
	persec_byte_3 = str_to_hexStr(head_msg[28:29])
	BytesPerSec = int(persec_byte_0+persec_byte_1+persec_byte_2+persec_byte_3, 16)
	BlockAlign = str_to_hexStr(head_msg[32:34])
	BitsPerSample = str_to_hexStr(head_msg[34:36])
	data = head_msg[36:40]
	audio_len_byte_0 = str_to_hexStr(head_msg[43:44])
	audio_len_byte_1 = str_to_hexStr(head_msg[42:43])
	audio_len_byte_2 = str_to_hexStr(head_msg[41:42])
	audio_len_byte_3 = str_to_hexStr(head_msg[40:41])
	audioDataLen = int(audio_len_byte_0+audio_len_byte_1+audio_len_byte_2+audio_len_byte_3, 16)

	print "-----WAV Head info-----"
	print "HEAD:",str_to_hexStr(head_msg)
	print "RIFF(4):",riff #ckid:4字节 RIFF 标志,大写
	print "Len(4):",file_len #cksize:4字节文件长度,这个长度不包括"RIFF"标志(4字节)和文件长度本身所占字节(4字节),即该长度等于整个文件长度-8 
	print "WAV(4):",wave #fcc type:4字节 "WAVE" 类型块标识, 大写
	print "FMT(4):",fmt #ckid:4字节 表示"fmt" chunk的开始,此块中包括文件内部格式信息,小写, 最后一个字符是空格
	print "FILT(4):",'0x'+filtration #cksize:4字节,文件内部格式信息数据的大小,过滤字节(一般为00000010H)
	print "FTAG(2):",FormatTag #FormatTag:2字节,音频数据的编码方式,1:表示是PCM 编码  
	print "CHAN(2):",Channels #Channels:2字节,声道数,单声道为1,双声道为2   
	print "SAMP(4):",SamplesPerSec #SamplesPerSec:4字节,采样率,如44100  
	print "PERSEC(4):",BytesPerSec #BytesPerSec:4字节,音频数据传送速率, 单位是字节.其值为采样率×每次采样大小.播放软件利用此值可以估计缓冲区的大小;bytePerSecond = sampleRate * (bitsPerSample / 8) * channels 
	print "ALIGN(2):",BlockAlign  #BlockAlign:2字节,每次采样的大小 = 采样精度*声道数/8(单位是字节); 这也是字节对齐的最小单位, 譬如 16bit 立体声在这里的值是 4 字节.播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整 
	print "PERS(2):",BitsPerSample  #BitsPerSample:2字节,每个声道的采样精度; 譬如 16bit 在这里的值就是16.如果有多个声道,则每个声道的采样精度大小都一样的;
	print "DATA(4):",data  #ckid:4字节,数据标志符(data),表示 "data" chunk的开始.此块中包含音频数据,小写; 
	print "AUDIOLEN(4):",audioDataLen  #cksize:音频数据的长度,4字节,audioDataLen = totalDataLen - 36 = fileLenIncludeHeader - 44  
	print "-----------------------"
	
def read_pcm_file():
	file_count = 0
	wf = open(out_file_name, 'wb')
	for root, dirs, files in os.walk("."):
		#root:当前目录路径 dirs:当前路径下所有子目录 files:当前路径下所有非目录子文件
		for file in files:
			src_file = root + '\\\\' + file
			if ignore_check_file(file) == False:
				file_count += 1
				print "Process File Name:",src_file
				rf = open(src_file, 'rb')
				if file.find('.wav') > 0:
					wav_head = rf.read(44)
					print_wav_head(wav_head)
				raw_data = rf.read()
				pcm_idx = raw_data.rfind('data')
				if pcm_idx > 0:
					print "Read File Len:", len(raw_data), "PCM idx:", pcm_idx
					wf.write(raw_data[pcm_idx+4+2:])
				rf.close()
	wf.close()			
	print "Process File Count:", file_count
							
if __name__=='__main__':
	read_pcm_file()

以上是关于RNNoise降噪训练的主要内容,如果未能解决你的问题,请参考以下文章

RNNoise降噪训练

语音降噪/增强

来源自rnnoise,但非rnn

Python图片验证码降噪 — 8邻域降噪

OpenCV 实战:3 步实现图像降噪

思考关于瞬变电磁信号降噪