def pitch_shift_on_lpc_residual( wav, sr, shift_in_cent, frame_length=4096, hop_length=240, mgc_order=59, ): assert wav.dtype == np.int16 frames = (librosa.util.frame(wav, frame_length=frame_length, hop_length=hop_length).astype(np.float64).T) frames *= pysptk.blackman(frame_length) alpha = pysptk.util.mcepalpha(sr) mgc = pysptk.mcep(frames, mgc_order, alpha, eps=1e-5, etype=1) c = pysptk.freqt(mgc, mgc_order, -alpha) lpc = pysptk.levdur(pysptk.c2acr(c, mgc_order, frame_length)) # remove gain lpc[:, 0] = 0 # Compute LPC residual synth = Synthesizer(AllZeroDF(mgc_order), hop_length) wav_lpc = synth.synthesis(wav.astype(np.float64), -lpc) residual = wav - wav_lpc # Pitch-shift on LPC residual residual_shifted = librosa.effects.pitch_shift(residual, sr=sr, n_steps=shift_in_cent, bins_per_octave=1200) # Filtering by LPC synth = Synthesizer(AllPoleDF(mgc_order), hop_length) wav_shifted = synth.synthesis(residual_shifted, lpc) return wav_shifted.astype(np.int16)
def __test(order): __test_synthesis(AllPoleDF(order))
def __test(order): __test_synthesis(AllPoleDF(order)) __test_synthesis_levdur(AllPoleDF(order))
# 音声の切り出しと窓掛け frames = librosa.util.frame(x, frame_length=FRAME_LENGTH, hop_length=HOP_LENGTH).astype(np.float64).T frames *= pysptk.blackman(FRAME_LENGTH) # 窓掛け(ブラックマン窓) # ピッチ抽出 pitch = pysptk.swipe(x, fs=fs, hopsize=HOP_LENGTH, min=MIN_F0, max=MAX_F0, otype="pitch") # 励振源信号(声帯音源)の生成 source_excitation = pysptk.excite(pitch, HOP_LENGTH) # 線形予測分析による線形予測係数の抽出 lpc = pysptk.lpc(frames, ORDER) lpc[:, 0] = np.log(lpc[:, 0]) # 全極フィルタの作成 synthesizer = Synthesizer(AllPoleDF(order=ORDER), HOP_LENGTH) # 励振源信号でフィルタを駆動して音声を合成 y = synthesizer.synthesis(source_excitation, lpc) # 音声の書き込み y = y.astype(np.int16) wavfile.write(OUT_WAVE_FILE, fs, y)