def analysis_for_valid_batch(self, features, output_features, out_dir, sample_rate=16000, **kwargs): kwargs['sample_rate'] = sample_rate super(LSTMAcousticModel, self).analysis_for_valid_batch(features, output_features, out_dir, **kwargs) # Synthesise outputs using WORLD. synth_dir = os.path.join(out_dir, 'synth') os.makedirs(synth_dir, exist_ok=True) lf0, vuv, mcep, bap = utils.detach_batched_seqs( output_features['lf0'], output_features['vuv'], output_features['mcep'], output_features['bap'], seq_len=features['n_frames']) for _lf0, _vuv, _mcep, _bap, _file_id in zip(lf0, vuv, mcep, bap, features['name']): _vuv = _vuv > 0.5 _f0 = np.exp(_lf0) _f0 = savgol_filter(_f0, 7, 1) wav_path = os.path.join(synth_dir, f'{_file_id}.wav') wav = world_with_reaper_f0.synthesis(_f0, _vuv, _mcep, _bap, sample_rate) file_io.save_wav(wav, wav_path, sample_rate=sample_rate)
def analysis_for_valid_batch(self, features, output_features, out_dir, sample_rate=16000, **kwargs): kwargs['sample_rate'] = sample_rate super(F0Model, self).analysis_for_valid_batch(features, output_features, out_dir, **kwargs) # Synthesise outputs using WORLD. synth_dir = os.path.join(out_dir, 'synth') os.makedirs(synth_dir, exist_ok=True) lf0 = output_features['lf0'].cpu().detach().numpy() vuv = features['vuv'].cpu().detach().numpy() sp = features['sp'].cpu().detach().numpy() ap = features['ap'].cpu().detach().numpy() n_frames = features['n_frames'].cpu().detach().numpy() for i, (n_frame, name) in enumerate(zip(n_frames, features['name'])): f0_i = np.exp(lf0[i, :n_frame, 0]) f0_i = savgol_filter(f0_i, 7, 1) f0_i = f0_i * vuv[i, :n_frame, 0] f0_i = f0_i.astype(np.float64) sp_i = sp[i, :n_frame].astype(np.float64) ap_i = ap[i, :n_frame].astype(np.float64) wav_path = os.path.join(synth_dir, '{}.wav'.format(name)) wav = pyworld.synthesize(f0_i, sp_i, ap_i, sample_rate) file_io.save_wav(wav, wav_path, sample_rate=sample_rate)
def process(wav_dir, id_list, out_dir, calculate_normalisation, normalisation_of_deltas): """Processes wav files in id_list, saves the log-F0 and MVN parameters to files. Args: wav_dir (str): Directory containing the wav files. id_list (str): List of file basenames to process. out_dir (str): Directory to save the output to. calculate_normalisation (bool): Whether to automatically calculate MVN parameters after extracting F0. normalisation_of_deltas (bool): Also calculate the MVN parameters for the delta and delta delta features. """ file_ids = get_file_ids(id_list=id_list) make_dirs(os.path.join(out_dir, 'lf0'), file_ids) make_dirs(os.path.join(out_dir, 'vuv'), file_ids) make_dirs(os.path.join(out_dir, 'mcep'), file_ids) make_dirs(os.path.join(out_dir, 'bap'), file_ids) make_dirs(os.path.join(out_dir, 'wav_synth'), file_ids) for file_id in file_ids: wav_path = os.path.join(wav_dir, f'{file_id}.wav') wav, sample_rate = file_io.load_wav(wav_path) f0, vuv, mcep, bap = analysis(wav, sample_rate) lf0 = np.log(f0) wav_synth = synthesis(f0, vuv, mcep, bap, sample_rate) file_io.save_bin(lf0, os.path.join(out_dir, 'lf0', f'{file_id}.npy')) file_io.save_bin(vuv, os.path.join(out_dir, 'vuv', f'{file_id}.npy')) file_io.save_bin(mcep, os.path.join(out_dir, 'mcep', f'{file_id}.npy')) file_io.save_bin(bap, os.path.join(out_dir, 'bap', f'{file_id}.npy')) file_io.save_wav(wav_synth, os.path.join(out_dir, 'wav_synth', f'{file_id}.wav'), sample_rate) if calculate_normalisation: process_mvn(out_dir, 'lf0', id_list=id_list, deltas=normalisation_of_deltas, out_dir=out_dir) process_mvn(out_dir, 'mcep', id_list=id_list, deltas=normalisation_of_deltas, out_dir=out_dir) process_mvn(out_dir, 'bap', id_list=id_list, deltas=normalisation_of_deltas, out_dir=out_dir)
def save_file(self, data, base_name, data_dir): r"""Saves the feature as a wavfile using scipy.io.wavfile.write Parameters ---------- data : int or float or bool or `np.ndarray`, shape (seq_len, feat_dim) Data loaded from the file specified. base_name : str The name (without extensions) of the file to be loaded. data_dir : str The directory containing all feature types for this dataset. """ file_path = self.file_path(base_name, data_dir) file_io.save_wav(data, file_path, self.sample_rate)
def batch_synth(features, output_features, names, out_dir, sample_rate=16000): synth_dir = os.path.join(out_dir, 'synth') os.makedirs(synth_dir, exist_ok=True) lf0, vuv, sp, ap = utils.detach_batched_seqs(output_features['lf0'], features['vuv'], features['sp'], features['ap'], seq_len=features['n_frames']) for i, name in enumerate(names): f0_i = np.exp(lf0[i]) f0_i = savgol_filter(f0_i, 7, 1) wav_path = os.path.join(synth_dir, '{}.wav'.format(name)) wav = world.synthesis(f0_i, vuv[i], sp[i], ap[i], sample_rate=sample_rate) file_io.save_wav(wav, wav_path, sample_rate=sample_rate)
def batch_synth(lf0, vuv, mcep, bap, seq_len=None, names=None, out_dir=None, sample_rate=16000): if out_dir is not None: if names is None: raise ValueError( 'If `out_dir` is given, then `names` of individual sentences must also be given' ) synth_dir = os.path.join(out_dir, 'synth') make_dirs(synth_dir, names) lf0, vuv, mcep, bap = utils.detach_batched_seqs(lf0, vuv, mcep, bap, seq_len=seq_len) wavs = [] for i, name in enumerate(names): f0_i = np.exp(lf0[i]) f0_i = savgol_filter(f0_i, 7, 1) if len(f0_i) >= 7 else f0_i wav = world.synthesis(f0_i, vuv[i], mcep[i], bap[i], sample_rate=sample_rate) wavs.append(wav) if out_dir is not None: wav_path = os.path.join(synth_dir, f'{names[i]}.wav') file_io.save_wav(wav, wav_path, sample_rate=sample_rate) return wavs