Python实现女声降频(男女声转换)

编程入门 行业动态 更新时间:2024-10-22 16:40:20

Python实现<a href=https://www.elefans.com/category/jswz/34/1139905.html style=女声降频(男女声转换)"/>

Python实现女声降频(男女声转换)

之所以加了括号是因为效果还不是太好

主要使用了滑窗、汉明窗、scipy库的fft/ifft,通过频域整体缩小的方式来降频

代码的解释都在注释中

import numpy as np
from matplotlib import pyplot as plt
from scipy.fftpack import fft, ifft
from scipy.io import wavfilewavFile = "女声降频前.wav"  # 这段音频是从一段完整对话截下来的一句开头的“你好”
Fs, Data = wavfile.read(wavFile)try:Data = Data[:, 0]  # 若为双声道音频则需取其中一个声道
except IndexError:passwin_size = int(Fs * (25 / 1000))  # 以25ms作为窗口大小进行分窗
step_size = win_size // 4  # 设置步长为窗口大小的四分之一win_ham = np.hamming(win_size)  # 汉明窗,用于缓解加窗造成的信号畸变lens = Data.shape[0]  # 音频长度conv_len = 10  # 频率偏移量
temp_data = [0] * win_size  # 存放每窗进行傅里叶变换后处理的音频
ifft_data = [0] * len(Data)  # 存放逆傅里叶变换后的音频,即结果音频i = 0
while i + win_size <= lens:win = Data[i:i + win_size]win = win * win_hamFFT = fft(win)# 通过整段平移频谱的方式来降低音频频率,效果欠佳# FFT[0:int(Win_size / 2) - conv_len] = FFT[conv_len:int(Win_size / 2)]# FFT[int(Win_size / 2) - conv_len:int(Win_size / 2)] = 0# FFT[int(Win_size / 2) + conv_len:] = FFT[int(Win_size / 2):-conv_len]# FFT[int(Win_size / 2):int(Win_size / 2) + conv_len] = 0# 通过整段缩小的方式来降低音频频率,效果相对较好for k in range(win_size // 3):temp_data[k] = FFT[int(k * 3 / 2)]temp_data[win_size // 2:] = temp_data[0:win_size // 2]ifft_data[i:i + win_size] += ifft(temp_data)i = i + step_size# 处理前的频率
plt.figure(figsize=(10, 6), dpi=150)
plt.plot(np.linspace(0, 400 * Fs / len(Data), 400), fft(Data)[0:400], color='b')# 处理后的频率
plt.figure(figsize=(10, 6), dpi=150)
plt.plot(np.linspace(0, 400 * Fs / len(ifft_data), 400), fft(ifft_data)[0:400], color='r')plt.show()# 保存音频
male_audio = np.array(ifft_data).real
wavfile.write('女声降频后.wav', Fs, male_audio.astype(np.int16))

更多推荐

Python实现女声降频(男女声转换)

本文发布于:2024-03-05 14:14:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1712512.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:女声   Python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!