audio = net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.6, length_scale=1.2)[0][0,0].data.float().to('cpu')
在vits推理完成后,相应的音频数据会保存到audio这个变量里
当我尝试用下面的wave库保存时,保存的音频有非常大的噪声
import wave
with wave.open('output.wav', 'wb') as wav_file:
# 设置参数
wav_file.setnchannels(1) # 设置为单声道
wav_file.setsampwidth(2) # 设置采样精度为 16 位
wav_file.setframerate(hps.data.sampling_rate) # 设置采样率
# 写入数据
wav_file.writeframes(audio)
而同样的变量换用scipy.io.wavfile 这个库保存时就没有什么问题了
import scipy.io.wavfile as wavfile
# 设置 WAV 文件参数
file_name = "/Users/Music/output——ok.wav"
sample_rate = hps.data.sampling_rate
# 将音频数据写入 WAV 文件
wavfile.write(file_name, sample_rate, audio)
起初我一直以为是我采样率和采样深度之类的参数设置有问题,最后看了一下这两个库的手册才知道,wavfile模块可以自动处理采样精度和音频数据的格式,所以背后是帮你做了数据转换。
vits推理结果audio中的数据格式是[-1.4171e-05, 7.8774e-06, 5.8009e-06, …, -2.4079e-05, -7.9230e-06, -7.0140e-06],以浮点数格式表示的,每个采样点的范围在-1到1之间,而使用wave库保存为WAV文件,需要整数格式,在之前的代码前加上这一句问题就解决了
audio_new = (audio * 32767).astype(np.int16)