def get_formant_locations_from_raw_long_frame(v_sig, v_pm, nx, fft_len): ''' nx: frame index ''' #v_sig, fs = la.read_audio_file(wavfile) # Epoch detection: #v_pm_sec, v_voi = la.reaper_epoch_detection(wavfile) #v_pm = lu.round_to_int(v_pm_sec * fs) # Raw-long Frame extraction: v_frm_long = v_sig[v_pm[nx-2]:v_pm[nx+2]+1] # Win: left_len = v_pm[nx] - v_pm[nx-2] right_len = v_pm[nx+2] - v_pm[nx] v_win = la.gen_non_symmetric_win(left_len, right_len, np.hanning, b_norm=False) v_frm_long_win = v_frm_long * v_win # Spectrum: v_mag = np.absolute(np.fft.fft(v_frm_long_win, n=fft_len)) v_mag_db = la.db(la.remove_hermitian_half(v_mag[None,:])[0]) # Formant extraction -LPC method:-------------------------------------------------- v_lpc, v_e, v_refl = lpc(v_frm_long_win, 120) b_use_lpc_roots = False if b_use_lpc_roots: v_lpc_roots = np.roots(v_lpc) v_lpc_angles = np.angle(v_lpc_roots) v_lpc_angles = v_lpc_angles[v_lpc_angles>=0] v_lpc_angles = np.sort(v_lpc_angles) fft_len_half = 1 + fft_len / 2 v_lpc_roots_bins = v_lpc_angles * fft_len_half / np.pi v_lpc_mag = lpc_to_mag(v_lpc, fft_len=fft_len) v_lpc_mag_db = la.db(v_lpc_mag) v_lpc_mag_db = v_lpc_mag_db - np.mean(v_lpc_mag_db) + np.mean(v_mag_db) v_frmnts_bins, v_frmnts_gains_db = get_formant_locations_from_spec_env(v_lpc_mag_db) # Getting bandwidth: fft_len_half = 1 + fft_len / 2 v_vall_bins = get_formant_locations_from_spec_env(-v_lpc_mag_db)[0] v_vall_bins = np.r_[0, v_vall_bins, fft_len_half-1] nfrmnts = v_frmnts_bins.size v_frmnts_bw = np.zeros(nfrmnts) - 1.0 for nx_f in xrange(nfrmnts): #Left slope: curr_frmnt_bin = v_frmnts_bins[nx_f] curr_vall_l_bin = v_vall_bins[nx_f] curr_vall_r_bin = v_vall_bins[nx_f+1] curr_midp_l = int((curr_frmnt_bin + curr_vall_l_bin) / 2.0) curr_midp_r = int((curr_frmnt_bin + curr_vall_r_bin) / 2.0) # Protection: if curr_midp_l==curr_frmnt_bin: curr_midp_l = curr_vall_l_bin if curr_midp_r==curr_frmnt_bin: curr_midp_r = curr_vall_r_bin #print(nx_f) # 27 y 32 #if ((nx==73) and (nx_f==27)): import ipdb; ipdb.set_trace(context=8) # breakpoint c4f78f1e // slope_l = (v_frmnts_gains_db[nx_f] - v_lpc_mag_db[curr_midp_l]) / (curr_frmnt_bin - curr_midp_l).astype(float) slope_r = (v_frmnts_gains_db[nx_f] - v_lpc_mag_db[curr_midp_r]) / (curr_frmnt_bin - curr_midp_r).astype(float) slope_ave = (slope_l - slope_r) / 2.0 v_frmnts_bw[nx_f] = 1.0 / slope_ave # Filtering by bandwidth: bw_thress = 7.0 v_frmnts_bins = v_frmnts_bins[v_frmnts_bw<bw_thress] v_frmnts_gains_db = v_frmnts_gains_db[v_frmnts_bw<bw_thress] v_frmnts_bw = v_frmnts_bw[v_frmnts_bw<bw_thress] # Computing frame short:-------------------------------- # Win: left_len_short = v_pm[nx] - v_pm[nx-1] right_len_short = v_pm[nx+1] - v_pm[nx] v_win_short = la.gen_non_symmetric_win(left_len_short, right_len_short, np.hanning, b_norm=False) v_frm_short = v_sig[v_pm[nx-1]:v_pm[nx+1]+1] v_frm_short_win = v_frm_short * v_win_short shift = v_pm[nx] - v_pm[nx-1] # Formant extraction - True envelope method:---------------------------------------- # Not finished. #v_true_env_db = la.true_envelope(v_mag_db[None,:], in_type='db', ncoeffs=400, thres_db=0.1)[0] if False: plt.figure(); plt.plot(v_mag_db); plt.plot(v_lpc_mag_db); plt.grid(); plt.show() return v_mag_db, v_lpc_mag_db, v_frmnts_bins, v_frmnts_gains_db, v_frmnts_bw, v_frm_short_win, shift
def get_formant_locations_from_raw_long_frame(v_sig, v_pm, nx, fft_len): ''' nx: frame index ''' #v_sig, fs = la.read_audio_file(wavfile) # Epoch detection: #v_pm_sec, v_voi = la.reaper_epoch_detection(wavfile) #v_pm = lu.round_to_int(v_pm_sec * fs) # Raw-long Frame extraction: v_frm_long = v_sig[v_pm[nx-2]:v_pm[nx+2]+1] # Win: left_len = v_pm[nx] - v_pm[nx-2] right_len = v_pm[nx+2] - v_pm[nx] v_win = la.gen_non_symmetric_win(left_len, right_len, np.hanning, b_norm=False) v_frm_long_win = v_frm_long * v_win # Spectrum: v_mag = la.remove_hermitian_half(np.absolute(np.fft.fft(v_frm_long_win, n=fft_len)[None,:]))[0] v_mag_db = la.db(v_mag) # Mel warping: alpha = 0.50 # 0.55 - 0.60 #ncoeffs = 2048 # must be even v_mag_mel = la.sp_mel_warp(v_mag[None,:], fft_len/2, alpha=alpha, in_type=3)[0] v_sp_cmplx = la.build_min_phase_from_mag_spec(v_mag_mel[None,:])[0] v_sp_cmplx_ext = la.add_hermitian_half(v_sp_cmplx[None,:], data_type='complex')[0] v_frm_long_win_mel = np.fft.ifft(v_sp_cmplx_ext).real if False: plt.close('all') pl(la.db(v_mag)) pl(la.db(np.absolute(v_sp_cmplx))) pl(v_frm_long_win_mel) # Formant extraction -LPC method:-------------------------------------------------- n_lpc_coeffs = 30 # 40 v_lpc_mel, v_e, v_refl = lpc(v_frm_long_win_mel, n_lpc_coeffs) v_lpc_mag_mel = lpc_to_mag(v_lpc_mel, fft_len=fft_len) v_lpc_mag_mel_db = la.db(v_lpc_mag_mel) v_lpc_mag_mel_db = v_lpc_mag_mel_db - np.mean(v_lpc_mag_mel_db) + np.mean(la.db(v_mag_mel)) v_frmnts_bins_mel, v_frmnts_gains_db = get_formant_locations_from_spec_env(v_lpc_mag_mel_db) # Getting bandwidth: fft_len_half = 1 + fft_len / 2 v_vall_bins = get_formant_locations_from_spec_env(-v_lpc_mag_mel_db)[0] v_vall_bins = np.r_[0, v_vall_bins, fft_len_half-1] nfrmnts = v_frmnts_bins_mel.size v_frmnts_bw_mel = np.zeros(nfrmnts) - 1.0 for nx_f in xrange(nfrmnts): #Left slope: curr_frmnt_bin = v_frmnts_bins_mel[nx_f] curr_vall_l_bin = v_vall_bins[nx_f] curr_vall_r_bin = v_vall_bins[nx_f+1] curr_midp_l = int((curr_frmnt_bin + curr_vall_l_bin) / 2.0) curr_midp_r = int((curr_frmnt_bin + curr_vall_r_bin) / 2.0) # Protection: if curr_midp_l==curr_frmnt_bin: curr_midp_l = curr_vall_l_bin if curr_midp_r==curr_frmnt_bin: curr_midp_r = curr_vall_r_bin #print(nx_f) # 27 y 32 slope_l = (v_frmnts_gains_db[nx_f] - v_lpc_mag_mel_db[curr_midp_l]) / (curr_frmnt_bin - curr_midp_l).astype(float) slope_r = (v_frmnts_gains_db[nx_f] - v_lpc_mag_mel_db[curr_midp_r]) / (curr_frmnt_bin - curr_midp_r).astype(float) slope_ave = (slope_l - slope_r) / 2.0 v_frmnts_bw_mel[nx_f] = 1.0 / slope_ave # Filtering by bandwidth: # bw_thress = 7.0 # v_frmnts_bins_mel = v_frmnts_bins_mel[v_frmnts_bw_mel<bw_thress] # v_frmnts_gains_db = v_frmnts_gains_db[v_frmnts_bw_mel<bw_thress] # v_frmnts_bw_mel = v_frmnts_bw_mel[v_frmnts_bw_mel<bw_thress] # Computing frame short:-------------------------------- # Win: left_len_short = v_pm[nx] - v_pm[nx-1] right_len_short = v_pm[nx+1] - v_pm[nx] v_win_short = la.gen_non_symmetric_win(left_len_short, right_len_short, np.hanning, b_norm=False) v_frm_short = v_sig[v_pm[nx-1]:v_pm[nx+1]+1] v_frm_short_win = v_frm_short * v_win_short shift = v_pm[nx] - v_pm[nx-1] # Formant extraction - True envelope method:---------------------------------------- # Not finished. #v_true_env_db = la.true_envelope(v_mag_db[None,:], in_type='db', ncoeffs=400, thres_db=0.1)[0] if True: plt.figure(); plt.plot(la.db(v_mag_mel)); plt.plot(v_lpc_mag_mel_db); plt.grid(); plt.show() #pl(v_mag_db) if True: import ipdb; ipdb.set_trace(context=8) # breakpoint 906d26d6 // return v_mag_db, v_lpc_mag_mel_db, v_frmnts_bins_mel, v_frmnts_gains_db, v_frmnts_bw_mel, v_frm_short_win, shift