def formant(self, val, f0_v): ''' Change formant. val : formant rate f0_v: f0 rate ''' f_rate = self.audio.frame_rate np_arr = np.array(self.audio.get_array_of_samples(), dtype=np.float64) # pydub --> np.array(float64) 変換 # print(np_arr, f_rate) _f0_val, _time = pyworld.dio(np_arr, f_rate) # 基本周波数 spct = pyworld.cheaptrick(np_arr, _f0_val, _time, f_rate) # スペクトル包絡 aper = pyworld.d4c(np_arr, _f0_val, _time, f_rate) # 非周期性指標 spct_b = np.zeros_like(spct) for i in range(spct_b.shape[1]): spct_b[:, i] = spct[:, int(i / val)] ef_audio = pyworld.synthesize(_f0_val * f0_v, spct_b, aper, f_rate) ef_audio = ef_audio.astype(np.int16).tobytes() # print(ef_audio) # print(type(ef_audio)) new_audio = AudioSegment( ef_audio, sample_width=self.audio.sample_width, frame_rate=f_rate, channels=self.audio.channels, ) self.audio = new_audio return self
def low_pass_filter(self, fp, fs, g_pass, g_stop): ''' Butterworth filter (low pass) https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.butter.html https://watlab-blog.com/2019/04/30/scipy-lowpass/ ''' samples = np.array(self.audio.get_array_of_samples()) channels = self.audio.channels frame_rate = self.audio.frame_rate # print(f'samples dim: {samples.ndim} / shape: {samples.shape}\nchannels: {channels}\nfame_rate: {frame_rate}') fn = frame_rate / 2 wp = fp / fn ws = fs / fn N, Wn = signal.buttord(wp, ws, g_pass, g_stop) b, a = signal.butter(N, Wn, 'low') sample_res = np.zeros(samples.shape[0], dtype=np.float64) for i in range(channels): sample_m = samples[i::channels] sample_res[i::channels] = signal.filtfilt( b, a, sample_m) # チャンネルごとにフィルタを適用 # print(samples[1000000:1000010]) # print(sample_res[1000000:1000010]) # print(f'samples dim: {samples.ndim} / shape: {sample_res.shape}\nwidth: {self.audio.sample_width}') res = AudioSegment( sample_res.astype(np.int16).tobytes(), sample_width=self.audio.sample_width, frame_rate=frame_rate, channels=channels, ) return res