第二个.wav文件播放第一个.wav文件的增强噪声而不是降低噪声

时间:2018-04-17 02:41:50

标签: python audio scipy pyaudio

我正在尝试在python中实现主动降噪。我的项目由两组代码组成:

  1. 录音代码
  2. 声音过滤代码
  3. 我的目标是当您运行程序时,它将通过麦克风开始录制。完成录制后,会有一个名为“file1.wav”的已保存文件。播放该文件时,它是您最初录制的文件。完成后,现在通过调用“fltrd()”将“file1.wav”放入过滤器。这将在同一文件夹中创建第二个wav文件,并且第二个wav文件应该是具有更少/减少噪声的文件。现在我的问题是第二个wav文件正在增强噪声而不是减少它。任何人都可以解决我的代码问题? :(

    以下是我的代码:

    import pyaudio
    import wave
    import matplotlib.pyplot as plt
    import numpy as np
    import scipy.io.wavfile
    import scipy.signal as sp
    
    FORMAT = pyaudio.paInt16
    CHANNELS = 2
    RATE = 44100
    CHUNK = 1024
    RECORD_SECONDS = 5
    WAVE_OUTPUT_FILENAME = "file1.wav"
    
    audio = pyaudio.PyAudio()
    
    # start Recording
    stream = audio.open(format=FORMAT, channels=CHANNELS,
                    rate=RATE, input=True,
                    frames_per_buffer=CHUNK)
    print ("recording...")
    frames = []
    
    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)
    print ("finished recording")
    
    
    # stop Recording
    stream.stop_stream()
    stream.close()
    audio.terminate()
    
    waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    waveFile.setnchannels(CHANNELS)
    waveFile.setsampwidth(audio.get_sample_size(FORMAT))
    waveFile.setframerate(RATE)
    waveFile.writeframes(b''.join(frames))
    waveFile.close()
    
    
    x = scipy.io.wavfile.read('file1.wav')
    n = x[1]
    y = np.zeros(n.shape)
    y = n.cumsum(axis=0)
    
    def fltrd():
        n,x = scipy.io.wavfile.read('file1.wav')
        a2 = x.cumsum(axis=0)
        a3 = np.asarray(a2, dtype = np.int16)
        scipy.io.wavfile.write('file2.wav',n,a3)
    

1 个答案:

答案 0 :(得分:0)

实际的噪音过滤是困难和激烈的。但是,使用pydub库可以轻松创建使用高通和低通滤波器的简单噪声滤波器。见here for more details (install, requirements etc)

另外see here了解有关使用pydub的低通和高通滤波器的更多详细信息。

基本思想是采用音频文件,然后将其传递通过低通和高通滤波器,使得某些线圈上方和下方的音频将被高度衰减(实际上证明了滤波)。 虽然这不会影响通带中的任何噪声,您需要查看其他噪声消除技术。

from pydub import AudioSegment
from pydub.playback import play

song = AudioSegment.from_wav('file1.wav')

#Freq in Hz ,Adjust as per your needs
new = song.low_pass_filter(5000).high_pass_filter(200)
play(new)                

希望这有帮助。