录音文件降噪

from scipy.io import wavfile
import noisereduce as nr
import pyaudio
import time
import wave
rate, data = wavfile.read("001.wav")
_,noisy_part = wavfile.read("noise.wav")
SAMPLING_FREQUENCY=16000
reduced_noise = nr.reduce_noise(y=data, y_noise=noisy_part, sr=SAMPLING_FREQUENCY)

FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
RECORD_SECONDS = time
WAVE_OUTPUT_FILENAME = "out_file.wav"

with wave.open(WAVE_OUTPUT_FILENAME, 'wb') as wf:
wf.setnchannels(CHANNELS)
wf.setsampwidth(2)
wf.setframerate(RATE)
wf.writeframes(b''.join(reduced_noise))

说明:降噪之后能够听清楚声音,效果很不错

录制音频

import pyaudio
import numpy as np
from scipy import fftpack
import wave

def recording(filename, time=0, threshold=8000):
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
RECORD_SECONDS = time
WAVE_OUTPUT_FILENAME = filename
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
print("* 录音中...")
frames = []
if time > 0:
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
else:
stopflag = 0
stopflag2 = 0
while True:
data = stream.read(CHUNK)
rt_data = np.frombuffer(data, np.dtype('<i2'))
# 傅里叶变换
fft_temp_data = fftpack.fft(rt_data, rt_data.size, overwrite_x=True)
fft_data = np.abs(fft_temp_data)[0:fft_temp_data.size // 2 + 1]
# 判断麦克风是否停止,判断说话是否结束,# 麦克风阈值,默认7000
if sum(fft_data) // len(fft_data) > threshold:
stopflag += 1
else:
stopflag2 += 1
oneSecond = RATE/CHUNK
print (stopflag2," ",oneSecond)
if stopflag2 + stopflag > oneSecond:
if stopflag2 > oneSecond // 3 * 2:
break
else:
stopflag2 = 0
stopflag = 0
frames.append(data)
print("* 录音结束")
stream.stop_stream()
stream.close()
p.terminate()
print (p.get_sample_size(FORMAT))
with wave.open(WAVE_OUTPUT_FILENAME, 'wb') as wf:
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))


#recording('ppp.wav', time=2) # 按照时间来录音,录音5秒
recording('001.wav') # 没有声音自动停止,自动停止
recording('noise.wav') # 没有声音自动停止,自动停止

说明:首先录制声音文件,之后录制噪声文件,
利用【录音文件降噪】来实现去噪效果。