def gmf_iaif( psd, glottal_order=3, vt_order=48, ): """ psd : 1-d numpy array, shape : fft_size/2 +1 """ fft_size = (psd.shape[0] - 1) * 2 psd_res = psd for i in range(3): lpc_coef, g = lpc.psd2lpc(psd_res, order=1) re_psd = lpc.lpc2psd(lpc_coef, g, fft_size) psd_res = np.power(np.sqrt(psd_res) / np.sqrt(re_psd), 2) # vt_order vocal tract lpc_coef, g = lpc.psd2lpc(psd_res, order=vt_order) re_psd = lpc.lpc2psd(lpc_coef, g, fft_size) gross_vocal_psd = re_psd glottal_psd = psd / gross_vocal_psd # final glottal_order glottal glottal_lpc, glottal_g = lpc.psd2lpc(glottal_psd, order=glottal_order) re_glottal_psd = lpc.lpc2psd(glottal_lpc, glottal_g, fft_size) vocal_psd = psd / re_glottal_psd # final vocal tract vt_lpc, vt_g = lpc.psd2lpc(vocal_psd, order=vt_order) #re_vt_psd = lpc.lpc2psd(vt_lpc,vt_g,fft_size) return glottal_lpc, glottal_g, vt_lpc, vt_g
def synthesisLPC2PSD(source_object, filter_object, seeds_signals): fft_size = (filter_object["spectrogram"].shape[0] - 1) * 2 print("synthesis lpc 2 psd") excitation_signal, _, _ = synthesisRequiem.get_excitation_signal( source_object['temporal_positions'], filter_object['fs'], source_object['f0'], source_object['vuv'], seeds_signals['pulse'], seeds_signals['noise'], source_object['aperiodicity']) psd = filter_object['spectrogram'] lpcs = [] gains = [] start_time = time.time() for i in range(psd.shape[1]): lpc_coef, g = lpc.psd2lpc(psd[:, i], order=ORDER) lpcs.append(lpc_coef) gains.append(g) print("lpc coef cost {}".format(time.time() - start_time)) recons_psds = [] start_time = time.time() for lpc_coef, g in zip(lpcs, gains): recons_psd = lpc.lpc2psd(lpc_coef, g, fft_size) recons_psds.append(recons_psd) recons_psds = np.array(recons_psds) y0 = synthesisRequiem.get_waveform(excitation_signal, np.transpose(recons_psds, [1, 0]), source_object['temporal_positions'], source_object['f0'], filter_object['fs']) print("filter cost {}".format(time.time() - start_time)) return y0
def synthesisLPC(source_object, filter_object, seeds_signals): fft_size = (filter_object["spectrogram"].shape[0] - 1) * 2 print("synthesis lpc") excitation_signal, _, _ = synthesisRequiem.get_excitation_signal( source_object['temporal_positions'], filter_object['fs'], source_object['f0'], source_object['vuv'], seeds_signals['pulse'], seeds_signals['noise'], source_object['aperiodicity']) psd = filter_object['spectrogram'] lpcs = [] gains = [] start_time = time.time() for i in range(psd.shape[1]): lpc_coef, g = lpc.psd2lpc(psd[:, i], order=ORDER) lpcs.append(lpc_coef) gains.append(g) print("lpc coef cost {}".format(time.time() - start_time)) lpcs = np.array(lpcs) gains = np.array(gains) lpcs[:, 0] = np.log(gains) poledf = pysptk.synthesis.AllPoleDF(ORDER) synthesizer = pysptk.synthesis.Synthesizer( poledf, int(filter_object['fs'] * 0.005)) start_time = time.time() y = synthesizer.synthesis(excitation_signal, lpcs) print("filter cost {}".format(time.time() - start_time)) return y
def synthesisGMF_IAIF(source_object, filter_object, seeds_signals): fft_size = (filter_object["spectrogram"].shape[0] - 1) * 2 print("synthesis gmf-iaif") excitation_signal, _, _ = synthesisRequiem.get_excitation_signal( source_object['temporal_positions'], filter_object['fs'], source_object['f0'], source_object['vuv'], seeds_signals['pulse'], seeds_signals['noise'], source_object['aperiodicity']) psd = filter_object['spectrogram'] glottal_lpcs = [] glottal_gains = [] lpcs = [] gains = [] start_time = time.time() for i in range(psd.shape[1]): lpc_coef, g = lpc.psd2lpc(psd[:, i], order=ORDER) glottal_lpc, glottal_g, lpc_coef, g = gmf_iaif.gmf_iaif(psd[:, i], vt_order=ORDER) glottal_lpcs.append(glottal_lpc) glottal_gains.append(glottal_g) lpcs.append(lpc_coef) gains.append(g) print("gmf-iaif cost :{}, frames: {}".format(time.time() - start_time, psd.shape[1])) recons_psds = [] start_time = time.time() for glottal_lpc, glottal_g, lpc_coef, g in zip(glottal_lpcs, glottal_gains, lpcs, gains): recons_psd = lpc.lpc2psd(glottal_lpc, glottal_g * g, fft_size) #recons_psd *= lpc.lpc2psd(lpc_coef,g,fft_size) recons_psds.append(recons_psd) recons_psds = np.array(recons_psds) y0 = synthesisRequiem.get_waveform(excitation_signal, np.transpose(recons_psds, [1, 0]), source_object['temporal_positions'], source_object['f0'], filter_object['fs']) print("filter cost {}".format(time.time() - start_time)) return y0
def psd2lpc(psd): glottal_lpcs = [] glottal_gains = [] lpcs = [] gains = [] start_time = time.time() for i in range(psd.shape[1]): lpc_coef, g = lpc.psd2lpc(psd[:, i], order=ORDER) glottal_lpc, glottal_g, lpc_coef, g = gmf_iaif.gmf_iaif(psd[:, i], vt_order=ORDER) glottal_lpcs.append(glottal_lpc) glottal_gains.append(glottal_g) lpcs.append(lpc_coef) gains.append(g) print("gmf-iaif cost :{}, frames: {}".format(time.time() - start_time, psd.shape[1])) return np.array(glottal_lpcs), np.array(glottal_gains), np.array( lpcs), np.array(gains)