Python 声音降噪

录音文件降噪

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(' 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')  # 没有声音自动停止,自动停止

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

你可能感兴趣的:(音频处理,python)