要实现音频的流式处理降噪,可以按照以下步骤修改代码:

  1. 引入PyAudio库,用于实现音频流的读取和写入。

  2. 修改代码中的slice_signal函数,使其能够读取音频流并返回一个长度为window_size的数据片段。

  3. 修改代码中的for循环,改为while循环,每次从音频流中读取一个数据片段,处理后写入输出流中。

  4. 修改代码中对enhanced_speech的处理,改为每次处理一个数据片段,将处理后的数据片段写入输出流中。

  5. 在主函数中添加代码,实现从输入流中读取音频数据,处理后写入输出流中。

下面是修改后的代码示例:

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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录