mirror of
https://github.com/wassname/TTS.git
synced 2026-09-21 12:40:58 +08:00
33 KiB
33 KiB
In [2]:
import os
import glob
import random
import numpy as np
import torch
import umap
from TTS.speaker_encoder.model import SpeakerEncoder
from TTS.utils.audio import AudioProcessor
from TTS.utils.io import load_config
from bokeh.io import output_notebook, show
from bokeh.plotting import figure
from bokeh.models import HoverTool, ColumnDataSource, BoxZoomTool, ResetTool, OpenURL, TapTool
from bokeh.transform import factor_cmap, factor_mark
from bokeh.palettes import Category10In [4]:
#MODEL_RUN_PATH = "libritts_360-half-October-31-2019_04+54PM-19d2f5f/"
MODEL_RUN_PATH = "libritts_360-half-September-28-2019_10+46AM-8565c50/"
MODEL_PATH = MODEL_RUN_PATH + "best_model.pth.tar"
CONFIG_PATH = MODEL_RUN_PATH + "config.json"
# My single speaker locations
#EMBED_PATH = "/home/neil/main/Projects/TTS3/embeddings/neil14/"
#AUDIO_PATH = "/home/neil/data/Projects/NeilTTS/neil14/wavs/"
# My multi speaker locations
EMBED_PATH = "/home/erogol/Data/Libri-TTS/train-clean-360-embed_128/"
AUDIO_PATH = "datasets/LibriTTS/test-clean/"In [5]:
!ls -1 $MODEL_RUN_PATHbest_model.pth.tar config.json events.out.tfevents.1569660396.erogol-desktop
In [6]:
CONFIG = load_config(CONFIG_PATH)
ap = AudioProcessor(**CONFIG['audio'])> Setting up Audio Processor... | > sample_rate:16000 | > num_mels:40 | > min_level_db:-100 | > frame_shift_ms:12.5 | > frame_length_ms:50 | > ref_level_db:20 | > fft_size:1024 | > power:None | > preemphasis:0.98 | > griffin_lim_iters:None | > signal_norm:True | > symmetric_norm:True | > mel_fmin:0 | > mel_fmax:8000.0 | > spec_gain:20.0 | > stft_pad_mode:reflect | > max_norm:4.0 | > clip_norm:True | > do_trim_silence:False | > trim_db:60 | > do_sound_norm:False | > stats_path:None | > hop_length:200 | > win_length:800
In [7]:
embed_files = glob.glob(EMBED_PATH+"/**/*.npy", recursive=True)
print(f'Embeddings found: {len(embed_files)}')Embeddings found: 0
In [8]:
embed_files[0][0;31m---------------------------------------------------------------------------[0m [0;31mIndexError[0m Traceback (most recent call last) [0;32m<ipython-input-8-f67d64b1abbb>[0m in [0;36m<module>[0;34m[0m [0;32m----> 1[0;31m [0membed_files[0m[0;34m[[0m[0;36m0[0m[0;34m][0m[0;34m[0m[0;34m[0m[0m [0m [0;31mIndexError[0m: list index out of range
In [9]:
speaker_paths = list(set([os.path.dirname(os.path.dirname(embed_file)) for embed_file in embed_files]))
speaker_to_utter = {}
for embed_file in embed_files:
speaker_path = os.path.dirname(os.path.dirname(embed_file))
try:
speaker_to_utter[speaker_path].append(embed_file)
except:
speaker_to_utter[speaker_path]=[embed_file]
print(f'Speaker count: {len(speaker_paths)}')Speaker count: 0
In [11]:
ttsembeds = []
labels = []
locations = []
# single speaker
#num_speakers = 1
#num_utters = 1000
# multi speaker
num_speakers = 10
num_utters = 20
speaker_idxs = np.random.choice(range(len(speaker_paths)), num_speakers, replace=False )
for speaker_num, speaker_idx in enumerate(speaker_idxs):
speaker_path = speaker_paths[speaker_idx]
speakers_utter = speaker_to_utter[speaker_path]
utter_idxs = np.random.randint(0, len(speakers_utter) , num_utters)
for utter_idx in utter_idxs:
embed_path = speaker_to_utter[speaker_path][utter_idx]
embed = np.load(embed_path)
embeds.append(embed)
labels.append(str(speaker_num))
#locations.append(embed_path.replace(EMBED_PATH, '').replace('.npy','.wav'))
embeds = np.concatenate(embeds)[0;31m---------------------------------------------------------------------------[0m [0;31mValueError[0m Traceback (most recent call last) [0;32m<ipython-input-11-aabd2a5031f8>[0m in [0;36m<module>[0;34m[0m [1;32m 12[0m [0;34m[0m[0m [1;32m 13[0m [0;34m[0m[0m [0;32m---> 14[0;31m [0mspeaker_idxs[0m [0;34m=[0m [0mnp[0m[0;34m.[0m[0mrandom[0m[0;34m.[0m[0mchoice[0m[0;34m([0m[0mrange[0m[0;34m([0m[0mlen[0m[0;34m([0m[0mspeaker_paths[0m[0;34m)[0m[0;34m)[0m[0;34m,[0m [0mnum_speakers[0m[0;34m,[0m [0mreplace[0m[0;34m=[0m[0;32mFalse[0m [0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 15[0m [0;34m[0m[0m [1;32m 16[0m [0;32mfor[0m [0mspeaker_num[0m[0;34m,[0m [0mspeaker_idx[0m [0;32min[0m [0menumerate[0m[0;34m([0m[0mspeaker_idxs[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [0;32mmtrand.pyx[0m in [0;36mnumpy.random.mtrand.RandomState.choice[0;34m()[0m [0;31mValueError[0m: 'a' cannot be empty unless no samples are taken
In [12]:
model = umap.UMAP()
projection = model.fit_transform(embeds)[0;31m---------------------------------------------------------------------------[0m [0;31mAttributeError[0m Traceback (most recent call last) [0;32m<ipython-input-12-32709017067f>[0m in [0;36m<module>[0;34m[0m [0;32m----> 1[0;31m [0mmodel[0m [0;34m=[0m [0mumap[0m[0;34m.[0m[0mUMAP[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 2[0m [0mprojection[0m [0;34m=[0m [0mmodel[0m[0;34m.[0m[0mfit_transform[0m[0;34m([0m[0membeds[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0;31mAttributeError[0m: module 'umap' has no attribute 'UMAP'
In [ ]:
source_wav_stems = ColumnDataSource(
data=dict(
x = projection.T[0].tolist(),
y = projection.T[1].tolist(),
desc=locations,
label=labels
)
)
hover = HoverTool(
tooltips=[
("file", "@desc"),
("speaker", "@label"),
]
)
# optionally consider adding these to the tooltips if you want additional detail
# for the coordinates: ("(x,y)", "($x, $y)"),
# for the index of the embedding / wav file: ("index", "$index"),
factors = list(set(labels))
pal_size = max(len(factors), 3)
pal = Category10[pal_size]
p = figure(plot_width=600, plot_height=400, tools=[hover,BoxZoomTool(), ResetTool(), TapTool()])
p.circle('x', 'y', source=source_wav_stems, color=factor_cmap('label', palette=pal, factors=factors),)
url = "http://localhost:8000/@desc"
taptool = p.select(type=TapTool)
taptool.callback = OpenURL(url=url)
show(p)In [ ]:
%cd $AUDIO_PATH
%pwd
!python -m http.server