Python语音增强代码:单音频文件增强实现
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
#--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()
noisy_slices = slice_signal(FILE_NAME, window_size, 1, sample_rate)
enhanced_speech = []
for noisy_slice in tqdm(noisy_slices, desc='Generate enhanced audio'):
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)
enhanced_speech.append(generated_speech)
enhanced_speech = np.array(enhanced_speech).reshape(1, -1)
file_name = os.path.join(os.path.dirname(FILE_NAME),
'enhanced1_{}.wav'.format(os.path.basename(FILE_NAME).split('.')[0]))
wavfile.write(file_name, sample_rate, enhanced_speech.T)
代码详细分析内容:本代码是单独对一个音频文件进行语音增强的实现。主要流程如下:
1. 解析参数,包括音频文件名和generator模型的epoch名。
2. 加载generator模型,并将其移到GPU上。
3. 对音频文件进行分段处理,每段长度为window_size,然后进行语音增强。
4. 将增强后的音频片段合并,并保存为新的音频文件。
具体实现细节如下:
1. 从参数中解析音频文件名和generator模型的epoch名。
```python
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模型,并将其移到GPU上。
generator = Generator()
generator.load_state_dict(torch.load('epochs/' + EPOCH_NAME, map_location='cpu'))
if torch.cuda.is_available():
generator.cuda()
- 对音频文件进行分段处理,每段长度为window_size,然后进行语音增强。
noisy_slices = slice_signal(FILE_NAME, window_size, 1, sample_rate)
enhanced_speech = []
for noisy_slice in tqdm(noisy_slices, desc='Generate enhanced audio'):
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)
enhanced_speech.append(generated_speech)
- 将增强后的音频片段合并,并保存为新的音频文件。
enhanced_speech = np.array(enhanced_speech).reshape(1, -1)
file_name = os.path.join(os.path.dirname(FILE_NAME),
'enhanced1_{}.wav'.format(os.path.basename(FILE_NAME).split('.')[0]))
wavfile.write(file_name, sample_rate, enhanced_speech.T)
其中,slice_signal函数用于将音频文件分段,并返回每个音频片段的numpy数组。emphasis函数用于对音频信号进行预加重或者去加重处理。Generator类是generator模型的实现。这些函数和类的实现详见其他文件。
原文地址: https://www.cveoy.top/t/topic/nwQT 著作权归作者所有。请勿转载和采集!