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