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

手順: 最初にサウンド ファイルを録音し、次にノイズ ファイルを録音し、
[録音ファイルのノイズ リダクション] を使用してノイズ除去効果を実現します。

おすすめ

転載: blog.csdn.net/qq_38641985/article/details/121403164