实时语音降噪Python代码错误分析与解决
根据报错信息,发现在callback函数中出现了TypeError,具体原因需要查看完整的报错信息。同时还有两个UserWarning,分别提示nn.init.xavier_normal和nn.init.normal已经被废弃,应该使用nn.init.xavier_normal_和nn.init.normal_。建议根据提示修改代码,使用新的初始化函数。
错误分析:
- TypeError: 可能是由于
librosa.load函数在处理音频数据时,传入的参数类型不匹配导致。需要检查file参数是否为有效的音频文件路径或文件对象。 - UserWarning: 这是因为
nn.init.xavier_normal和nn.init.normal已经被弃用,建议使用nn.init.xavier_normal_和nn.init.normal_代替。
解决方案:
- 修改
librosa.load函数的参数: 确保file参数为正确的音频文件路径或文件对象,并检查sample_rate参数是否与音频文件匹配。 - 使用新的初始化函数: 将代码中
nn.init.xavier_normal和nn.init.normal替换为nn.init.xavier_normal_和nn.init.normal_。
示例代码:
import argparse
import os
import librosa
import soundfile
import numpy as np
import pyaudio
import torch
import torch.nn as nn
from scipy.io import wavfile
from torch.autograd import Variable
from tqdm import tqdm
from data_preprocess import slice_signal, window_size, sample_rate
from model import Generator
from utils import emphasis
CHUNK_SIZE = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = sample_rate
p = pyaudio.PyAudio()
generator = Generator()
generator.load_state_dict(torch.load('epochs/generator-9(1).pkl', map_location='cpu'))
if torch.cuda.is_available():
generator.cuda()
z = torch.nn.init.normal_(torch.Tensor(1, 1024, 8))
z = Variable(z)
if torch.cuda.is_available():
z = z.cuda()
def callback(in_data, frame_count, time_info, status):
noisy_slice = np.frombuffer(in_data, dtype=np.int16)
noisy_slice = slice_signal(noisy_slice, window_size, 1, sample_rate)[0]
noisy_slice = torch.from_numpy(emphasis(noisy_slice[np.newaxis, np.newaxis, :])).type(torch.FloatTensor)
if torch.cuda.is_available():
noisy_slice = noisy_slice.cuda()
noisy_slice = Variable(noisy_slice)
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)
return (generated_speech.astype(np.int16), pyaudio.paContinue)
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
output=True,
frames_per_buffer=CHUNK_SIZE,
stream_callback=callback)
stream.start_stream()
while stream.is_active():
try:
continue
except KeyboardInterrupt:
break
stream.stop_stream()
stream.close()
p.terminate()
注意:
- 需要根据具体的代码逻辑和报错信息进行相应的调整。
- 确保
librosa库版本与您的代码兼容。 - 使用新的初始化函数可以避免警告,提高代码的稳定性和可维护性。
原文地址: https://www.cveoy.top/t/topic/nZFs 著作权归作者所有。请勿转载和采集!