音频流式处理降噪实现方法及代码修改示例
要实现音频的流式处理降噪,可以按照以下步骤修改代码:
-
引入PyAudio库,用于实现音频流的读取和写入。
-
修改代码中的
slice_signal函数,使其能够读取音频流并返回一个长度为window_size的数据片段。 -
修改代码中的
for循环,改为while循环,每次从音频流中读取一个数据片段,处理后写入输出流中。 -
修改代码中对
enhanced_speech的处理,改为每次处理一个数据片段,将处理后的数据片段写入输出流中。 -
在主函数中添加代码,实现从输入流中读取音频数据,处理后写入输出流中。
下面是修改后的代码示例:
import argparse
import os
import wave
import numpy as np
import torch
import torch.nn as nn
from scipy.io import wavfile
from torch.autograd import Variable
from tqdm import tqdm
import matplotlib.pyplot as plt
import pyaudio
#--file_name ./p232_036.wav --epoch_name ./epochs/discriminator-50.pkl
from data_preprocess import slice_signal, window_size, sample_rate
from model import Generator
from utils import emphasis
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Test Single Audio Enhancement')
parser.add_argument('--file_name', type=str, required=True, help='audio file name')
parser.add_argument('--epoch_name', type=str, required=True, help='generator epoch name')
opt = parser.parse_args()
FILE_NAME = opt.file_name
EPOCH_NAME = opt.epoch_name
generator = Generator()
generator.load_state_dict(torch.load('epochs/' + EPOCH_NAME, map_location='cpu'))
if torch.cuda.is_available():
generator.cuda()
p = pyaudio.PyAudio()
stream_in = p.open(format=pyaudio.paInt16,
channels=1,
rate=sample_rate,
input=True,
frames_per_buffer=window_size)
stream_out = p.open(format=pyaudio.paInt16,
channels=1,
rate=sample_rate,
output=True)
while True:
noisy_slice = np.frombuffer(stream_in.read(window_size), dtype=np.int16)
if len(noisy_slice) < window_size:
break
z = nn.init.normal(torch.Tensor(1, 1024, 8))
noisy_slice = torch.from_numpy(emphasis(noisy_slice[np.newaxis, np.newaxis, :])).type(torch.FloatTensor)
if torch.cuda.is_available():
noisy_slice, z = noisy_slice.cuda(), z.cuda()
noisy_slice, z = Variable(noisy_slice), Variable(z)
generated_speech = generator(noisy_slice, z).data.cpu().numpy()
generated_speech = emphasis(generated_speech, emph_coeff=0.95, pre=False)
generated_speech = generated_speech.reshape(-1)
stream_out.write(generated_speech.astype(np.int16).tobytes())
stream_in.stop_stream()
stream_in.close()
stream_out.stop_stream()
stream_out.close()
p.terminate()
原文地址: https://www.cveoy.top/t/topic/n1Bo 著作权归作者所有。请勿转载和采集!