diff --git a/app.py b/app.py index 4c8e93495f61e9d51897940fcfafb88fa616e307..0d9ace1655b0c32b3dae6f39d4c048f8bdea9497 100644 --- a/app.py +++ b/app.py @@ -3,70 +3,63 @@ from fastapi.responses import JSONResponse from fastapi.middleware.cors import CORSMiddleware from logic import synthesize_voice, plot_data, plot_waveforms import base64 -import sys -import numpy as np -from io import BytesIO -from hifigan.inference_e2e import hifi_gan_inference +from typing import Dict app = FastAPI() -@app.get("/") -def read_root(): - data = {"Voice": "Cloning", "Status": "Success"} - return JSONResponse(content=data) +# You need to replace the placeholders above with the actual URLs for the models. + +# Allow requests from your Vercel domain +origins = [ + "https://host-test-smoky.vercel.app", + # Add other allowed origins if needed +] + +# Set up CORS middleware app.add_middleware( CORSMiddleware, - allow_origins=["*"], + allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) -hugging_face_api_url = "https://huggingface.co/spaces/lord-reso/host/synthesize" +@app.post("/synthesize", response_model=Dict[str, str]) +async def synthesize(request_data: Dict[str, str]): + font_type = request_data['font_select'] + input_text = request_data['input_text'] -@app.post("/synthesize") -async def synthesize(request: Request): - print("call successful") - - json = await request.json() - print(json) - - font_type = json['font_select'] - input_text = json['input_text'] + # Font selection logic (customize based on your requirements) + if font_type == 'Preeti': + # Implement Preeti font logic + pass + elif font_type == 'Unicode': + # Implement Unicode font logic + pass - print("generating mel-spectrogram") # Generate mel-spectrogram using Tacotron2 - # mel_output_data, mel_output_postnet_data, alignments_data = synthesize_voice(input_text, "Shruti_finetuned.pt") - mel_output_data, mel_output_postnet_data, alignments_data = synthesize_voice(input_text, "kaggle_12000.pt") - print("mel generation successful") - + mel_output_data, mel_output_postnet_data, alignments_data = synthesize_voice(input_text, "Shruti_finetuned") + # Convert mel-spectrogram to base64 for display in HTML mel_output_base64 = plot_data([mel_output_data, mel_output_postnet_data, alignments_data]) - # Audio Synthesis begins - print("Starting audio synthesis") - buffer = BytesIO() - np.save(buffer, mel_output_data) - input_mel = buffer.getvalue() - - hifigan_checkpoint = "generator_v1" - - # Generate audio using Hifigan - audio_data = hifi_gan_inference(input_mel, hifigan_checkpoint) + # Save the generated audio file + audio_file_path = 'audio_output/mel1_generated_e2e.wav' - print("Creating time-domain waveform") # Plot the waveform - wave_base64 = plot_waveforms(audio_data) + wave_base64 = plot_waveforms(audio_file_path) # Encode audio content as Base64 - audio_base64 = base64.b64encode(audio_data).decode('utf-8') + with open(audio_file_path, 'rb') as audio_file: + audio_base64 = base64.b64encode(audio_file.read()).decode('utf-8') # Customize the response based on the information you want to send to the frontend response_data = { 'mel_spectrogram': mel_output_base64, 'audio_data': audio_base64, 'waveform': wave_base64, + 'some_other_data': 'example_value', } - return JSONResponse(content=response_data) \ No newline at end of file + return JSONResponse(content=response_data) diff --git a/distributed.py b/distributed.py new file mode 100644 index 0000000000000000000000000000000000000000..cce74944bfec6a69ac50921ec82a74d4874d6070 --- /dev/null +++ b/distributed.py @@ -0,0 +1,173 @@ +import torch +import torch.distributed as dist +from torch.nn.modules import Module +from torch.autograd import Variable + +def _flatten_dense_tensors(tensors): + """Flatten dense tensors into a contiguous 1D buffer. Assume tensors are of + same dense type. + Since inputs are dense, the resulting tensor will be a concatenated 1D + buffer. Element-wise operation on this buffer will be equivalent to + operating individually. + Arguments: + tensors (Iterable[Tensor]): dense tensors to flatten. + Returns: + A contiguous 1D buffer containing input tensors. + """ + if len(tensors) == 1: + return tensors[0].contiguous().view(-1) + flat = torch.cat([t.contiguous().view(-1) for t in tensors], dim=0) + return flat + +def _unflatten_dense_tensors(flat, tensors): + """View a flat buffer using the sizes of tensors. Assume that tensors are of + same dense type, and that flat is given by _flatten_dense_tensors. + Arguments: + flat (Tensor): flattened dense tensors to unflatten. + tensors (Iterable[Tensor]): dense tensors whose sizes will be used to + unflatten flat. + Returns: + Unflattened dense tensors with sizes same as tensors and values from + flat. + """ + outputs = [] + offset = 0 + for tensor in tensors: + numel = tensor.numel() + outputs.append(flat.narrow(0, offset, numel).view_as(tensor)) + offset += numel + return tuple(outputs) + + +''' +This version of DistributedDataParallel is designed to be used in conjunction with the multiproc.py +launcher included with this example. It assumes that your run is using multiprocess with 1 +GPU/process, that the model is on the correct device, and that torch.set_device has been +used to set the device. + +Parameters are broadcasted to the other processes on initialization of DistributedDataParallel, +and will be allreduced at the finish of the backward pass. +''' +class DistributedDataParallel(Module): + + def __init__(self, module): + super(DistributedDataParallel, self).__init__() + #fallback for PyTorch 0.3 + if not hasattr(dist, '_backend'): + self.warn_on_half = True + else: + self.warn_on_half = True if dist._backend == dist.dist_backend.GLOO else False + + self.module = module + + for p in self.module.state_dict().values(): + if not torch.is_tensor(p): + continue + dist.broadcast(p, 0) + + def allreduce_params(): + if(self.needs_reduction): + self.needs_reduction = False + buckets = {} + for param in self.module.parameters(): + if param.requires_grad and param.grad is not None: + tp = type(param.data) + if tp not in buckets: + buckets[tp] = [] + buckets[tp].append(param) + if self.warn_on_half: + if torch.cuda.HalfTensor in buckets: + print("WARNING: gloo dist backend for half parameters may be extremely slow." + + " It is recommended to use the NCCL backend in this case. This currently requires" + + "PyTorch built from top of tree master.") + self.warn_on_half = False + + for tp in buckets: + bucket = buckets[tp] + grads = [param.grad.data for param in bucket] + coalesced = _flatten_dense_tensors(grads) + dist.all_reduce(coalesced) + coalesced /= dist.get_world_size() + for buf, synced in zip(grads, _unflatten_dense_tensors(coalesced, grads)): + buf.copy_(synced) + + for param in list(self.module.parameters()): + def allreduce_hook(*unused): + param._execution_engine.queue_callback(allreduce_params) + if param.requires_grad: + param.register_hook(allreduce_hook) + + def forward(self, *inputs, **kwargs): + self.needs_reduction = True + return self.module(*inputs, **kwargs) + + ''' + def _sync_buffers(self): + buffers = list(self.module._all_buffers()) + if len(buffers) > 0: + # cross-node buffer sync + flat_buffers = _flatten_dense_tensors(buffers) + dist.broadcast(flat_buffers, 0) + for buf, synced in zip(buffers, _unflatten_dense_tensors(flat_buffers, buffers)): + buf.copy_(synced) + def train(self, mode=True): + # Clear NCCL communicator and CUDA event cache of the default group ID, + # These cache will be recreated at the later call. This is currently a + # work-around for a potential NCCL deadlock. + if dist._backend == dist.dist_backend.NCCL: + dist._clear_group_cache() + super(DistributedDataParallel, self).train(mode) + self.module.train(mode) + ''' +''' +Modifies existing model to do gradient allreduce, but doesn't change class +so you don't need "module" +''' +def apply_gradient_allreduce(module): + if not hasattr(dist, '_backend'): + module.warn_on_half = True + else: + module.warn_on_half = True if dist._backend == dist.dist_backend.GLOO else False + + for p in module.state_dict().values(): + if not torch.is_tensor(p): + continue + dist.broadcast(p, 0) + + def allreduce_params(): + if(module.needs_reduction): + module.needs_reduction = False + buckets = {} + for param in module.parameters(): + if param.requires_grad and param.grad is not None: + tp = param.data.dtype + if tp not in buckets: + buckets[tp] = [] + buckets[tp].append(param) + if module.warn_on_half: + if torch.cuda.HalfTensor in buckets: + print("WARNING: gloo dist backend for half parameters may be extremely slow." + + " It is recommended to use the NCCL backend in this case. This currently requires" + + "PyTorch built from top of tree master.") + module.warn_on_half = False + + for tp in buckets: + bucket = buckets[tp] + grads = [param.grad.data for param in bucket] + coalesced = _flatten_dense_tensors(grads) + dist.all_reduce(coalesced) + coalesced /= dist.get_world_size() + for buf, synced in zip(grads, _unflatten_dense_tensors(coalesced, grads)): + buf.copy_(synced) + + for param in list(module.parameters()): + def allreduce_hook(*unused): + Variable._execution_engine.queue_callback(allreduce_params) + if param.requires_grad: + param.register_hook(allreduce_hook) + + def set_needs_reduction(self, input, output): + self.needs_reduction = True + + module.register_forward_hook(set_needs_reduction) + return module diff --git a/encoder/audio.py b/encoder/audio.py deleted file mode 100644 index 799aa835499ce8b839290f28b2c8ffb629f37565..0000000000000000000000000000000000000000 --- a/encoder/audio.py +++ /dev/null @@ -1,117 +0,0 @@ -from scipy.ndimage.morphology import binary_dilation -from encoder.params_data import * -from pathlib import Path -from typing import Optional, Union -from warnings import warn -import numpy as np -import librosa -import struct - -try: - import webrtcvad -except: - warn("Unable to import 'webrtcvad'. This package enables noise removal and is recommended.") - webrtcvad=None - -int16_max = (2 ** 15) - 1 - - -def preprocess_wav(fpath_or_wav: Union[str, Path, np.ndarray], - source_sr: Optional[int] = None, - normalize: Optional[bool] = True, - trim_silence: Optional[bool] = True): - """ - Applies the preprocessing operations used in training the Speaker Encoder to a waveform - either on disk or in memory. The waveform will be resampled to match the data hyperparameters. - - :param fpath_or_wav: either a filepath to an audio file (many extensions are supported, not - just .wav), either the waveform as a numpy array of floats. - :param source_sr: if passing an audio waveform, the sampling rate of the waveform before - preprocessing. After preprocessing, the waveform's sampling rate will match the data - hyperparameters. If passing a filepath, the sampling rate will be automatically detected and - this argument will be ignored. - """ - # Load the wav from disk if needed - if isinstance(fpath_or_wav, str) or isinstance(fpath_or_wav, Path): - wav, source_sr = librosa.load(str(fpath_or_wav), sr=None) - else: - wav = fpath_or_wav - - # Resample the wav if needed - if source_sr is not None and source_sr != sampling_rate: - wav = librosa.resample(wav, source_sr, sampling_rate) - - # Apply the preprocessing: normalize volume and shorten long silences - if normalize: - wav = normalize_volume(wav, audio_norm_target_dBFS, increase_only=True) - if webrtcvad and trim_silence: - wav = trim_long_silences(wav) - - return wav - - -def wav_to_mel_spectrogram(wav): - """ - Derives a mel spectrogram ready to be used by the encoder from a preprocessed audio waveform. - Note: this not a log-mel spectrogram. - """ - frames = librosa.feature.melspectrogram( - wav, - sampling_rate, - n_fft=int(sampling_rate * mel_window_length / 1000), - hop_length=int(sampling_rate * mel_window_step / 1000), - n_mels=mel_n_channels - ) - return frames.astype(np.float32).T - - -def trim_long_silences(wav): - """ - Ensures that segments without voice in the waveform remain no longer than a - threshold determined by the VAD parameters in params.py. - - :param wav: the raw waveform as a numpy array of floats - :return: the same waveform with silences trimmed away (length <= original wav length) - """ - # Compute the voice detection window size - samples_per_window = (vad_window_length * sampling_rate) // 1000 - - # Trim the end of the audio to have a multiple of the window size - wav = wav[:len(wav) - (len(wav) % samples_per_window)] - - # Convert the float waveform to 16-bit mono PCM - pcm_wave = struct.pack("%dh" % len(wav), *(np.round(wav * int16_max)).astype(np.int16)) - - # Perform voice activation detection - voice_flags = [] - vad = webrtcvad.Vad(mode=3) - for window_start in range(0, len(wav), samples_per_window): - window_end = window_start + samples_per_window - voice_flags.append(vad.is_speech(pcm_wave[window_start * 2:window_end * 2], - sample_rate=sampling_rate)) - voice_flags = np.array(voice_flags) - - # Smooth the voice detection with a moving average - def moving_average(array, width): - array_padded = np.concatenate((np.zeros((width - 1) // 2), array, np.zeros(width // 2))) - ret = np.cumsum(array_padded, dtype=float) - ret[width:] = ret[width:] - ret[:-width] - return ret[width - 1:] / width - - audio_mask = moving_average(voice_flags, vad_moving_average_width) - audio_mask = np.round(audio_mask).astype(np.bool) - - # Dilate the voiced regions - audio_mask = binary_dilation(audio_mask, np.ones(vad_max_silence_length + 1)) - audio_mask = np.repeat(audio_mask, samples_per_window) - - return wav[audio_mask == True] - - -def normalize_volume(wav, target_dBFS, increase_only=False, decrease_only=False): - if increase_only and decrease_only: - raise ValueError("Both increase only and decrease only are set") - dBFS_change = target_dBFS - 10 * np.log10(np.mean(wav ** 2)) - if (dBFS_change < 0 and increase_only) or (dBFS_change > 0 and decrease_only): - return wav - return wav * (10 ** (dBFS_change / 20)) diff --git a/encoder/config.py b/encoder/config.py deleted file mode 100644 index 1c21312f3de971bfa008254c6035cebc09f05e4c..0000000000000000000000000000000000000000 --- a/encoder/config.py +++ /dev/null @@ -1,45 +0,0 @@ -librispeech_datasets = { - "train": { - "clean": ["LibriSpeech/train-clean-100", "LibriSpeech/train-clean-360"], - "other": ["LibriSpeech/train-other-500"] - }, - "test": { - "clean": ["LibriSpeech/test-clean"], - "other": ["LibriSpeech/test-other"] - }, - "dev": { - "clean": ["LibriSpeech/dev-clean"], - "other": ["LibriSpeech/dev-other"] - }, -} -libritts_datasets = { - "train": { - "clean": ["LibriTTS/train-clean-100", "LibriTTS/train-clean-360"], - "other": ["LibriTTS/train-other-500"] - }, - "test": { - "clean": ["LibriTTS/test-clean"], - "other": ["LibriTTS/test-other"] - }, - "dev": { - "clean": ["LibriTTS/dev-clean"], - "other": ["LibriTTS/dev-other"] - }, -} -voxceleb_datasets = { - "voxceleb1" : { - "train": ["VoxCeleb1/wav"], - "test": ["VoxCeleb1/test_wav"] - }, - "voxceleb2" : { - "train": ["VoxCeleb2/dev/aac"], - "test": ["VoxCeleb2/test_wav"] - } -} - -other_datasets = [ - "LJSpeech-1.1", - "VCTK-Corpus/wav48", -] - -anglophone_nationalites = ["australia", "canada", "ireland", "uk", "usa"] diff --git a/encoder/data_objects/__init__.py b/encoder/data_objects/__init__.py deleted file mode 100644 index ef04ade68544d0477a7f6deb4e7d51e97f592910..0000000000000000000000000000000000000000 --- a/encoder/data_objects/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from encoder.data_objects.speaker_verification_dataset import SpeakerVerificationDataset -from encoder.data_objects.speaker_verification_dataset import SpeakerVerificationDataLoader diff --git a/encoder/data_objects/random_cycler.py b/encoder/data_objects/random_cycler.py deleted file mode 100644 index c405db6b27f46d874d8feb37e3f9c1e12c251109..0000000000000000000000000000000000000000 --- a/encoder/data_objects/random_cycler.py +++ /dev/null @@ -1,37 +0,0 @@ -import random - -class RandomCycler: - """ - Creates an internal copy of a sequence and allows access to its items in a constrained random - order. For a source sequence of n items and one or several consecutive queries of a total - of m items, the following guarantees hold (one implies the other): - - Each item will be returned between m // n and ((m - 1) // n) + 1 times. - - Between two appearances of the same item, there may be at most 2 * (n - 1) other items. - """ - - def __init__(self, source): - if len(source) == 0: - raise Exception("Can't create RandomCycler from an empty collection") - self.all_items = list(source) - self.next_items = [] - - def sample(self, count: int): - shuffle = lambda l: random.sample(l, len(l)) - - out = [] - while count > 0: - if count >= len(self.all_items): - out.extend(shuffle(list(self.all_items))) - count -= len(self.all_items) - continue - n = min(count, len(self.next_items)) - out.extend(self.next_items[:n]) - count -= n - self.next_items = self.next_items[n:] - if len(self.next_items) == 0: - self.next_items = shuffle(list(self.all_items)) - return out - - def __next__(self): - return self.sample(1)[0] - diff --git a/encoder/data_objects/speaker.py b/encoder/data_objects/speaker.py deleted file mode 100644 index 494e882fe34fc38dcc793ab8c74a6cc2376bb7b5..0000000000000000000000000000000000000000 --- a/encoder/data_objects/speaker.py +++ /dev/null @@ -1,40 +0,0 @@ -from encoder.data_objects.random_cycler import RandomCycler -from encoder.data_objects.utterance import Utterance -from pathlib import Path - -# Contains the set of utterances of a single speaker -class Speaker: - def __init__(self, root: Path): - self.root = root - self.name = root.name - self.utterances = None - self.utterance_cycler = None - - def _load_utterances(self): - with self.root.joinpath("_sources.txt").open("r") as sources_file: - sources = [l.split(",") for l in sources_file] - sources = {frames_fname: wave_fpath for frames_fname, wave_fpath in sources} - self.utterances = [Utterance(self.root.joinpath(f), w) for f, w in sources.items()] - self.utterance_cycler = RandomCycler(self.utterances) - - def random_partial(self, count, n_frames): - """ - Samples a batch of unique partial utterances from the disk in a way that all - utterances come up at least once every two cycles and in a random order every time. - - :param count: The number of partial utterances to sample from the set of utterances from - that speaker. Utterances are guaranteed not to be repeated if is not larger than - the number of utterances available. - :param n_frames: The number of frames in the partial utterance. - :return: A list of tuples (utterance, frames, range) where utterance is an Utterance, - frames are the frames of the partial utterances and range is the range of the partial - utterance with regard to the complete utterance. - """ - if self.utterances is None: - self._load_utterances() - - utterances = self.utterance_cycler.sample(count) - - a = [(u,) + u.random_partial(n_frames) for u in utterances] - - return a diff --git a/encoder/data_objects/speaker_batch.py b/encoder/data_objects/speaker_batch.py deleted file mode 100644 index e219b738e58a4450c8ac43e436ff57900832320c..0000000000000000000000000000000000000000 --- a/encoder/data_objects/speaker_batch.py +++ /dev/null @@ -1,13 +0,0 @@ -import numpy as np -from typing import List -from encoder.data_objects.speaker import Speaker - - -class SpeakerBatch: - def __init__(self, speakers: List[Speaker], utterances_per_speaker: int, n_frames: int): - self.speakers = speakers - self.partials = {s: s.random_partial(utterances_per_speaker, n_frames) for s in speakers} - - # Array of shape (n_speakers * n_utterances, n_frames, mel_n), e.g. for 3 speakers with - # 4 utterances each of 160 frames of 40 mel coefficients: (12, 160, 40) - self.data = np.array([frames for s in speakers for _, frames, _ in self.partials[s]]) diff --git a/encoder/data_objects/speaker_verification_dataset.py b/encoder/data_objects/speaker_verification_dataset.py deleted file mode 100644 index 77a6e05eae6a939ae7575ae70b7173644141fffe..0000000000000000000000000000000000000000 --- a/encoder/data_objects/speaker_verification_dataset.py +++ /dev/null @@ -1,56 +0,0 @@ -from encoder.data_objects.random_cycler import RandomCycler -from encoder.data_objects.speaker_batch import SpeakerBatch -from encoder.data_objects.speaker import Speaker -from encoder.params_data import partials_n_frames -from torch.utils.data import Dataset, DataLoader -from pathlib import Path - -# TODO: improve with a pool of speakers for data efficiency - -class SpeakerVerificationDataset(Dataset): - def __init__(self, datasets_root: Path): - self.root = datasets_root - speaker_dirs = [f for f in self.root.glob("*") if f.is_dir()] - if len(speaker_dirs) == 0: - raise Exception("No speakers found. Make sure you are pointing to the directory " - "containing all preprocessed speaker directories.") - self.speakers = [Speaker(speaker_dir) for speaker_dir in speaker_dirs] - self.speaker_cycler = RandomCycler(self.speakers) - - def __len__(self): - return int(1e10) - - def __getitem__(self, index): - return next(self.speaker_cycler) - - def get_logs(self): - log_string = "" - for log_fpath in self.root.glob("*.txt"): - with log_fpath.open("r") as log_file: - log_string += "".join(log_file.readlines()) - return log_string - - -class SpeakerVerificationDataLoader(DataLoader): - def __init__(self, dataset, speakers_per_batch, utterances_per_speaker, sampler=None, - batch_sampler=None, num_workers=0, pin_memory=False, timeout=0, - worker_init_fn=None): - self.utterances_per_speaker = utterances_per_speaker - - super().__init__( - dataset=dataset, - batch_size=speakers_per_batch, - shuffle=False, - sampler=sampler, - batch_sampler=batch_sampler, - num_workers=num_workers, - collate_fn=self.collate, - pin_memory=pin_memory, - drop_last=False, - timeout=timeout, - worker_init_fn=worker_init_fn - ) - - def collate(self, speakers): - return SpeakerBatch(speakers, self.utterances_per_speaker, partials_n_frames) - \ No newline at end of file diff --git a/encoder/data_objects/utterance.py b/encoder/data_objects/utterance.py deleted file mode 100644 index 0768c3420f422a7464f305b4c1fb6752c57ceda7..0000000000000000000000000000000000000000 --- a/encoder/data_objects/utterance.py +++ /dev/null @@ -1,26 +0,0 @@ -import numpy as np - - -class Utterance: - def __init__(self, frames_fpath, wave_fpath): - self.frames_fpath = frames_fpath - self.wave_fpath = wave_fpath - - def get_frames(self): - return np.load(self.frames_fpath) - - def random_partial(self, n_frames): - """ - Crops the frames into a partial utterance of n_frames - - :param n_frames: The number of frames of the partial utterance - :return: the partial utterance frames and a tuple indicating the start and end of the - partial utterance in the complete utterance. - """ - frames = self.get_frames() - if frames.shape[0] == n_frames: - start = 0 - else: - start = np.random.randint(0, frames.shape[0] - n_frames) - end = start + n_frames - return frames[start:end], (start, end) \ No newline at end of file diff --git a/encoder/inference.py b/encoder/inference.py deleted file mode 100644 index 43862e43e663dc5b2053c0f784dfac98cb0bacb3..0000000000000000000000000000000000000000 --- a/encoder/inference.py +++ /dev/null @@ -1,178 +0,0 @@ -from encoder.params_data import * -from encoder.model import SpeakerEncoder -from encoder.audio import preprocess_wav # We want to expose this function from here -from matplotlib import cm -from encoder import audio -from pathlib import Path -import numpy as np -import torch - -_model = None # type: SpeakerEncoder -_device = None # type: torch.device - - -def load_model(weights_fpath: Path, device=None): - """ - Loads the model in memory. If this function is not explicitely called, it will be run on the - first call to embed_frames() with the default weights file. - - :param weights_fpath: the path to saved model weights. - :param device: either a torch device or the name of a torch device (e.g. "cpu", "cuda"). The - model will be loaded and will run on this device. Outputs will however always be on the cpu. - If None, will default to your GPU if it"s available, otherwise your CPU. - """ - # TODO: I think the slow loading of the encoder might have something to do with the device it - # was saved on. Worth investigating. - global _model, _device - if device is None: - _device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - elif isinstance(device, str): - _device = torch.device(device) - _model = SpeakerEncoder(_device, torch.device("cpu")) - checkpoint = torch.load(weights_fpath, _device) - _model.load_state_dict(checkpoint["model_state"]) - _model.eval() - print("Loaded encoder \"%s\" trained to step %d" % (weights_fpath.name, checkpoint["step"])) - - -def is_loaded(): - return _model is not None - - -def embed_frames_batch(frames_batch): - """ - Computes embeddings for a batch of mel spectrogram. - - :param frames_batch: a batch mel of spectrogram as a numpy array of float32 of shape - (batch_size, n_frames, n_channels) - :return: the embeddings as a numpy array of float32 of shape (batch_size, model_embedding_size) - """ - if _model is None: - raise Exception("Model was not loaded. Call load_model() before inference.") - - frames = torch.from_numpy(frames_batch).to(_device) - embed = _model.forward(frames).detach().cpu().numpy() - return embed - - -def compute_partial_slices(n_samples, partial_utterance_n_frames=partials_n_frames, - min_pad_coverage=0.75, overlap=0.5): - """ - Computes where to split an utterance waveform and its corresponding mel spectrogram to obtain - partial utterances of each. Both the waveform and the mel - spectrogram slices are returned, so as to make each partial utterance waveform correspond to - its spectrogram. This function assumes that the mel spectrogram parameters used are those - defined in params_data.py. - - The returned ranges may be indexing further than the length of the waveform. It is - recommended that you pad the waveform with zeros up to wave_slices[-1].stop. - - :param n_samples: the number of samples in the waveform - :param partial_utterance_n_frames: the number of mel spectrogram frames in each partial - utterance - :param min_pad_coverage: when reaching the last partial utterance, it may or may not have - enough frames. If at least of are present, - then the last partial utterance will be considered, as if we padded the audio. Otherwise, - it will be discarded, as if we trimmed the audio. If there aren't enough frames for 1 partial - utterance, this parameter is ignored so that the function always returns at least 1 slice. - :param overlap: by how much the partial utterance should overlap. If set to 0, the partial - utterances are entirely disjoint. - :return: the waveform slices and mel spectrogram slices as lists of array slices. Index - respectively the waveform and the mel spectrogram with these slices to obtain the partial - utterances. - """ - assert 0 <= overlap < 1 - assert 0 < min_pad_coverage <= 1 - - samples_per_frame = int((sampling_rate * mel_window_step / 1000)) - n_frames = int(np.ceil((n_samples + 1) / samples_per_frame)) - frame_step = max(int(np.round(partial_utterance_n_frames * (1 - overlap))), 1) - - # Compute the slices - wav_slices, mel_slices = [], [] - steps = max(1, n_frames - partial_utterance_n_frames + frame_step + 1) - for i in range(0, steps, frame_step): - mel_range = np.array([i, i + partial_utterance_n_frames]) - wav_range = mel_range * samples_per_frame - mel_slices.append(slice(*mel_range)) - wav_slices.append(slice(*wav_range)) - - # Evaluate whether extra padding is warranted or not - last_wav_range = wav_slices[-1] - coverage = (n_samples - last_wav_range.start) / (last_wav_range.stop - last_wav_range.start) - if coverage < min_pad_coverage and len(mel_slices) > 1: - mel_slices = mel_slices[:-1] - wav_slices = wav_slices[:-1] - - return wav_slices, mel_slices - - -def embed_utterance(wav, using_partials=True, return_partials=False, **kwargs): - """ - Computes an embedding for a single utterance. - - # TODO: handle multiple wavs to benefit from batching on GPU - :param wav: a preprocessed (see audio.py) utterance waveform as a numpy array of float32 - :param using_partials: if True, then the utterance is split in partial utterances of - frames and the utterance embedding is computed from their - normalized average. If False, the utterance is instead computed from feeding the entire - spectogram to the network. - :param return_partials: if True, the partial embeddings will also be returned along with the - wav slices that correspond to the partial embeddings. - :param kwargs: additional arguments to compute_partial_splits() - :return: the embedding as a numpy array of float32 of shape (model_embedding_size,). If - is True, the partial utterances as a numpy array of float32 of shape - (n_partials, model_embedding_size) and the wav partials as a list of slices will also be - returned. If is simultaneously set to False, both these values will be None - instead. - """ - # Process the entire utterance if not using partials - if not using_partials: - frames = audio.wav_to_mel_spectrogram(wav) - embed = embed_frames_batch(frames[None, ...])[0] - if return_partials: - return embed, None, None - return embed - - # Compute where to split the utterance into partials and pad if necessary - wave_slices, mel_slices = compute_partial_slices(len(wav), **kwargs) - max_wave_length = wave_slices[-1].stop - if max_wave_length >= len(wav): - wav = np.pad(wav, (0, max_wave_length - len(wav)), "constant") - - # Split the utterance into partials - frames = audio.wav_to_mel_spectrogram(wav) - frames_batch = np.array([frames[s] for s in mel_slices]) - partial_embeds = embed_frames_batch(frames_batch) - - # Compute the utterance embedding from the partial embeddings - raw_embed = np.mean(partial_embeds, axis=0) - embed = raw_embed / np.linalg.norm(raw_embed, 2) - - if return_partials: - return embed, partial_embeds, wave_slices - return embed - - -def embed_speaker(wavs, **kwargs): - raise NotImplemented() - - -def plot_embedding_as_heatmap(embed, ax=None, title="", shape=None, color_range=(0, 0.30)): - import matplotlib.pyplot as plt - if ax is None: - ax = plt.gca() - - if shape is None: - height = int(np.sqrt(len(embed))) - shape = (height, -1) - embed = embed.reshape(shape) - - cmap = cm.get_cmap() - mappable = ax.imshow(embed, cmap=cmap) - cbar = plt.colorbar(mappable, ax=ax, fraction=0.046, pad=0.04) - sm = cm.ScalarMappable(cmap=cmap) - sm.set_clim(*color_range) - - ax.set_xticks([]), ax.set_yticks([]) - ax.set_title(title) diff --git a/encoder/model.py b/encoder/model.py deleted file mode 100644 index e050d3204d8f1becdf0f8b3133470708e5420cea..0000000000000000000000000000000000000000 --- a/encoder/model.py +++ /dev/null @@ -1,135 +0,0 @@ -from encoder.params_model import * -from encoder.params_data import * -from scipy.interpolate import interp1d -from sklearn.metrics import roc_curve -from torch.nn.utils import clip_grad_norm_ -from scipy.optimize import brentq -from torch import nn -import numpy as np -import torch - - -class SpeakerEncoder(nn.Module): - def __init__(self, device, loss_device): - super().__init__() - self.loss_device = loss_device - - # Network defition - self.lstm = nn.LSTM(input_size=mel_n_channels, - hidden_size=model_hidden_size, - num_layers=model_num_layers, - batch_first=True).to(device) - self.linear = nn.Linear(in_features=model_hidden_size, - out_features=model_embedding_size).to(device) - self.relu = torch.nn.ReLU().to(device) - - # Cosine similarity scaling (with fixed initial parameter values) - self.similarity_weight = nn.Parameter(torch.tensor([10.])).to(loss_device) - self.similarity_bias = nn.Parameter(torch.tensor([-5.])).to(loss_device) - - # Loss - self.loss_fn = nn.CrossEntropyLoss().to(loss_device) - - def do_gradient_ops(self): - # Gradient scale - self.similarity_weight.grad *= 0.01 - self.similarity_bias.grad *= 0.01 - - # Gradient clipping - clip_grad_norm_(self.parameters(), 3, norm_type=2) - - def forward(self, utterances, hidden_init=None): - """ - Computes the embeddings of a batch of utterance spectrograms. - - :param utterances: batch of mel-scale filterbanks of same duration as a tensor of shape - (batch_size, n_frames, n_channels) - :param hidden_init: initial hidden state of the LSTM as a tensor of shape (num_layers, - batch_size, hidden_size). Will default to a tensor of zeros if None. - :return: the embeddings as a tensor of shape (batch_size, embedding_size) - """ - # Pass the input through the LSTM layers and retrieve all outputs, the final hidden state - # and the final cell state. - out, (hidden, cell) = self.lstm(utterances, hidden_init) - - # We take only the hidden state of the last layer - embeds_raw = self.relu(self.linear(hidden[-1])) - - # L2-normalize it - embeds = embeds_raw / (torch.norm(embeds_raw, dim=1, keepdim=True) + 1e-5) - - return embeds - - def similarity_matrix(self, embeds): - """ - Computes the similarity matrix according the section 2.1 of GE2E. - - :param embeds: the embeddings as a tensor of shape (speakers_per_batch, - utterances_per_speaker, embedding_size) - :return: the similarity matrix as a tensor of shape (speakers_per_batch, - utterances_per_speaker, speakers_per_batch) - """ - speakers_per_batch, utterances_per_speaker = embeds.shape[:2] - - # Inclusive centroids (1 per speaker). Cloning is needed for reverse differentiation - centroids_incl = torch.mean(embeds, dim=1, keepdim=True) - centroids_incl = centroids_incl.clone() / (torch.norm(centroids_incl, dim=2, keepdim=True) + 1e-5) - - # Exclusive centroids (1 per utterance) - centroids_excl = (torch.sum(embeds, dim=1, keepdim=True) - embeds) - centroids_excl /= (utterances_per_speaker - 1) - centroids_excl = centroids_excl.clone() / (torch.norm(centroids_excl, dim=2, keepdim=True) + 1e-5) - - # Similarity matrix. The cosine similarity of already 2-normed vectors is simply the dot - # product of these vectors (which is just an element-wise multiplication reduced by a sum). - # We vectorize the computation for efficiency. - sim_matrix = torch.zeros(speakers_per_batch, utterances_per_speaker, - speakers_per_batch).to(self.loss_device) - mask_matrix = 1 - np.eye(speakers_per_batch, dtype=np.int) - for j in range(speakers_per_batch): - mask = np.where(mask_matrix[j])[0] - sim_matrix[mask, :, j] = (embeds[mask] * centroids_incl[j]).sum(dim=2) - sim_matrix[j, :, j] = (embeds[j] * centroids_excl[j]).sum(dim=1) - - ## Even more vectorized version (slower maybe because of transpose) - # sim_matrix2 = torch.zeros(speakers_per_batch, speakers_per_batch, utterances_per_speaker - # ).to(self.loss_device) - # eye = np.eye(speakers_per_batch, dtype=np.int) - # mask = np.where(1 - eye) - # sim_matrix2[mask] = (embeds[mask[0]] * centroids_incl[mask[1]]).sum(dim=2) - # mask = np.where(eye) - # sim_matrix2[mask] = (embeds * centroids_excl).sum(dim=2) - # sim_matrix2 = sim_matrix2.transpose(1, 2) - - sim_matrix = sim_matrix * self.similarity_weight + self.similarity_bias - return sim_matrix - - def loss(self, embeds): - """ - Computes the softmax loss according the section 2.1 of GE2E. - - :param embeds: the embeddings as a tensor of shape (speakers_per_batch, - utterances_per_speaker, embedding_size) - :return: the loss and the EER for this batch of embeddings. - """ - speakers_per_batch, utterances_per_speaker = embeds.shape[:2] - - # Loss - sim_matrix = self.similarity_matrix(embeds) - sim_matrix = sim_matrix.reshape((speakers_per_batch * utterances_per_speaker, - speakers_per_batch)) - ground_truth = np.repeat(np.arange(speakers_per_batch), utterances_per_speaker) - target = torch.from_numpy(ground_truth).long().to(self.loss_device) - loss = self.loss_fn(sim_matrix, target) - - # EER (not backpropagated) - with torch.no_grad(): - inv_argmax = lambda i: np.eye(1, speakers_per_batch, i, dtype=np.int)[0] - labels = np.array([inv_argmax(i) for i in ground_truth]) - preds = sim_matrix.detach().cpu().numpy() - - # Snippet from https://yangcha.github.io/EER-ROC/ - fpr, tpr, thresholds = roc_curve(labels.flatten(), preds.flatten()) - eer = brentq(lambda x: 1. - x - interp1d(fpr, tpr)(x), 0., 1.) - - return loss, eer diff --git a/encoder/params_data.py b/encoder/params_data.py deleted file mode 100644 index bdb1716ed45617f2b127a7fb8885afe6cc74fb71..0000000000000000000000000000000000000000 --- a/encoder/params_data.py +++ /dev/null @@ -1,29 +0,0 @@ - -## Mel-filterbank -mel_window_length = 25 # In milliseconds -mel_window_step = 10 # In milliseconds -mel_n_channels = 40 - - -## Audio -sampling_rate = 16000 -# Number of spectrogram frames in a partial utterance -partials_n_frames = 160 # 1600 ms -# Number of spectrogram frames at inference -inference_n_frames = 80 # 800 ms - - -## Voice Activation Detection -# Window size of the VAD. Must be either 10, 20 or 30 milliseconds. -# This sets the granularity of the VAD. Should not need to be changed. -vad_window_length = 30 # In milliseconds -# Number of frames to average together when performing the moving average smoothing. -# The larger this value, the larger the VAD variations must be to not get smoothed out. -vad_moving_average_width = 8 -# Maximum number of consecutive silent frames a segment can have. -vad_max_silence_length = 6 - - -## Audio volume normalization -audio_norm_target_dBFS = -30 - diff --git a/encoder/params_model.py b/encoder/params_model.py deleted file mode 100644 index 3e356472fb5a27f370cb3920976a11d12a76c1b7..0000000000000000000000000000000000000000 --- a/encoder/params_model.py +++ /dev/null @@ -1,11 +0,0 @@ - -## Model parameters -model_hidden_size = 256 -model_embedding_size = 256 -model_num_layers = 3 - - -## Training parameters -learning_rate_init = 1e-4 -speakers_per_batch = 64 -utterances_per_speaker = 10 diff --git a/encoder/preprocess.py b/encoder/preprocess.py deleted file mode 100644 index d2dfc5ecf0fda2e57c919285e65e28c1ab0dfa60..0000000000000000000000000000000000000000 --- a/encoder/preprocess.py +++ /dev/null @@ -1,184 +0,0 @@ -from datetime import datetime -from functools import partial -from multiprocessing import Pool -from pathlib import Path - -import numpy as np -from tqdm import tqdm - -from encoder import audio -from encoder.config import librispeech_datasets, anglophone_nationalites -from encoder.params_data import * - - -_AUDIO_EXTENSIONS = ("wav", "flac", "m4a", "mp3") - -class DatasetLog: - """ - Registers metadata about the dataset in a text file. - """ - def __init__(self, root, name): - self.text_file = open(Path(root, "Log_%s.txt" % name.replace("/", "_")), "w") - self.sample_data = dict() - - start_time = str(datetime.now().strftime("%A %d %B %Y at %H:%M")) - self.write_line("Creating dataset %s on %s" % (name, start_time)) - self.write_line("-----") - self._log_params() - - def _log_params(self): - from encoder import params_data - self.write_line("Parameter values:") - for param_name in (p for p in dir(params_data) if not p.startswith("__")): - value = getattr(params_data, param_name) - self.write_line("\t%s: %s" % (param_name, value)) - self.write_line("-----") - - def write_line(self, line): - self.text_file.write("%s\n" % line) - - def add_sample(self, **kwargs): - for param_name, value in kwargs.items(): - if not param_name in self.sample_data: - self.sample_data[param_name] = [] - self.sample_data[param_name].append(value) - - def finalize(self): - self.write_line("Statistics:") - for param_name, values in self.sample_data.items(): - self.write_line("\t%s:" % param_name) - self.write_line("\t\tmin %.3f, max %.3f" % (np.min(values), np.max(values))) - self.write_line("\t\tmean %.3f, median %.3f" % (np.mean(values), np.median(values))) - self.write_line("-----") - end_time = str(datetime.now().strftime("%A %d %B %Y at %H:%M")) - self.write_line("Finished on %s" % end_time) - self.text_file.close() - - -def _init_preprocess_dataset(dataset_name, datasets_root, out_dir) -> (Path, DatasetLog): - dataset_root = datasets_root.joinpath(dataset_name) - if not dataset_root.exists(): - print("Couldn\'t find %s, skipping this dataset." % dataset_root) - return None, None - return dataset_root, DatasetLog(out_dir, dataset_name) - - -def _preprocess_speaker(speaker_dir: Path, datasets_root: Path, out_dir: Path, skip_existing: bool): - # Give a name to the speaker that includes its dataset - speaker_name = "_".join(speaker_dir.relative_to(datasets_root).parts) - - # Create an output directory with that name, as well as a txt file containing a - # reference to each source file. - speaker_out_dir = out_dir.joinpath(speaker_name) - speaker_out_dir.mkdir(exist_ok=True) - sources_fpath = speaker_out_dir.joinpath("_sources.txt") - - # There's a possibility that the preprocessing was interrupted earlier, check if - # there already is a sources file. - if sources_fpath.exists(): - try: - with sources_fpath.open("r") as sources_file: - existing_fnames = {line.split(",")[0] for line in sources_file} - except: - existing_fnames = {} - else: - existing_fnames = {} - - # Gather all audio files for that speaker recursively - sources_file = sources_fpath.open("a" if skip_existing else "w") - audio_durs = [] - for extension in _AUDIO_EXTENSIONS: - for in_fpath in speaker_dir.glob("**/*.%s" % extension): - # Check if the target output file already exists - out_fname = "_".join(in_fpath.relative_to(speaker_dir).parts) - out_fname = out_fname.replace(".%s" % extension, ".npy") - if skip_existing and out_fname in existing_fnames: - continue - - # Load and preprocess the waveform - wav = audio.preprocess_wav(in_fpath) - if len(wav) == 0: - continue - - # Create the mel spectrogram, discard those that are too short - frames = audio.wav_to_mel_spectrogram(wav) - if len(frames) < partials_n_frames: - continue - - out_fpath = speaker_out_dir.joinpath(out_fname) - np.save(out_fpath, frames) - sources_file.write("%s,%s\n" % (out_fname, in_fpath)) - audio_durs.append(len(wav) / sampling_rate) - - sources_file.close() - - return audio_durs - - -def _preprocess_speaker_dirs(speaker_dirs, dataset_name, datasets_root, out_dir, skip_existing, logger): - print("%s: Preprocessing data for %d speakers." % (dataset_name, len(speaker_dirs))) - - # Process the utterances for each speaker - work_fn = partial(_preprocess_speaker, datasets_root=datasets_root, out_dir=out_dir, skip_existing=skip_existing) - with Pool(4) as pool: - tasks = pool.imap(work_fn, speaker_dirs) - for sample_durs in tqdm(tasks, dataset_name, len(speaker_dirs), unit="speakers"): - for sample_dur in sample_durs: - logger.add_sample(duration=sample_dur) - - logger.finalize() - print("Done preprocessing %s.\n" % dataset_name) - - -def preprocess_librispeech(datasets_root: Path, out_dir: Path, skip_existing=False): - for dataset_name in librispeech_datasets["train"]["other"]: - # Initialize the preprocessing - dataset_root, logger = _init_preprocess_dataset(dataset_name, datasets_root, out_dir) - if not dataset_root: - return - - # Preprocess all speakers - speaker_dirs = list(dataset_root.glob("*")) - _preprocess_speaker_dirs(speaker_dirs, dataset_name, datasets_root, out_dir, skip_existing, logger) - - -def preprocess_voxceleb1(datasets_root: Path, out_dir: Path, skip_existing=False): - # Initialize the preprocessing - dataset_name = "VoxCeleb1" - dataset_root, logger = _init_preprocess_dataset(dataset_name, datasets_root, out_dir) - if not dataset_root: - return - - # Get the contents of the meta file - with dataset_root.joinpath("vox1_meta.csv").open("r") as metafile: - metadata = [line.split("\t") for line in metafile][1:] - - # Select the ID and the nationality, filter out non-anglophone speakers - nationalities = {line[0]: line[3] for line in metadata} - keep_speaker_ids = [speaker_id for speaker_id, nationality in nationalities.items() if - nationality.lower() in anglophone_nationalites] - print("VoxCeleb1: using samples from %d (presumed anglophone) speakers out of %d." % - (len(keep_speaker_ids), len(nationalities))) - - # Get the speaker directories for anglophone speakers only - speaker_dirs = dataset_root.joinpath("wav").glob("*") - speaker_dirs = [speaker_dir for speaker_dir in speaker_dirs if - speaker_dir.name in keep_speaker_ids] - print("VoxCeleb1: found %d anglophone speakers on the disk, %d missing (this is normal)." % - (len(speaker_dirs), len(keep_speaker_ids) - len(speaker_dirs))) - - # Preprocess all speakers - _preprocess_speaker_dirs(speaker_dirs, dataset_name, datasets_root, out_dir, skip_existing, logger) - - -def preprocess_voxceleb2(datasets_root: Path, out_dir: Path, skip_existing=False): - # Initialize the preprocessing - dataset_name = "VoxCeleb2" - dataset_root, logger = _init_preprocess_dataset(dataset_name, datasets_root, out_dir) - if not dataset_root: - return - - # Get the speaker directories - # Preprocess all speakers - speaker_dirs = list(dataset_root.joinpath("dev", "aac").glob("*")) - _preprocess_speaker_dirs(speaker_dirs, dataset_name, datasets_root, out_dir, skip_existing, logger) diff --git a/encoder/train.py b/encoder/train.py deleted file mode 100644 index 2bed4eb2f2f3e343b382a1b9cbf78a9ffb11c002..0000000000000000000000000000000000000000 --- a/encoder/train.py +++ /dev/null @@ -1,125 +0,0 @@ -from pathlib import Path - -import torch - -from encoder.data_objects import SpeakerVerificationDataLoader, SpeakerVerificationDataset -from encoder.model import SpeakerEncoder -from encoder.params_model import * -from encoder.visualizations import Visualizations -from utils.profiler import Profiler - - -def sync(device: torch.device): - # For correct profiling (cuda operations are async) - if device.type == "cuda": - torch.cuda.synchronize(device) - - -def train(run_id: str, clean_data_root: Path, models_dir: Path, umap_every: int, save_every: int, - backup_every: int, vis_every: int, force_restart: bool, visdom_server: str, - no_visdom: bool): - # Create a dataset and a dataloader - dataset = SpeakerVerificationDataset(clean_data_root) - loader = SpeakerVerificationDataLoader( - dataset, - speakers_per_batch, - utterances_per_speaker, - num_workers=4, - ) - - # Setup the device on which to run the forward pass and the loss. These can be different, - # because the forward pass is faster on the GPU whereas the loss is often (depending on your - # hyperparameters) faster on the CPU. - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - # FIXME: currently, the gradient is None if loss_device is cuda - loss_device = torch.device("cpu") - - # Create the model and the optimizer - model = SpeakerEncoder(device, loss_device) - optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate_init) - init_step = 1 - - # Configure file path for the model - model_dir = models_dir / run_id - model_dir.mkdir(exist_ok=True, parents=True) - state_fpath = model_dir / "encoder.pt" - - # Load any existing model - if not force_restart: - if state_fpath.exists(): - print("Found existing model \"%s\", loading it and resuming training." % run_id) - checkpoint = torch.load(state_fpath) - init_step = checkpoint["step"] - model.load_state_dict(checkpoint["model_state"]) - optimizer.load_state_dict(checkpoint["optimizer_state"]) - optimizer.param_groups[0]["lr"] = learning_rate_init - else: - print("No model \"%s\" found, starting training from scratch." % run_id) - else: - print("Starting the training from scratch.") - model.train() - - # Initialize the visualization environment - vis = Visualizations(run_id, vis_every, server=visdom_server, disabled=no_visdom) - vis.log_dataset(dataset) - vis.log_params() - device_name = str(torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU") - vis.log_implementation({"Device": device_name}) - - # Training loop - profiler = Profiler(summarize_every=10, disabled=False) - for step, speaker_batch in enumerate(loader, init_step): - profiler.tick("Blocking, waiting for batch (threaded)") - - # Forward pass - inputs = torch.from_numpy(speaker_batch.data).to(device) - sync(device) - profiler.tick("Data to %s" % device) - embeds = model(inputs) - sync(device) - profiler.tick("Forward pass") - embeds_loss = embeds.view((speakers_per_batch, utterances_per_speaker, -1)).to(loss_device) - loss, eer = model.loss(embeds_loss) - sync(loss_device) - profiler.tick("Loss") - - # Backward pass - model.zero_grad() - loss.backward() - profiler.tick("Backward pass") - model.do_gradient_ops() - optimizer.step() - profiler.tick("Parameter update") - - # Update visualizations - # learning_rate = optimizer.param_groups[0]["lr"] - vis.update(loss.item(), eer, step) - - # Draw projections and save them to the backup folder - if umap_every != 0 and step % umap_every == 0: - print("Drawing and saving projections (step %d)" % step) - projection_fpath = model_dir / f"umap_{step:06d}.png" - embeds = embeds.detach().cpu().numpy() - vis.draw_projections(embeds, utterances_per_speaker, step, projection_fpath) - vis.save() - - # Overwrite the latest version of the model - if save_every != 0 and step % save_every == 0: - print("Saving the model (step %d)" % step) - torch.save({ - "step": step + 1, - "model_state": model.state_dict(), - "optimizer_state": optimizer.state_dict(), - }, state_fpath) - - # Make a backup - if backup_every != 0 and step % backup_every == 0: - print("Making a backup (step %d)" % step) - backup_fpath = model_dir / f"encoder_{step:06d}.bak" - torch.save({ - "step": step + 1, - "model_state": model.state_dict(), - "optimizer_state": optimizer.state_dict(), - }, backup_fpath) - - profiler.tick("Extras (visualizations, saving)") diff --git a/encoder/visualizations.py b/encoder/visualizations.py deleted file mode 100644 index d103944f262161a572148f81d141c9f06422ff41..0000000000000000000000000000000000000000 --- a/encoder/visualizations.py +++ /dev/null @@ -1,179 +0,0 @@ -from datetime import datetime -from time import perf_counter as timer - -import numpy as np -import umap -import visdom - -from encoder.data_objects.speaker_verification_dataset import SpeakerVerificationDataset - - -colormap = np.array([ - [76, 255, 0], - [0, 127, 70], - [255, 0, 0], - [255, 217, 38], - [0, 135, 255], - [165, 0, 165], - [255, 167, 255], - [0, 255, 255], - [255, 96, 38], - [142, 76, 0], - [33, 0, 127], - [0, 0, 0], - [183, 183, 183], -], dtype=np.float) / 255 - - -class Visualizations: - def __init__(self, env_name=None, update_every=10, server="http://localhost", disabled=False): - # Tracking data - self.last_update_timestamp = timer() - self.update_every = update_every - self.step_times = [] - self.losses = [] - self.eers = [] - print("Updating the visualizations every %d steps." % update_every) - - # If visdom is disabled TODO: use a better paradigm for that - self.disabled = disabled - if self.disabled: - return - - # Set the environment name - now = str(datetime.now().strftime("%d-%m %Hh%M")) - if env_name is None: - self.env_name = now - else: - self.env_name = "%s (%s)" % (env_name, now) - - # Connect to visdom and open the corresponding window in the browser - try: - self.vis = visdom.Visdom(server, env=self.env_name, raise_exceptions=True) - except ConnectionError: - raise Exception("No visdom server detected. Run the command \"visdom\" in your CLI to " - "start it.") - # webbrowser.open("http://localhost:8097/env/" + self.env_name) - - # Create the windows - self.loss_win = None - self.eer_win = None - # self.lr_win = None - self.implementation_win = None - self.projection_win = None - self.implementation_string = "" - - def log_params(self): - if self.disabled: - return - from encoder import params_data - from encoder import params_model - param_string = "Model parameters:
" - for param_name in (p for p in dir(params_model) if not p.startswith("__")): - value = getattr(params_model, param_name) - param_string += "\t%s: %s
" % (param_name, value) - param_string += "Data parameters:
" - for param_name in (p for p in dir(params_data) if not p.startswith("__")): - value = getattr(params_data, param_name) - param_string += "\t%s: %s
" % (param_name, value) - self.vis.text(param_string, opts={"title": "Parameters"}) - - def log_dataset(self, dataset: SpeakerVerificationDataset): - if self.disabled: - return - dataset_string = "" - dataset_string += "Speakers: %s\n" % len(dataset.speakers) - dataset_string += "\n" + dataset.get_logs() - dataset_string = dataset_string.replace("\n", "
") - self.vis.text(dataset_string, opts={"title": "Dataset"}) - - def log_implementation(self, params): - if self.disabled: - return - implementation_string = "" - for param, value in params.items(): - implementation_string += "%s: %s\n" % (param, value) - implementation_string = implementation_string.replace("\n", "
") - self.implementation_string = implementation_string - self.implementation_win = self.vis.text( - implementation_string, - opts={"title": "Training implementation"} - ) - - def update(self, loss, eer, step): - # Update the tracking data - now = timer() - self.step_times.append(1000 * (now - self.last_update_timestamp)) - self.last_update_timestamp = now - self.losses.append(loss) - self.eers.append(eer) - print(".", end="") - - # Update the plots every steps - if step % self.update_every != 0: - return - time_string = "Step time: mean: %5dms std: %5dms" % \ - (int(np.mean(self.step_times)), int(np.std(self.step_times))) - print("\nStep %6d Loss: %.4f EER: %.4f %s" % - (step, np.mean(self.losses), np.mean(self.eers), time_string)) - if not self.disabled: - self.loss_win = self.vis.line( - [np.mean(self.losses)], - [step], - win=self.loss_win, - update="append" if self.loss_win else None, - opts=dict( - legend=["Avg. loss"], - xlabel="Step", - ylabel="Loss", - title="Loss", - ) - ) - self.eer_win = self.vis.line( - [np.mean(self.eers)], - [step], - win=self.eer_win, - update="append" if self.eer_win else None, - opts=dict( - legend=["Avg. EER"], - xlabel="Step", - ylabel="EER", - title="Equal error rate" - ) - ) - if self.implementation_win is not None: - self.vis.text( - self.implementation_string + ("%s" % time_string), - win=self.implementation_win, - opts={"title": "Training implementation"}, - ) - - # Reset the tracking - self.losses.clear() - self.eers.clear() - self.step_times.clear() - - def draw_projections(self, embeds, utterances_per_speaker, step, out_fpath=None, max_speakers=10): - import matplotlib.pyplot as plt - - max_speakers = min(max_speakers, len(colormap)) - embeds = embeds[:max_speakers * utterances_per_speaker] - - n_speakers = len(embeds) // utterances_per_speaker - ground_truth = np.repeat(np.arange(n_speakers), utterances_per_speaker) - colors = [colormap[i] for i in ground_truth] - - reducer = umap.UMAP() - projected = reducer.fit_transform(embeds) - plt.scatter(projected[:, 0], projected[:, 1], c=colors) - plt.gca().set_aspect("equal", "datalim") - plt.title("UMAP projection (step %d)" % step) - if not self.disabled: - self.projection_win = self.vis.matplot(plt, win=self.projection_win) - if out_fpath is not None: - plt.savefig(out_fpath) - plt.clf() - - def save(self): - if not self.disabled: - self.vis.save([self.env_name]) diff --git a/encoderCoren.pt b/encoderCoren.pt deleted file mode 100644 index 5cd2e41ea79e4aeb8414c7ed9993c42ab5b0dc28..0000000000000000000000000000000000000000 --- a/encoderCoren.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39373b86598fa3da9fcddee6142382efe09777e8d37dc9c0561f41f0070f134e -size 17090379 diff --git a/hifigan/LICENSE b/hifi-gan/LICENSE similarity index 100% rename from hifigan/LICENSE rename to hifi-gan/LICENSE diff --git a/hifi-gan/README.md b/hifi-gan/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4c63381f7c41874fe97c13f40b92d6bb9413e751 --- /dev/null +++ b/hifi-gan/README.md @@ -0,0 +1,105 @@ +# HiFi-GAN: Generative Adversarial Networks for Efficient and High Fidelity Speech Synthesis + +### Jungil Kong, Jaehyeon Kim, Jaekyoung Bae + +In our [paper](https://arxiv.org/abs/2010.05646), +we proposed HiFi-GAN: a GAN-based model capable of generating high fidelity speech efficiently.
+We provide our implementation and pretrained models as open source in this repository. + +**Abstract :** +Several recent work on speech synthesis have employed generative adversarial networks (GANs) to produce raw waveforms. +Although such methods improve the sampling efficiency and memory usage, +their sample quality has not yet reached that of autoregressive and flow-based generative models. +In this work, we propose HiFi-GAN, which achieves both efficient and high-fidelity speech synthesis. +As speech audio consists of sinusoidal signals with various periods, +we demonstrate that modeling periodic patterns of an audio is crucial for enhancing sample quality. +A subjective human evaluation (mean opinion score, MOS) of a single speaker dataset indicates that our proposed method +demonstrates similarity to human quality while generating 22.05 kHz high-fidelity audio 167.9 times faster than +real-time on a single V100 GPU. We further show the generality of HiFi-GAN to the mel-spectrogram inversion of unseen +speakers and end-to-end speech synthesis. Finally, a small footprint version of HiFi-GAN generates samples 13.4 times +faster than real-time on CPU with comparable quality to an autoregressive counterpart. + +Visit our [demo website](https://jik876.github.io/hifi-gan-demo/) for audio samples. + + +## Pre-requisites +1. Python >= 3.6 +2. Clone this repository. +3. Install python requirements. Please refer [requirements.txt](requirements.txt) +4. Download and extract the [LJ Speech dataset](https://keithito.com/LJ-Speech-Dataset/). +And move all wav files to `LJSpeech-1.1/wavs` + + +## Training +``` +python train.py --config config_v1.json +``` +To train V2 or V3 Generator, replace `config_v1.json` with `config_v2.json` or `config_v3.json`.
+Checkpoints and copy of the configuration file are saved in `cp_hifigan` directory by default.
+You can change the path by adding `--checkpoint_path` option. + +Validation loss during training with V1 generator.
+![validation loss](./validation_loss.png) + +## Pretrained Model +You can also use pretrained models we provide.
+[Download pretrained models](https://drive.google.com/drive/folders/1-eEYTB5Av9jNql0WGBlRoi-WH2J7bp5Y?usp=sharing)
+Details of each folder are as in follows: + +|Folder Name|Generator|Dataset|Fine-Tuned| +|------|---|---|---| +|LJ_V1|V1|LJSpeech|No| +|LJ_V2|V2|LJSpeech|No| +|LJ_V3|V3|LJSpeech|No| +|LJ_FT_T2_V1|V1|LJSpeech|Yes ([Tacotron2](https://github.com/NVIDIA/tacotron2))| +|LJ_FT_T2_V2|V2|LJSpeech|Yes ([Tacotron2](https://github.com/NVIDIA/tacotron2))| +|LJ_FT_T2_V3|V3|LJSpeech|Yes ([Tacotron2](https://github.com/NVIDIA/tacotron2))| +|VCTK_V1|V1|VCTK|No| +|VCTK_V2|V2|VCTK|No| +|VCTK_V3|V3|VCTK|No| +|UNIVERSAL_V1|V1|Universal|No| + +We provide the universal model with discriminator weights that can be used as a base for transfer learning to other datasets. + +## Fine-Tuning +1. Generate mel-spectrograms in numpy format using [Tacotron2](https://github.com/NVIDIA/tacotron2) with teacher-forcing.
+The file name of the generated mel-spectrogram should match the audio file and the extension should be `.npy`.
+Example: + ``` + Audio File : LJ001-0001.wav + Mel-Spectrogram File : LJ001-0001.npy + ``` +2. Create `ft_dataset` folder and copy the generated mel-spectrogram files into it.
+3. Run the following command. + ``` + python train.py --fine_tuning True --config config_v1.json + ``` + For other command line options, please refer to the training section. + + +## Inference from wav file +1. Make `test_files` directory and copy wav files into the directory. +2. Run the following command. + ``` + python inference.py --checkpoint_file [generator checkpoint file path] + ``` +Generated wav files are saved in `generated_files` by default.
+You can change the path by adding `--output_dir` option. + + +## Inference for end-to-end speech synthesis +1. Make `test_mel_files` directory and copy generated mel-spectrogram files into the directory.
+You can generate mel-spectrograms using [Tacotron2](https://github.com/NVIDIA/tacotron2), +[Glow-TTS](https://github.com/jaywalnut310/glow-tts) and so forth. +2. Run the following command. + ``` + python inference_e2e.py --checkpoint_file [generator checkpoint file path] + ``` +Generated wav files are saved in `generated_files_from_mel` by default.
+You can change the path by adding `--output_dir` option. + + +## Acknowledgements +We referred to [WaveGlow](https://github.com/NVIDIA/waveglow), [MelGAN](https://github.com/descriptinc/melgan-neurips) +and [Tacotron2](https://github.com/NVIDIA/tacotron2) to implement this. + diff --git a/diagrams/apple.txt b/hifi-gan/apple.py similarity index 100% rename from diagrams/apple.txt rename to hifi-gan/apple.py diff --git a/hifigan/env.py b/hifi-gan/env.py similarity index 100% rename from hifigan/env.py rename to hifi-gan/env.py diff --git a/hifigan/inference.py b/hifi-gan/inference.py similarity index 94% rename from hifigan/inference.py rename to hifi-gan/inference.py index 10ed36f1d8aa6d1d169333ba1553162a40d5bf0c..96ba10672fd808d9d5f5be673bd58f2db7878eda 100644 --- a/hifigan/inference.py +++ b/hifi-gan/inference.py @@ -6,9 +6,9 @@ import argparse import json import torch from scipy.io.wavfile import write -from hifigan.env import AttrDict -from hifigan.meldataset import mel_spectrogram, MAX_WAV_VALUE, load_wav -from hifigan.models import Generator +from env import AttrDict +from meldataset import mel_spectrogram, MAX_WAV_VALUE, load_wav +from models import Generator h = None device = None diff --git a/hifi-gan/inference_e2e.py b/hifi-gan/inference_e2e.py new file mode 100644 index 0000000000000000000000000000000000000000..0a8b6b32306274fbe08f8023d1b21e59532e3b7d --- /dev/null +++ b/hifi-gan/inference_e2e.py @@ -0,0 +1,90 @@ +from __future__ import absolute_import, division, print_function, unicode_literals + +import glob +import os +import numpy as np +import argparse +import json +import torch +from scipy.io.wavfile import write +from env import AttrDict +from meldataset import MAX_WAV_VALUE +from models import Generator + +h = None +device = None + + +def load_checkpoint(filepath, device): + assert os.path.isfile(filepath) + print("Loading '{}'".format(filepath)) + checkpoint_dict = torch.load(filepath, map_location=device) + print("Complete.") + return checkpoint_dict + + +def scan_checkpoint(cp_dir, prefix): + pattern = os.path.join(cp_dir, prefix + '*') + cp_list = glob.glob(pattern) + if len(cp_list) == 0: + return '' + return sorted(cp_list)[-1] + + +def inference(a): + generator = Generator(h).to(device) + + state_dict_g = load_checkpoint(a.checkpoint_file, device) + generator.load_state_dict(state_dict_g['generator']) + + filelist = os.listdir(a.input_mels_dir) + + os.makedirs(a.output_dir, exist_ok=True) + + generator.eval() + generator.remove_weight_norm() + with torch.no_grad(): + for i, filname in enumerate(filelist): + x = np.load(os.path.join(a.input_mels_dir, filname)) + x = torch.FloatTensor(x).to(device) + y_g_hat = generator(x) + audio = y_g_hat.squeeze() + audio = audio * MAX_WAV_VALUE + audio = audio.cpu().numpy().astype('int16') + + output_file = os.path.join(a.output_dir, os.path.splitext(filname)[0] + '_generated_e2e.wav') + write(output_file, h.sampling_rate, audio) + print(output_file) + + +def main(): + print('Initializing Inference Process..') + + parser = argparse.ArgumentParser() + parser.add_argument('--input_mels_dir', default='test_mel_files') + parser.add_argument('--output_dir', default='generated_files_from_mel') + parser.add_argument('--checkpoint_file', required=True) + a = parser.parse_args() + + config_file = os.path.join(os.path.split(a.checkpoint_file)[0], 'config.json') + with open(config_file) as f: + data = f.read() + + global h + json_config = json.loads(data) + h = AttrDict(json_config) + + torch.manual_seed(h.seed) + global device + if torch.cuda.is_available(): + torch.cuda.manual_seed(h.seed) + device = torch.device('cuda') + else: + device = torch.device('cpu') + + inference(a) + + +if __name__ == '__main__': + main() + diff --git a/hifigan/meldataset.py b/hifi-gan/meldataset.py similarity index 100% rename from hifigan/meldataset.py rename to hifi-gan/meldataset.py diff --git a/hifigan/models.py b/hifi-gan/models.py similarity index 99% rename from hifigan/models.py rename to hifi-gan/models.py index da5cf65e8c7518e60b0bf23889d94b69e639a310..da233d02d4df993c101277506f7ac6e1286fb8bd 100644 --- a/hifigan/models.py +++ b/hifi-gan/models.py @@ -3,7 +3,7 @@ import torch.nn.functional as F import torch.nn as nn from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm -from hifigan.hifigan_utils import init_weights, get_padding +from utils import init_weights, get_padding LRELU_SLOPE = 0.1 diff --git a/hifi-gan/requirements.txt b/hifi-gan/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..60c193b0a88d9e733cec5516385c41262c68eb62 --- /dev/null +++ b/hifi-gan/requirements.txt @@ -0,0 +1,7 @@ +torch==1.4.0 +numpy==1.17.4 +librosa==0.7.2 +scipy==1.4.1 +tensorboard==2.0 +soundfile==0.10.3.post1 +matplotlib==3.1.3 \ No newline at end of file diff --git a/hifigan/train.py b/hifi-gan/train.py similarity index 97% rename from hifigan/train.py rename to hifi-gan/train.py index bc00fed4002cc79d47cd960f4d6c41af7adbc153..3b55094289d8649b5cde18f9675700d1f6ab5ba9 100644 --- a/hifigan/train.py +++ b/hifi-gan/train.py @@ -12,11 +12,11 @@ from torch.utils.data import DistributedSampler, DataLoader import torch.multiprocessing as mp from torch.distributed import init_process_group from torch.nn.parallel import DistributedDataParallel -from hifigan.env import AttrDict, build_env -from hifigan.meldataset import MelDataset, mel_spectrogram, get_dataset_filelist -from hifigan.models import Generator, MultiPeriodDiscriminator, MultiScaleDiscriminator, feature_loss, generator_loss,\ +from env import AttrDict, build_env +from meldataset import MelDataset, mel_spectrogram, get_dataset_filelist +from models import Generator, MultiPeriodDiscriminator, MultiScaleDiscriminator, feature_loss, generator_loss,\ discriminator_loss -from hifigan.hifigan_utils import plot_spectrogram, scan_checkpoint, load_checkpoint, save_checkpoint +from utils import plot_spectrogram, scan_checkpoint, load_checkpoint, save_checkpoint torch.backends.cudnn.benchmark = True diff --git a/hifigan/hifigan_utils.py b/hifi-gan/utils.py similarity index 100% rename from hifigan/hifigan_utils.py rename to hifi-gan/utils.py diff --git a/hifigan/inference_e2e.py b/hifigan/inference_e2e.py deleted file mode 100644 index 6115600faf757859fdf99d1691ea3d353ee74689..0000000000000000000000000000000000000000 --- a/hifigan/inference_e2e.py +++ /dev/null @@ -1,76 +0,0 @@ -from __future__ import absolute_import, division, print_function, unicode_literals - -import os -import numpy as np -import json -import torch -from scipy.io.wavfile import write -from hifigan.env import AttrDict -from hifigan.models import Generator -from io import BytesIO - -h = None -device = None - - -def load_checkpoint(filepath, device): - assert os.path.isfile(filepath) - print("Loading '{}'".format(filepath)) - checkpoint_dict = torch.load(filepath, map_location=device) - print("Complete.") - return checkpoint_dict - - -def hifi_gan_inference(input_mel, checkpoint_file): - print('Initializing Inference Process..') - config_file = os.path.join(os.path.split(checkpoint_file)[0], 'config.json') - with open(config_file) as f: - data = f.read() - - global h - json_config = json.loads(data) - h = AttrDict(json_config) - - # Set MAX_WAV_VALUE if not present - if 'MAX_WAV_VALUE' not in h: - h.MAX_WAV_VALUE = 32768.0 # Adjust this value based on your requirements - - torch.manual_seed(h.seed) - global device - if torch.cuda.is_available(): - torch.cuda.manual_seed(h.seed) - device = torch.device('cuda') - else: - device = torch.device('cpu') - - generator = Generator(h).to(device) - - state_dict_g = load_checkpoint(checkpoint_file, device) - generator.load_state_dict(state_dict_g['generator']) - - generator.eval() - generator.remove_weight_norm() - - # Load data from BytesIO - buffer = BytesIO(input_mel) - x = np.load(buffer) - - x = torch.FloatTensor(x).to(device) - y_g_hat = generator(x) - - # Detach tensor before converting to numpy - audio = y_g_hat.squeeze().detach().numpy() - - # Set MAX_WAV_VALUE if not present - if 'MAX_WAV_VALUE' not in h: - h.MAX_WAV_VALUE = 32768.0 # Adjust this value based on your requirements - - audio = audio * h.MAX_WAV_VALUE - audio = audio.astype('int16') - - # Save audio to BytesIO - output_buffer = BytesIO() - write(output_buffer, h.sampling_rate, audio) - - return output_buffer.getvalue() - \ No newline at end of file diff --git a/hparams.py b/hparams.py index 86241ebf19fb57cdfdb48a7f051c5d433a92279e..3dc0ad7108094642cf2a542f715b6fc05987d2da 100644 --- a/hparams.py +++ b/hparams.py @@ -61,7 +61,6 @@ def create_hparams(hparams_string=None, verbose=False): "encoder_kernel_size":5, "encoder_n_convolutions":3, "encoder_embedding_dim":512, - "speaker_embedding_dim":256, # Decoder parameters "n_frames_per_step":1, # currently only 1 is supported diff --git a/kaggle_12000.pt b/kaggle_12000.pt deleted file mode 100644 index 37f8cda2079aaf7c09065127cb749a04ac406374..0000000000000000000000000000000000000000 --- a/kaggle_12000.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27d4936bff68d3fe37053ec3110486bdea9f23bf137f07477c28bbd4f36b85ae -size 338426303 diff --git a/logger.py b/logger.py new file mode 100644 index 0000000000000000000000000000000000000000..ad327383a24484476801ea7f6d840b9fdb49786b --- /dev/null +++ b/logger.py @@ -0,0 +1,48 @@ +import random +import torch +from torch.utils.tensorboard import SummaryWriter +from plotting_utils import plot_alignment_to_numpy, plot_spectrogram_to_numpy +from plotting_utils import plot_gate_outputs_to_numpy + + +class Tacotron2Logger(SummaryWriter): + def __init__(self, logdir): + super(Tacotron2Logger, self).__init__(logdir) + + def log_training(self, reduced_loss, grad_norm, learning_rate, duration, + iteration): + self.add_scalar("training.loss", reduced_loss, iteration) + self.add_scalar("grad.norm", grad_norm, iteration) + self.add_scalar("learning.rate", learning_rate, iteration) + self.add_scalar("duration", duration, iteration) + + def log_validation(self, reduced_loss, model, y, y_pred, iteration): + self.add_scalar("validation.loss", reduced_loss, iteration) + _, mel_outputs, gate_outputs, alignments = y_pred + mel_targets, gate_targets = y + + # plot distribution of parameters + for tag, value in model.named_parameters(): + tag = tag.replace('.', '/') + self.add_histogram(tag, value.data.cpu().numpy(), iteration) + + # plot alignment, mel target and predicted, gate target and predicted + idx = random.randint(0, alignments.size(0) - 1) + self.add_image( + "alignment", + plot_alignment_to_numpy(alignments[idx].data.cpu().numpy().T), + iteration, dataformats='HWC') + self.add_image( + "mel_target", + plot_spectrogram_to_numpy(mel_targets[idx].data.cpu().numpy()), + iteration, dataformats='HWC') + self.add_image( + "mel_predicted", + plot_spectrogram_to_numpy(mel_outputs[idx].data.cpu().numpy()), + iteration, dataformats='HWC') + self.add_image( + "gate", + plot_gate_outputs_to_numpy( + gate_targets[idx].data.cpu().numpy(), + torch.sigmoid(gate_outputs[idx]).data.cpu().numpy()), + iteration, dataformats='HWC') diff --git a/logic.py b/logic.py index 2a19ebbff2103878889e0c90ca9292545f9913ee..a76bdcb3f549dc222df96671ae416b71e7ecb9c8 100644 --- a/logic.py +++ b/logic.py @@ -3,28 +3,15 @@ import numpy as np import torch import base64 import io -from io import BytesIO import matplotlib.pyplot as plt from hparams import create_hparams from model import Tacotron2 -from layers import TacotronSTFT from train import load_model from text import text_to_sequence -from utils import load_wav_to_torch import os -import random -import librosa +import subprocess import librosa.display -use_cuda = torch.cuda.is_available() -device = torch.device('cuda' if use_cuda else 'cpu') - -hparams = create_hparams() -hparams.sampling_rate = 22050 -stft = TacotronSTFT( - hparams.filter_length, hparams.hop_length, hparams.win_length, hparams.n_mel_channels, - hparams.sampling_rate, hparams.mel_fmin, hparams.mel_fmax).to(device) - # Function to plot data def plot_data(data, figsize=(16, 4), titles=['Mel Spectrogram (Original)', 'Mel Spectrogram (Postnet)', 'Alignment'], xlabel=['Time Steps', 'Time Steps', 'Decoder Time Steps'], @@ -55,84 +42,59 @@ def plot_data(data, figsize=(16, 4), titles=['Mel Spectrogram (Original)', 'Mel return img_base64 #Function to plot timedomain waveform -def plot_waveforms(audio_data): - # Load the audio from BytesIO - buffer = BytesIO(audio_data) - y, sr = librosa.load(buffer, sr=None) - - # Create waveform plot - plt.figure(figsize=(10, 4)) - librosa.display.waveshow(y, sr=sr) - plt.xlabel("Time (s)") - plt.ylabel("Amplitude") - plt.title("Waveform") - - # Save the plot to a BytesIO object - wave_buffer = BytesIO() - plt.savefig(wave_buffer, format="png") - wave_buffer.seek(0) - plt.close() - - # Encode the plot as base64 - wave_base64 = base64.b64encode(wave_buffer.read()).decode('utf-8') - - return wave_base64 +def plot_waveforms(audio_file, sr=22050): + # Load audio waveform + y, sr = librosa.load(audio_file, sr=sr) + # Create time vector + time = librosa.times_like(y, sr=sr) -# load speaker model -def load_speaker_model(speaker_model_path): - from speaker.model import SpeakerEncoder - device = torch.device('cuda' if use_cuda else 'cpu') - loss_device = torch.device("cpu") - - model = SpeakerEncoder(device, loss_device) - speaker_dict = torch.load(speaker_model_path, map_location='cpu') - model.load_state_dict(speaker_dict) + # Plot the waveform + plt.figure(figsize=(16, 4)) + librosa.display.waveshow(y, sr=sr) + plt.title('Time vs Amplitude') + plt.xlabel('Time (s)') + plt.ylabel('Amplitude') - # Freeze the weights of the speaker model - for param in model.parameters(): - param.requires_grad = False + plt.tight_layout() + # plt.savefig('static/waveform.png') + img_buffer = io.BytesIO() + plt.savefig(img_buffer, format='png', bbox_inches='tight', pad_inches=0) + plt.close() - return model + img_base64 = base64.b64encode(img_buffer.getvalue()).decode('utf-8') -speaker_model = load_speaker_model('speaker/saved_models/saved_model_e273_LargeBatch.pt').to(device).eval().float() + return img_base64 -def extract_speech_embedding(audio_path: str): - audio, sampling_rate = load_wav_to_torch(audio_path) - if sampling_rate != stft.sampling_rate: - raise ValueError("{} SR doesn't match target {} SR".format(sampling_rate, stft.sampling_rate)) - - audio_norm = audio / 32768.0 - audio_norm = audio_norm.unsqueeze(0) - audio_norm = torch.autograd.Variable(audio_norm, requires_grad=False).to(device) - melspec = stft.mel_spectrogram(audio_norm).transpose(1,2).float() - - if melspec.shape[1] <= 128: - mel_slice = mel - else: - slice_start = random.randint(0,melspec.shape[1]-128) - mel_slice = melspec[:,slice_start:slice_start+128] - speaker_embedding = speaker_model(mel_slice) - return speaker_embedding - def synthesize_voice(text_input, checkpoint_path): - # Load Tacotron2 model from checkpoint - model = load_model(hparams) - checkpoint = torch.load(checkpoint_path, map_location=torch.device('cpu')) - model.load_state_dict(checkpoint['state_dict']) - model = model.to(device).eval().float() + # Load Tacotron2 model + hparams = create_hparams() + hparams.sampling_rate = 22050 + # Load model from checkpoint + model = load_model(hparams) + model.load_state_dict(torch.load(checkpoint_path)['state_dict']) + model = model.cuda().eval().half() # Nepali text - speaker_audio_path='speaker_audio/ariana.wav' sequence = np.array(text_to_sequence(text_input, ['transliteration_cleaners']))[None, :] - sequence = torch.autograd.Variable(torch.from_numpy(sequence)).to(device).long() - speaker_embedding = extract_speech_embedding(speaker_audio_path) - + sequence = torch.autograd.Variable(torch.from_numpy(sequence)).cuda().long() + # Melspectrogram and Alignment graph - mel_outputs, mel_outputs_postnet, _, alignments = model.inference(sequence, speaker_embedding) + mel_outputs, mel_outputs_postnet, _, alignments = model.inference(sequence) mel_output_data = mel_outputs.data.cpu().numpy()[0] mel_output_postnet_data = mel_outputs_postnet.data.cpu().numpy()[0] alignments_data = alignments.data.cpu().numpy()[0].T - return mel_output_data, mel_output_postnet_data, alignments_data \ No newline at end of file + np.save('mel_files/mel1'+'.npy', mel_output_data) + + input_mels_dir = 'mel_files/' + output_dir = 'audio_output/' + run_hifigan_inference(input_mels_dir, output_dir) + + return mel_output_data, mel_output_postnet_data, alignments_data + + +def run_hifigan_inference(input_mels_dir, output_dir): + script_path = os.path.join(os.path.dirname("hifigan/"), "inference_e2e.py") # Assuming both scripts are in the same directory + subprocess.run(["python", script_path, "--checkpoint_file", "generator_v1", "--input_mels_dir", input_mels_dir, "--output_dir", output_dir]) \ No newline at end of file diff --git a/loss_function.py b/loss_function.py new file mode 100644 index 0000000000000000000000000000000000000000..99cae952bbc38cb5d89a5686b07a8dd458725e22 --- /dev/null +++ b/loss_function.py @@ -0,0 +1,19 @@ +from torch import nn + + +class Tacotron2Loss(nn.Module): + def __init__(self): + super(Tacotron2Loss, self).__init__() + + def forward(self, model_output, targets): + mel_target, gate_target = targets[0], targets[1] + mel_target.requires_grad = False + gate_target.requires_grad = False + gate_target = gate_target.view(-1, 1) + + mel_out, mel_out_postnet, gate_out, _ = model_output + gate_out = gate_out.view(-1, 1) + mel_loss = nn.MSELoss()(mel_out, mel_target) + \ + nn.MSELoss()(mel_out_postnet, mel_target) + gate_loss = nn.BCEWithLogitsLoss()(gate_out, gate_target) + return mel_loss + gate_loss diff --git a/loss_scaler.py b/loss_scaler.py new file mode 100644 index 0000000000000000000000000000000000000000..88cc9cf29d3ce122d7582020b73be4f4a5641fcd --- /dev/null +++ b/loss_scaler.py @@ -0,0 +1,131 @@ +import torch + +class LossScaler: + + def __init__(self, scale=1): + self.cur_scale = scale + + # `params` is a list / generator of torch.Variable + def has_overflow(self, params): + return False + + # `x` is a torch.Tensor + def _has_inf_or_nan(x): + return False + + # `overflow` is boolean indicating whether we overflowed in gradient + def update_scale(self, overflow): + pass + + @property + def loss_scale(self): + return self.cur_scale + + def scale_gradient(self, module, grad_in, grad_out): + return tuple(self.loss_scale * g for g in grad_in) + + def backward(self, loss): + scaled_loss = loss*self.loss_scale + scaled_loss.backward() + +class DynamicLossScaler: + + def __init__(self, + init_scale=2**32, + scale_factor=2., + scale_window=1000): + self.cur_scale = init_scale + self.cur_iter = 0 + self.last_overflow_iter = -1 + self.scale_factor = scale_factor + self.scale_window = scale_window + + # `params` is a list / generator of torch.Variable + def has_overflow(self, params): +# return False + for p in params: + if p.grad is not None and DynamicLossScaler._has_inf_or_nan(p.grad.data): + return True + + return False + + # `x` is a torch.Tensor + def _has_inf_or_nan(x): + cpu_sum = float(x.float().sum()) + if cpu_sum == float('inf') or cpu_sum == -float('inf') or cpu_sum != cpu_sum: + return True + return False + + # `overflow` is boolean indicating whether we overflowed in gradient + def update_scale(self, overflow): + if overflow: + #self.cur_scale /= self.scale_factor + self.cur_scale = max(self.cur_scale/self.scale_factor, 1) + self.last_overflow_iter = self.cur_iter + else: + if (self.cur_iter - self.last_overflow_iter) % self.scale_window == 0: + self.cur_scale *= self.scale_factor +# self.cur_scale = 1 + self.cur_iter += 1 + + @property + def loss_scale(self): + return self.cur_scale + + def scale_gradient(self, module, grad_in, grad_out): + return tuple(self.loss_scale * g for g in grad_in) + + def backward(self, loss): + scaled_loss = loss*self.loss_scale + scaled_loss.backward() + +############################################################## +# Example usage below here -- assuming it's in a separate file +############################################################## +if __name__ == "__main__": + import torch + from torch.autograd import Variable + from dynamic_loss_scaler import DynamicLossScaler + + # N is batch size; D_in is input dimension; + # H is hidden dimension; D_out is output dimension. + N, D_in, H, D_out = 64, 1000, 100, 10 + + # Create random Tensors to hold inputs and outputs, and wrap them in Variables. + x = Variable(torch.randn(N, D_in), requires_grad=False) + y = Variable(torch.randn(N, D_out), requires_grad=False) + + w1 = Variable(torch.randn(D_in, H), requires_grad=True) + w2 = Variable(torch.randn(H, D_out), requires_grad=True) + parameters = [w1, w2] + + learning_rate = 1e-6 + optimizer = torch.optim.SGD(parameters, lr=learning_rate) + loss_scaler = DynamicLossScaler() + + for t in range(500): + y_pred = x.mm(w1).clamp(min=0).mm(w2) + loss = (y_pred - y).pow(2).sum() * loss_scaler.loss_scale + print('Iter {} loss scale: {}'.format(t, loss_scaler.loss_scale)) + print('Iter {} scaled loss: {}'.format(t, loss.data[0])) + print('Iter {} unscaled loss: {}'.format(t, loss.data[0] / loss_scaler.loss_scale)) + + # Run backprop + optimizer.zero_grad() + loss.backward() + + # Check for overflow + has_overflow = DynamicLossScaler.has_overflow(parameters) + + # If no overflow, unscale grad and update as usual + if not has_overflow: + for param in parameters: + param.grad.data.mul_(1. / loss_scaler.loss_scale) + optimizer.step() + # Otherwise, don't do anything -- ie, skip iteration + else: + print('OVERFLOW!') + + # Update loss scale for next iteration + loss_scaler.update_scale(has_overflow) + diff --git a/model.py b/model.py index 81315aa0958035bb11a1e7679e9c31cd8bb9e04e..ec0e9cea43e1b23f89934d85298b8f9d1883d13f 100644 --- a/model.py +++ b/model.py @@ -147,8 +147,13 @@ class Postnet(nn.Module): class Encoder(nn.Module): + """Encoder module: + - Three 1-d convolution banks + - Bidirectional LSTM + """ def __init__(self, hparams): super(Encoder, self).__init__() + convolutions = [] for _ in range(hparams.encoder_n_convolutions): conv_layer = nn.Sequential( @@ -165,15 +170,13 @@ class Encoder(nn.Module): int(hparams.encoder_embedding_dim / 2), 1, batch_first=True, bidirectional=True) - def forward(self, x, input_lengths, speaker_embedding): - # Modify the input x to concatenate the speaker embedding - x = torch.cat((x, speaker_embedding.unsqueeze(1).expand(-1, x.size(1), -1)), dim=-1) - + def forward(self, x, input_lengths): for conv in self.convolutions: x = F.dropout(F.relu(conv(x)), 0.5, self.training) x = x.transpose(1, 2) + # pytorch tensor are not reversible, hence the conversion input_lengths = input_lengths.cpu().numpy() x = nn.utils.rnn.pack_padded_sequence( x, input_lengths, batch_first=True) @@ -186,10 +189,7 @@ class Encoder(nn.Module): return outputs - def inference(self, x, speaker_embedding): - # Modify the input x to concatenate the speaker embedding - x = torch.cat((x, speaker_embedding.unsqueeze(1).expand(-1, x.size(1), -1)), dim=-1) - + def inference(self, x): for conv in self.convolutions: x = F.dropout(F.relu(conv(x)), 0.5, self.training) @@ -496,14 +496,13 @@ class Tacotron2(nn.Module): return outputs - def forward(self, inputs, speaker_embedding): + def forward(self, inputs): text_inputs, text_lengths, mels, max_len, output_lengths = inputs text_lengths, output_lengths = text_lengths.data, output_lengths.data embedded_inputs = self.embedding(text_inputs).transpose(1, 2) - # Pass the speaker embedding to the Encoder - encoder_outputs = self.encoder(embedded_inputs, text_lengths, speaker_embedding) + encoder_outputs = self.encoder(embedded_inputs, text_lengths) mel_outputs, gate_outputs, alignments = self.decoder( encoder_outputs, mels, memory_lengths=text_lengths) @@ -515,11 +514,9 @@ class Tacotron2(nn.Module): [mel_outputs, mel_outputs_postnet, gate_outputs, alignments], output_lengths) - def inference(self, inputs, speaker_embedding): + def inference(self, inputs): embedded_inputs = self.embedding(inputs).transpose(1, 2) - # Pass the speaker embedding to the Encoder - encoder_outputs = self.encoder.inference(embedded_inputs, speaker_embedding) - + encoder_outputs = self.encoder.inference(embedded_inputs) mel_outputs, gate_outputs, alignments = self.decoder.inference( encoder_outputs) @@ -530,4 +527,3 @@ class Tacotron2(nn.Module): [mel_outputs, mel_outputs_postnet, gate_outputs, alignments]) return outputs - diff --git a/multiproc.py b/multiproc.py new file mode 100644 index 0000000000000000000000000000000000000000..060ff937ace6c4170f12189e442c65f5093e0ecf --- /dev/null +++ b/multiproc.py @@ -0,0 +1,23 @@ +import time +import torch +import sys +import subprocess + +argslist = list(sys.argv)[1:] +num_gpus = torch.cuda.device_count() +argslist.append('--n_gpus={}'.format(num_gpus)) +workers = [] +job_id = time.strftime("%Y_%m_%d-%H%M%S") +argslist.append("--group_name=group_{}".format(job_id)) + +for i in range(num_gpus): + argslist.append('--rank={}'.format(i)) + stdout = None if i == 0 else open("logs/{}_GPU_{}.log".format(job_id, i), + "w") + print(argslist) + p = subprocess.Popen([str(sys.executable)]+argslist, stdout=stdout) + workers.append(p) + argslist = argslist[:-1] + +for p in workers: + p.wait() diff --git a/requirements.txt b/requirements.txt index b43410d5e0938ea091ecae2bcc47a5c94a861541..5337500a34e2b98c889212433827437e666ad165 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,11 @@ -fastapi[all] +flask +flask_cors +typing +fastapi gunicorn -torch==1.12.1+cu113 -torchaudio==0.12.1+cu113 -torchvision==0.13.1+cu113 +torch==1.12.1 +torchaudio==0.12.1 +torchvision==0.13.1 matplotlib==3.5.3 numpy==1.18.5 inflect @@ -11,6 +14,4 @@ scipy==1.7.3 tensorboard==2.11.2 Unidecode pillow -uvicorn -httpx==0.19.0 ---extra-index-url https://download.pytorch.org/whl/cu113 \ No newline at end of file +uvicorn \ No newline at end of file diff --git a/saved_model.pt b/saved_model.pt deleted file mode 100644 index 190dc8b2d33332fbcc4cdf137aed68cdb654f903..0000000000000000000000000000000000000000 --- a/saved_model.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ccc0abcd0fb77104be73e6675454a06e7797bf1d4a1177181c32b648e9d75a9 -size 5697243 diff --git a/speaker/__init__.py b/speaker/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/speaker/bana.txt b/speaker/bana.txt deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/speaker/data.py b/speaker/data.py deleted file mode 100644 index ccdf63399b39d0b6e26fb5e6c40b8b57bd4eb066..0000000000000000000000000000000000000000 --- a/speaker/data.py +++ /dev/null @@ -1,109 +0,0 @@ -import torch -import torchaudio.datasets as datasets -import torchaudio.transforms as transforms -from collections import defaultdict -import random -import layers - -import warnings - -class SpeakerMelLoader(torch.utils.data.Dataset): - """ - computes mel-spectrograms from audio file and pulls the speaker ID from the - dataset - """ - - def __init__(self, dataset, format='speaker', speaker_utterances=4, mel_length = 128, mel_type = 'Tacotron'): - self.dataset = dataset - self.set_format(format) - self.speaker_utterances = speaker_utterances - self.mel_length = mel_length - self.mel_type = mel_type - self.mel_generators = dict() - - def set_format(self,format): - self.format = format - - if format == 'speaker': - self.create_speaker_index() - - def create_speaker_index(self): - vals = [x.split('-',1) for x in self.dataset._walker] - speaker_map = defaultdict(list) - - for i,v in enumerate(vals): - speaker_map[v[0]].append(i) - - self.speaker_map = speaker_map - self.speaker_keys = list(speaker_map.keys()) - - def apply_mel_gen(self, waveform, sampling_rate, channels=80): - if (sampling_rate, channels) not in self.mel_generators: - if self.mel_type == 'MFCC': - mel_gen = transforms.MFCC(sample_rate=sampling_rate, n_mfcc=channels) - elif self.mel_type == 'Mel': - mel_gen = transforms.MelSpectrogram(sample_rate=sampling_rate, n_mels=channels) - elif self.mel_type == 'Tacotron': - mel_gen = layers.TacotronSTFT(sampling_rate=sampling_rate,n_mel_channels=channels) - else: - raise NotImplementedError('Unsupported mel_type in MelSpeakerLoader: '+self.mel_type) - self.mel_generators[(sampling_rate,channels)] = mel_gen - else: - mel_gen = self.mel_generators[(sampling_rate, channels)] - - if self.mel_type == 'Tacotron': - #Replicating from Tacotron2 data loader - max_wav_value=32768.0 - #skip normalization from Tacotron2, LibriSpeech data looks pre-normalized (all vals between 0-1) - audio_norm = waveform #/ max_wav_value - audio_norm = torch.autograd.Variable(audio_norm, requires_grad=False) - melspec = mel_gen.mel_spectrogram(audio_norm) - else: - audio = waveform.unsqueeze(0) - audio = torch.autograd.Variable(audio, requires_grad=False) - melspec = mel_gen(audio) - - return melspec - - def get_mel(self, waveform, sampling_rate, channels=80): - # We previously identified that these warnings were ok. - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', message=r'At least one mel filterbank has all zero values.*', module=r'torchaudio.*') - melspec = self.apply_mel_gen(waveform, sampling_rate, channels) - # melspec is (1,1,channels, time) by default - # return (time, channels) - melspec = torch.squeeze(melspec).T - return melspec - - def __getitem__(self, index): - if self.format == 'utterance': - (waveform, sample_rate, _, speaker_id, _, _) = self.dataset[index] - mel = self.get_mel(waveform, sample_rate) - return (speaker_id, mel) - elif self.format == 'speaker': - speaker_id = self.speaker_keys[index] - utter_indexes = random.sample(self.speaker_map[speaker_id], self.speaker_utterances) - mels = [] - for i in utter_indexes: - (waveform, sample_rate, _, speaker_id, _, _) = self.dataset[i] - mel = self.get_mel(waveform, sample_rate) - if mel.shape[0] < self.mel_length: - #Zero pad mel on the right to mel_length - #pad_tuple is (dn start, dn end, dn-1 start, dn-1 end, ... , d1 start, d1 end) - pad_tuple = (0,0,0,self.mel_length-mel.shape[0]) - mel=torch.nn.functional.pad(mel,pad_tuple) - mel_frame = 0 - else: - mel_frame = random.randint(0,mel.shape[0]-self.mel_length) - mels.append(mel[mel_frame:mel_frame+self.mel_length,:]) - return (speaker_id, torch.stack(mels,0)) - else: - raise NotImplementedError() - - def __len__(self): - if self.format == 'utterance': - return len(self.dataset) - elif self.format == 'speaker': - return len(self.speaker_keys) - else: - raise NotImplementedError() \ No newline at end of file diff --git a/speaker/model.py b/speaker/model.py deleted file mode 100644 index 40de26d4c84c753075f88891edbcbc53daf41e1f..0000000000000000000000000000000000000000 --- a/speaker/model.py +++ /dev/null @@ -1,191 +0,0 @@ -from torch import nn -import numpy as np -import torch -from torch.nn.utils import clip_grad_norm_ - -class SpeakerEncoder(nn.Module): - """ Learn speaker representation from speech utterance of arbitrary lengths. - """ - def __init__(self, device, loss_device): - super().__init__() - self.loss_device = loss_device - - # lstm block consisting of 3 layers - # takes input 80 channel log-mel spectrograms, projected to 256 dimensions - self.lstm = nn.LSTM( - input_size=80, - hidden_size=256, - num_layers=3, - batch_first=True, - dropout=0, - bidirectional=False - ).to(device) - - self.linear = nn.Linear(in_features=256, out_features=256).to(device) - self.relu = nn.ReLU().to(device) - # epsilon term for numerical stability ( ie - division by 0) - self.epsilon = 1e-5 - - #Cosine similarity weights - self.sim_weight = nn.Parameter(torch.tensor([5.])).to(loss_device) - self.sim_bias = nn.Parameter(torch.tensor([-1.])).to(loss_device) - - def forward(self, utterances, h_init=None, c_init=None): - # implement section 2.1 from https://arxiv.org/pdf/1806.04558.pdf - if h_init is None or c_init is None: - out, (hidden, cell) = self.lstm(utterances) - else: - out, (hidden, cell) = self.lstm(utterances, (h_init, c_init)) - - # compute speaker embedding from hidden state of final layer - final_hidden = hidden[-1] - speaker_embedding = self.relu(self.linear(final_hidden)) - - # l2 norm of speaker embedding - speaker_embedding = speaker_embedding / (torch.norm(speaker_embedding, dim=1, keepdim=True) + self.epsilon) - return speaker_embedding - - def gradient_clipping(self): - self.sim_weight.grad *= 0.01 - self.sim_bias.grad *= 0.01 - - #Pytorch to clip gradients if norm greater than max - clip_grad_norm_(self.parameters(),max_norm=3,norm_type=2) - - def similarity_matrix(self, embeds, debug=False): - # calculate s_ji,k from section 2.1 of GE2E paper - # output matrix is cosine similarity between each utterance x centroid of each speaker - # embeds input size: (speakers, utterances, embedding size) - - # Speaker centroids - # Equal to average of utterance embeddings for the speaker - # Used for neg examples (utterance comparing to false speaker) - # Equation 1 in paper - # size: (speakers, 1, embedding size) - speaker_centroid = torch.mean(embeds,dim=1,keepdim=True) - - # Utterance exclusive centroids - # Equal to average of utterance embeddings for the speaker, excluding ith utterance - # Used for pos samples (utterance comparing to true speaker; speaker centroid exludes the utterance) - # Equation 8 in paper - # size: (speakers, utterances, embedding size) - num_utterance = embeds.shape[1] - utter_ex_centroid = (torch.sum(embeds,dim=1,keepdim=True) - embeds) / (num_utterance-1) - - if debug: - print("e",embeds.shape) - print(embeds) - print("sc",speaker_centroid.shape) - print(speaker_centroid) - print("uc",utter_ex_centroid.shape) - print(utter_ex_centroid) - - # Create pos and neg masks - num_speaker = embeds.shape[0] - i = torch.eye(num_speaker, dtype=torch.int) - pos_mask = torch.where(i) - neg_mask = torch.where(1-i) - - if debug: - print("pm",len(pos_mask),len(pos_mask[0])) - print(pos_mask) - print("nm",len(neg_mask),len(neg_mask[0])) - print(neg_mask) - - # Compile similarity matrix - # size: (speakers, utterances, speakers) - # initial size is (speakers, speakers, utterances for easier vectorization) - sim_matrix = torch.zeros(num_speaker, num_speaker, num_utterance).to(self.loss_device) - sim_matrix[pos_mask] = nn.functional.cosine_similarity(embeds,utter_ex_centroid,dim=2) - sim_matrix[neg_mask] = nn.functional.cosine_similarity(embeds[neg_mask[0]],speaker_centroid[neg_mask[1]],dim=2) - if debug: - print("sm",sim_matrix.shape) - print("pos vals",sim_matrix[pos_mask]) - print("neg vals",sim_matrix[neg_mask]) - print(sim_matrix) - - sim_matrix = sim_matrix.permute(0,2,1) - - if debug: - print("sm",sim_matrix.shape) - print(sim_matrix) - print("cos sim weight", self.sim_weight) - print("cos sim bias", self.sim_bias) - - # Apply weight / bias - sim_matrix = sim_matrix * self.sim_weight + self.sim_bias - return sim_matrix - - def softmax_loss(self, embeds): - """ - computes softmax loss as defined by equ 6 in the GE2E paper - :param embeds: shape (speakers, utterances, embedding size) - :return: computed softmax loss - """ - # per the GE2E paper, softmax loss as defined by equ 6 - # performs slightly better over Text-Independent Speaker - # Verification tasks. - # ref section 2.1 of the GE2E paper - speaker_count = embeds.shape[0] - - # speaker, utterance, speaker - similarities = self.similarity_matrix(embeds) - - # equ 6 - loss_matrix = -similarities[torch.arange(0, speaker_count), :, torch.arange(0, speaker_count)] + \ - torch.log(torch.sum(torch.exp(similarities), dim=2)) - - # equ 10 - return torch.sum(loss_matrix) - - def contrast_loss(self, embeds): - """ - computes contrast loss as defined by equ 7 in the GE2E paper - :param embeds: shape (speakers, utterances, embedding size) - :return: computed softmax loss - """ - # per the GE2E paper, contrast loss as defined by equ 7 - # performs slightly better over Text-Dependent Speaker - # Verification tasks. - # ref section 2.1 of the GE2E paper - speaker_count, utterance_count = embeds.shape[0:2] - - # speaker, utterance, speaker - similarities = self.similarity_matrix(embeds) - - # Janky indexing to resolve k != j - mask = torch.ones(similarities.shape, dtype=torch.bool) - mask[torch.arange(speaker_count), :, torch.arange(speaker_count)] = False - closest_neighbors, _ = torch.max(similarities[mask].reshape(speaker_count, utterance_count, speaker_count - 1), dim=2) - - # Positive influence over matching embeddings - matching_embedding = similarities[torch.arange(0, speaker_count), :, torch.arange(0, speaker_count)] - - # equ 7 - loss_matrix = 1 - torch.sigmoid(matching_embedding) + torch.sigmoid(closest_neighbors) - - # equ 10 - return torch.sum(loss_matrix) - - def accuracy(self, embeds): - """ - computes argmax accuracy - :param embeds: shape (speakers, utterances, speakers) - :return: accuracy - """ - num_speaker, num_utter = embeds.shape[:2] - - similarities = self.similarity_matrix(embeds) - preds = torch.argmax(similarities, dim=2) - preds_one_hot = torch.nn.functional.one_hot(preds,num_classes = num_speaker) - - actual = torch.arange(num_speaker).unsqueeze(1).repeat(1,num_utter) - actual_one_hot = torch.nn.functional.one_hot(actual,num_classes=num_speaker) - - return torch.sum(preds_one_hot * actual_one_hot)/(num_speaker*num_utter) - - - - - - diff --git a/speaker/preprocess.py b/speaker/preprocess.py deleted file mode 100644 index e832afb3e40e7f17986f22858804b07de2070fc4..0000000000000000000000000000000000000000 --- a/speaker/preprocess.py +++ /dev/null @@ -1 +0,0 @@ -# Reference https://github.com/CorentinJ/Real-Time-Voice-Cloning/blob/0713f860a3dd41afb56e83cff84dbdf589d5e11a/encoder/preprocess.py#L16 \ No newline at end of file diff --git a/speaker/saved_model.pt b/speaker/saved_model.pt deleted file mode 100644 index 190dc8b2d33332fbcc4cdf137aed68cdb654f903..0000000000000000000000000000000000000000 --- a/speaker/saved_model.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ccc0abcd0fb77104be73e6675454a06e7797bf1d4a1177181c32b648e9d75a9 -size 5697243 diff --git a/speaker/saved_model_e175.pt b/speaker/saved_model_e175.pt deleted file mode 100644 index 8e736f6fda1845a64263d5077c4302af3f2a2c10..0000000000000000000000000000000000000000 --- a/speaker/saved_model_e175.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52ba80266b9f45fc3d825942aae40858eeaaa73994ba86e9ed017a533dc13323 -size 5861083 diff --git a/speaker/saved_models/dog.txt b/speaker/saved_models/dog.txt deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/speaker/saved_models/saved_model_e175.pt b/speaker/saved_models/saved_model_e175.pt deleted file mode 100644 index 8e736f6fda1845a64263d5077c4302af3f2a2c10..0000000000000000000000000000000000000000 --- a/speaker/saved_models/saved_model_e175.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52ba80266b9f45fc3d825942aae40858eeaaa73994ba86e9ed017a533dc13323 -size 5861083 diff --git a/speaker/saved_models/saved_model_e273_LargeBatch.pt b/speaker/saved_models/saved_model_e273_LargeBatch.pt deleted file mode 100644 index 11cadd34b6b7c8856596e28090f6f942a9973a7f..0000000000000000000000000000000000000000 --- a/speaker/saved_models/saved_model_e273_LargeBatch.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbaaaa28a7d58b1316f322e1f33a5a68c00046b7b89a823ae7d987a632b8c7d6 -size 5861083 diff --git a/speaker/saved_models/saved_model_e300.pt b/speaker/saved_models/saved_model_e300.pt deleted file mode 100644 index 8afe98c9e86b054ea8b521b56bf0920a0b55567c..0000000000000000000000000000000000000000 --- a/speaker/saved_models/saved_model_e300.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9be127fb61b6d2306ff877ab2184f187450953a5555a6751b3616b5ed84e78a -size 5698805 diff --git a/speaker/speakers.txt b/speaker/speakers.txt deleted file mode 100644 index 6353474a4ab021393100cade62580b77207b0fab..0000000000000000000000000000000000000000 --- a/speaker/speakers.txt +++ /dev/null @@ -1,2497 +0,0 @@ -; Taken from the LibriSpeech data set... -; Some pipe(|) separated metadata about all LibriVox readers, whose work was used -; in the corpus. -; -; The meaning of the fields in left-to-right order is as follows: -; -; reader_id: the ID of the reader in the LibriVox's database -; gender: 'F' for female, 'M' for male -; subset: the corpus subset to which the reader's audio is assigned -; duration: total number of minutes of speech by the reader, included in the corpus -; name: the name under which the reader is registered in LibriVox -; -;ID |SEX| SUBSET |MINUTES| NAME -14 | F | train-clean-360 | 25.03 | Kristin LeMoine -16 | F | train-clean-360 | 25.11 | Alys AtteWater -17 | M | train-clean-360 | 25.04 | Gord Mackenzie -19 | F | train-clean-100 | 25.19 | Kara Shallenberg -20 | F | train-other-500 | 30.07 | Gesine -22 | F | train-clean-360 | 25.14 | Michelle Crandall -23 | F | train-clean-360 | 25.23 | Anita Roy Dobbs -25 | M | train-other-500 | 30.16 | John Gonzalez -26 | M | train-clean-100 | 25.08 | Denny Sayers -27 | M | train-clean-100 | 20.14 | Sean McKinley -28 | F | train-clean-360 | 25.03 | Kristin Hughes -29 | M | train-other-500 | 30.10 | Linton -30 | F | train-clean-360 | 25.19 | Annie Coleman Rothenberg -31 | M | train-other-500 | 23.79 | Martin Clifton -32 | F | train-clean-100 | 24.01 | Betsie Bush -36 | M | train-other-500 | 25.85 | Chip -37 | M | train-other-500 | 30.04 | wolvrin -38 | M | train-clean-360 | 25.11 | R. Francis Smith -39 | F | train-clean-100 | 25.05 | Sherry Crowther -40 | F | train-clean-100 | 25.04 | Vicki Barbour -44 | F | train-other-500 | 25.90 | travelbratd -45 | F | train-other-500 | 8.85 | Kelly Bescherer -46 | M | train-other-500 | 30.02 | Aaron Hochwimmer -47 | F | train-other-500 | 30.09 | Amanda -49 | M | train-other-500 | 28.62 | vrk74 -51 | M | train-other-500 | 24.13 | rakkar -52 | F | train-other-500 | 10.99 | Luisa Hall -54 | F | train-clean-360 | 25.07 | Westwinds12 -55 | M | train-clean-360 | 25.21 | David Jaquay -56 | F | train-clean-360 | 25.07 | Kirsten Ferreri -57 | F | train-other-500 | 29.41 | Ophelia Darcy -58 | M | train-other-500 | 30.06 | George Coutts -60 | M | train-clean-100 | 20.18 | |CBW|Simon -61 | M | test-clean | 8.08 | Paul-Gabriel Wiener -62 | M | train-other-500 | 17.80 | Faris -64 | F | train-clean-360 | 23.51 | Robin Cotter -65 | F | train-other-500 | 27.32 | chriss the girl -66 | M | train-other-500 | 30.22 | Alex Foster -70 | M | train-clean-360 | 21.61 | Kurt Copeland -75 | M | train-other-500 | 30.10 | Jim Mowatt -77 | F | train-other-500 | 30.10 | JemmaBlythe -78 | M | train-clean-100 | 25.05 | Hugh McGuire -79 | F | train-clean-360 | 25.01 | Jennifer Crispin -81 | M | train-clean-360 | 25.22 | Aaron Decker -82 | F | train-other-500 | 30.15 | Marlo Dianne -83 | F | train-clean-100 | 25.04 | Catharine Eastman -84 | F | dev-clean | 8.02 | Christie Nowak -85 | M | train-other-500 | 30.02 | David Leaman -87 | F | train-clean-100 | 25.10 | Rosalind Wills -89 | F | train-clean-100 | 25.08 | Kristen McQuillin -90 | M | train-clean-360 | 25.17 | Dan Threetrees -91 | M | train-other-500 | 30.05 | Stephan Mobius -92 | F | train-other-500 | 26.78 | Cori Samuel -93 | F | train-clean-360 | 25.02 | Kathy -94 | M | train-other-500 | 30.11 | David Barnes -98 | F | train-clean-360 | 25.03 | Patricia Oakley -100 | F | train-clean-360 | 25.06 | Judy Bieber -101 | M | train-clean-360 | 25.04 | paulino -102 | F | train-other-500 | 30.18 | Linda Leu -103 | F | train-clean-100 | 23.72 | Karen Savage -104 | F | train-other-500 | 30.21 | Laura M.D. -107 | M | train-other-500 | 18.64 | John Greenman -110 | F | train-other-500 | 30.07 | Cynthia Lyons (1946-2011) -111 | F | train-other-500 | 22.36 | Linda Wilcox -112 | F | train-clean-360 | 25.23 | Christiane Levesque -114 | F | train-clean-360 | 25.03 | Jen Kidd -115 | F | train-clean-360 | 25.02 | Maddie -116 | M | dev-other | 10.02 | Steven Collins -118 | M | train-clean-100 | 25.05 | Alex Buie -119 | M | train-clean-360 | 25.11 | Alex Patterson -121 | F | test-clean | 8.01 | Nikolle Doolin -122 | M | train-clean-360 | 25.15 | J.C. -123 | F | train-other-500 | 30.01 | Ezwa -125 | F | train-clean-100 | 25.18 | Claire Goget -126 | F | train-clean-360 | 25.15 | Susan Denney -127 | M | train-other-500 | 29.49 | John Hicken -128 | M | train-other-500 | 25.63 | ML Cohen -133 | M | train-other-500 | 13.89 | Mick -147 | M | train-other-500 | 10.79 | Thomas Hoover -149 | M | train-other-500 | 17.69 | Joshua Young -150 | F | train-clean-100 | 25.13 | Fox in the Stars -151 | F | train-other-500 | 10.54 | Gwen -152 | M | train-other-500 | 28.67 | Andy Minter -153 | M | train-other-500 | 30.16 | Graham Williams -154 | M | train-clean-360 | 25.13 | Robert Foster -157 | M | train-clean-360 | 22.96 | Ben Douglas -159 | M | train-clean-360 | 25.03 | hugh mac -161 | M | train-other-500 | 30.09 | Cyril Law, Jr. -163 | M | train-clean-100 | 25.06 | Andrew Miller -166 | F | train-clean-360 | 25.16 | Paula Berinstein -167 | M | train-other-500 | 21.75 | Peter Yearsley -168 | M | train-other-500 | 28.32 | Chris Goringe -173 | F | train-other-500 | 11.25 | vlooi -174 | M | dev-clean | 8.04 | Peter Eastman -175 | F | train-clean-360 | 25.03 | Meredith Hughes -176 | M | train-clean-360 | 25.20 | Vinny Bove -177 | F | train-other-500 | 26.69 | Kymm Zuckert -188 | F | train-clean-360 | 25.26 | Mary Anderson -192 | F | train-clean-360 | 25.19 | Deborah Clark -196 | M | train-clean-100 | 25.24 | Stewart Wills -198 | F | train-clean-100 | 25.02 | Heather Barnett -199 | F | train-other-500 | 7.08 | Maria Morabe -200 | F | train-clean-100 | 25.14 | Maureen S. O'Brien -201 | M | train-clean-100 | 25.19 | Joplin James -202 | F | train-other-500 | 30.04 | Geetu Melwani -203 | F | train-clean-360 | 25.01 | Marian Brown -204 | M | train-clean-360 | 25.18 | Mark F. Smith -205 | F | train-clean-360 | 25.07 | Esther -207 | M | train-clean-360 | 25.00 | Kevin McAsh -208 | F | train-clean-360 | 13.28 | Andrea L -209 | F | train-clean-360 | 25.08 | Moira Fogarty -210 | M | train-clean-360 | 25.12 | Aldark -211 | F | train-clean-100 | 25.22 | shanda_w -215 | F | train-other-500 | 29.09 | Alice Elizabeth Still -216 | M | train-clean-360 | 25.08 | Thomas Davoren -217 | F | train-clean-360 | 17.71 | firefly -218 | M | train-other-500 | 14.46 | Kelly Clear -224 | F | train-clean-360 | 25.20 | Caitlin Kelly -225 | F | train-clean-360 | 25.17 | Brenda Dayne -226 | F | train-clean-100 | 25.21 | Deb Bacon-Ziegler -227 | F | train-clean-360 | 25.16 | Sarah Key-DeLyria -228 | F | train-other-500 | 28.84 | Arctura -229 | M | train-clean-100 | 19.56 | carnright -231 | M | train-clean-360 | 22.19 | Sean McGaughey -233 | M | train-clean-100 | 24.72 | Steve Karafit -237 | F | test-clean | 8.02 | rachelellen -238 | F | train-other-500 | 10.11 | Maria Elmvang -240 | M | train-clean-360 | 25.06 | Shurtagal -242 | F | train-clean-360 | 25.12 | Cagirlwithasoutherndrawl -243 | F | train-other-500 | 30.04 | Jennifer Stearns -245 | M | train-other-500 | 30.25 | Peter of Buckinghamshire England -246 | F | train-clean-360 | 22.43 | Beth Dudek -248 | F | train-clean-100 | 25.13 | Becky Miller -249 | M | train-clean-360 | 18.69 | pww214 -250 | F | train-clean-100 | 25.16 | Mary Reagan -251 | M | dev-clean | 8.04 | Mark Nelson -252 | M | train-other-500 | 30.26 | Rainer -253 | M | train-other-500 | 27.43 | Stefan Schmelz -254 | M | train-clean-100 | 25.06 | Alan Davis Drake (1945-2010) -255 | M | train-other-500 | 30.10 | Chris Hawk -258 | M | train-clean-360 | 24.53 | Kurt Wong -260 | M | test-clean | 8.05 | Brad Bush -263 | M | train-other-500 | 16.03 | Michael Sirois -264 | M | train-other-500 | 22.55 | Chris Hughes -265 | M | train-other-500 | 10.38 | Janice -272 | M | train-clean-360 | 16.45 | Mr. Baby Man -273 | M | train-other-500 | 30.02 | Jim Cadwell -274 | F | train-clean-360 | 25.18 | Eileen George -277 | F | train-other-500 | 25.72 | Alessia -278 | F | train-clean-360 | 22.05 | AliceG -283 | M | train-other-500 | 15.42 | Asaf Bartov -288 | F | train-clean-360 | 25.13 | Bookworm -289 | F | train-clean-100 | 19.64 | Barbara Wedge -294 | F | train-other-500 | 20.51 | Calliope -296 | M | train-clean-360 | 25.16 | Carl Manchester -298 | F | train-clean-100 | 25.00 | Caroline Morse -302 | F | train-clean-100 | 25.04 | Chris Peterson -303 | M | train-clean-360 | 25.03 | Tony Hightower -307 | M | train-clean-100 | 25.11 | Randy Phillips -310 | F | train-other-500 | 25.15 | Dexnell Peters -311 | M | train-clean-100 | 25.17 | deadwhitemales -313 | F | train-other-500 | 30.03 | Dilini Jayasinghe -317 | M | train-other-500 | 28.14 | Mike Gardom -318 | F | train-clean-360 | 25.17 | Eileen aka e -319 | M | train-other-500 | 30.07 | Ed Good -322 | F | train-clean-100 | 25.20 | Elisabeth Shields -323 | F | train-clean-360 | 14.36 | Erica Kuntz -328 | F | train-clean-100 | 19.35 | Elizabeth Palmer -329 | M | train-clean-360 | 25.09 | Todd Cranston-Cuebas -331 | M | train-other-500 | 30.12 | Richard Grove -332 | M | train-clean-100 | 19.00 | Aaron Teiser -335 | M | train-clean-360 | 25.08 | Paul Harvey -336 | M | train-other-500 | 21.97 | Harvey Chinn -337 | F | train-clean-360 | 25.15 | Barbara Harvey -339 | F | train-clean-360 | 25.07 | Heather Ordover -340 | M | train-clean-360 | 25.17 | Scott Henkel -345 | M | train-clean-360 | 25.19 | Micah Sheppard -348 | M | train-other-500 | 30.02 | ianish -353 | M | train-clean-360 | 20.10 | Jamey Osborne -359 | M | train-clean-360 | 25.08 | John Nicholson -362 | F | train-clean-360 | 25.07 | Judith Brown -365 | M | train-other-500 | 30.01 | Jon Ingram -366 | F | train-other-500 | 30.12 | Katy Preston -367 | F | test-other | 6.74 | Kathleen Dang -369 | M | train-clean-360 | 19.56 | Kevin Readdean -373 | F | train-clean-360 | 25.18 | Kim Braun -374 | M | train-clean-100 | 25.16 | kumarei -377 | M | train-other-500 | 21.39 | Lenny Glionna Jr. -380 | F | train-clean-360 | 25.15 | Laurie Campbell -392 | F | train-other-500 | 23.64 | Maria Celano -398 | M | train-clean-360 | 23.56 | James Smith -402 | F | train-other-500 | 30.19 | Sharmini Kumar -403 | F | train-clean-100 | 25.14 | Nocturna -404 | F | train-other-500 | 24.68 | Nomenphile -405 | M | train-clean-100 | 25.04 | Eric Dennison -408 | F | train-clean-360 | 25.17 | Claudine Chen -409 | M | train-clean-360 | 25.13 | Mike Kauffmann -412 | M | train-clean-100 | 22.38 | Brian Roberg -413 | M | train-other-500 | 19.72 | Daniel Watkins -421 | M | train-other-500 | 29.09 | Patrick -422 | M | dev-clean | 8.38 | President Lethe -426 | F | train-clean-100 | 25.21 | Norah Piehl -428 | M | train-other-500 | 27.22 | Rayburn Beale -432 | M | train-other-500 | 30.10 | Steve Andersen -434 | F | train-clean-360 | 25.09 | Joyce Nussbaum -439 | M | train-clean-360 | 25.16 | Robert Garrison -441 | F | train-clean-100 | 25.19 | Sandra in Wales, United Kingdom -444 | F | train-other-500 | 28.32 | Sage Tyrtle -445 | M | train-clean-100 | 11.08 | Dave Foss -446 | M | train-clean-100 | 25.00 | Steve Hartzog -448 | F | train-other-500 | 23.84 | scrappylibrarian -451 | F | train-clean-360 | 22.93 | Sonserae Leese-Calver -453 | M | train-other-500 | 22.78 | Glen Hallstrom -454 | M | train-clean-360 | 25.20 | Tom Yates -458 | M | train-clean-100 | 17.30 | Scott Splavec -459 | M | train-clean-360 | 25.05 | Mark Bradford -460 | M | train-clean-100 | 25.23 | Dave Ranson -464 | M | train-clean-360 | 18.24 | Mike Wilson -466 | F | train-other-500 | 30.21 | Joy Chan -470 | M | train-other-500 | 30.06 | Chris Chapman -472 | F | train-clean-360 | 25.02 | Tina Tilney -474 | M | train-other-500 | 29.00 | Zachary Brewster-Geisz -475 | M | train-clean-360 | 23.95 | Jason X. -476 | M | train-clean-360 | 25.08 | Chuck Spann -479 | F | train-clean-360 | 25.00 | wedschild -480 | M | train-clean-360 | 25.13 | Chris Vee -481 | M | train-clean-100 | 25.08 | Neal Foley -483 | F | train-other-500 | 26.75 | junk science -487 | M | train-clean-360 | 17.12 | Clayton J. Smith -489 | F | train-other-500 | 26.53 | Tora -492 | M | train-clean-360 | 25.19 | TBOL3 -497 | M | train-clean-360 | 25.00 | audiotoshokan -500 | M | train-clean-360 | 25.04 | galaxiant -501 | M | train-clean-360 | 25.06 | mikenkat -505 | M | train-other-500 | 29.49 | Menno -510 | M | train-clean-360 | 25.07 | Kirk Thomas -511 | M | train-clean-360 | 25.23 | Matthew Shepherd -512 | M | train-clean-360 | 25.12 | Anthony Craine -517 | M | train-other-500 | 23.59 | Matthew Walton -525 | F | train-clean-360 | 25.03 | Victoria Long -533 | F | test-other | 10.05 | Ana Simao -534 | F | train-clean-360 | 25.01 | Jean O'Sullivan -542 | M | train-other-500 | 29.87 | J. Hall -543 | M | train-clean-360 | 25.10 | Ted Delorme -544 | M | train-other-500 | 25.89 | bozgeez -548 | M | train-clean-360 | 25.14 | Chris Mitchell -549 | F | train-clean-360 | 18.99 | SarahHadley -551 | M | train-other-500 | 30.20 | Guntar -557 | M | train-other-500 | 30.07 | fieldsofgold -559 | M | train-clean-360 | 25.16 | Bill Stackpole -561 | M | train-clean-360 | 24.78 | Quentin -567 | M | train-other-500 | 6.49 | Aaron Benedict -568 | M | train-other-500 | 30.21 | JD Weber -569 | M | train-other-500 | 8.36 | Frank -572 | M | train-other-500 | 29.18 | Rebecca Dittman -576 | F | train-clean-360 | 20.69 | Caroline Mercier -580 | M | train-clean-360 | 25.22 | Ryan -581 | M | train-clean-360 | 25.20 | C. Berrius -583 | M | train-clean-360 | 24.67 | Russ Maxwell -584 | F | train-other-500 | 30.10 | miette -585 | F | train-other-500 | 30.05 | pheo -587 | F | train-clean-100 | 25.20 | Joy Scaglione -589 | F | train-clean-360 | 25.01 | Stephanie Konig -593 | M | train-clean-360 | 24.55 | Eric S. Piotrowski -594 | M | train-clean-360 | 25.12 | KentF -596 | F | train-clean-360 | 25.00 | Carol Goode -597 | F | train-clean-360 | 25.25 | Lisa Chau -598 | F | train-clean-360 | 25.02 | Kim -606 | M | train-clean-360 | 25.02 | Julian Jamison -608 | F | train-other-500 | 30.09 | Baranduin -612 | F | train-clean-360 | 21.70 | Cindy Steib -613 | M | train-other-500 | 29.85 | D.E. Wittkower -614 | F | train-other-500 | 27.57 | Christine Blachford -622 | M | train-other-500 | 23.15 | Andrew Lebrun -625 | M | train-clean-100 | 25.01 | toriasuncle -636 | F | train-clean-360 | 25.03 | Zale Schafer (Rose May Chamberlin Memorial Foundat -637 | M | train-clean-360 | 25.11 | Michael Scherer -639 | M | train-clean-360 | 25.10 | Robert Beach -644 | M | train-other-500 | 30.17 | Daniele -652 | M | dev-clean | 8.31 | Scott Walter -663 | M | train-clean-360 | 25.10 | Bruce Stafford -664 | F | train-clean-360 | 25.20 | Wendy G. -666 | F | train-clean-360 | 24.58 | Monique -667 | F | train-clean-360 | 25.04 | Bethany Simpson -669 | F | train-clean-100 | 25.17 | Anne -671 | M | train-clean-360 | 24.11 | koijmonop -672 | M | test-clean | 8.27 | Taylor Burton-Edward -679 | M | train-other-500 | 13.04 | rhodian -681 | F | train-other-500 | 30.01 | Lucy Burgoyne -684 | F | train-other-500 | 30.04 | Lizzie Driver -688 | F | train-clean-360 | 25.19 | J. M. Smallheer -690 | F | train-other-500 | 22.10 | Silver -696 | F | train-clean-100 | 25.11 | Tamara R. Schwartz -698 | F | train-clean-360 | 25.03 | Randi Warwick -699 | F | train-clean-360 | 25.06 | Diana Kiesners -700 | F | dev-other | 10.01 | Susan Hooks -705 | F | train-other-500 | 30.09 | eva -707 | M | train-clean-360 | 24.76 | Jason Mayoff -708 | M | train-clean-360 | 21.01 | Kevin Devine -711 | M | train-clean-360 | 25.13 | Roy Schreiber -712 | M | train-other-500 | 28.91 | Michael Shook -713 | F | train-other-500 | 25.71 | Onjana Yawnghwe -716 | M | train-clean-360 | 22.52 | martyd -718 | M | train-clean-360 | 25.08 | clarknova -720 | M | train-other-500 | 30.09 | Peter Gallagher -724 | M | train-clean-360 | 25.08 | Michael Crowl -726 | M | train-other-500 | 30.19 | Paul -727 | M | train-other-500 | 27.18 | Andrew Richards -728 | M | train-other-500 | 30.21 | Eric Connover -730 | F | train-clean-100 | 25.19 | Karen Labenz -731 | F | train-clean-360 | 25.14 | Megan-Jane Daniels Suyasu -737 | M | train-other-500 | 24.83 | Roger W. Barnett -742 | M | train-other-500 | 18.38 | Peter Groom -753 | M | train-other-500 | 26.92 | Tim Bulkeley -764 | M | train-clean-360 | 25.08 | Carl Vonnoh, III -766 | M | train-other-500 | 24.41 | Jean Crevier -770 | M | train-clean-360 | 25.00 | Justin S Barrett -774 | F | train-other-500 | 8.75 | Sara Walsh -777 | M | dev-clean | 8.06 | fling93 -778 | M | train-other-500 | 30.17 | Branko Collin -779 | M | train-other-500 | 30.09 | Greg -780 | M | train-other-500 | 24.65 | Lloyd Davis -781 | M | train-clean-360 | 25.12 | Mitchell Dwyer -782 | F | train-other-500 | 30.18 | Michele Pacey -783 | F | train-clean-360 | 23.98 | Gina -789 | F | train-other-500 | 17.71 | Eva -791 | M | train-other-500 | 27.56 | Ivan -792 | F | train-other-500 | 19.73 | mjd-s -797 | M | train-other-500 | 13.94 | Mike Shapiro -803 | M | train-clean-360 | 25.02 | Greg Elmensdorp -806 | M | train-clean-360 | 22.41 | Aaron Andradne -807 | M | train-other-500 | 25.31 | Luke Venediger -810 | M | train-other-500 | 21.54 | Joseph Loverti -811 | F | train-other-500 | 25.09 | Elizabeth -815 | M | train-clean-360 | 16.20 | mawrtea -816 | M | train-clean-360 | 23.23 | Jeff Robinson -820 | M | train-clean-360 | 24.64 | Scoot -826 | M | train-other-500 | 18.49 | Thomas Wells -829 | F | train-clean-360 | 25.14 | frenchfry -830 | F | train-clean-360 | 22.26 | sebrazer -831 | M | train-clean-100 | 25.22 | Nick Gallant -834 | F | train-clean-360 | 25.14 | nausicaa -835 | M | train-clean-360 | 18.61 | echo -836 | M | train-clean-360 | 25.01 | Kevin LaVergne -839 | M | train-clean-100 | 19.95 | rovert405 -844 | F | train-other-500 | 27.30 | Martina -845 | M | train-other-500 | 11.71 | DaveF -846 | M | train-other-500 | 30.12 | Anadaxis_Canejia -850 | M | train-clean-360 | 22.03 | tonypettit -851 | M | train-other-500 | 9.02 | brenthumphries -868 | M | train-clean-360 | 25.07 | Mike Rosenlof -876 | F | train-other-500 | 22.85 | Alisha -882 | F | train-clean-360 | 24.14 | Mur Lafferty -884 | M | train-other-500 | 17.23 | sayeth -886 | M | train-other-500 | 24.31 | Paul S. Jenkins -887 | F | train-clean-100 | 25.11 | Lana Taylor -895 | M | train-other-500 | 15.01 | Max Porter Zasada -899 | M | train-clean-360 | 25.09 | thomahal -908 | M | test-clean | 8.05 | Sam Stinson -909 | M | train-clean-100 | 25.00 | Greg Bryant -911 | M | train-clean-100 | 23.83 | frankjf -915 | M | train-other-500 | 21.21 | Ted Kaouk -920 | F | train-clean-360 | 21.36 | Sarah Bean -921 | M | train-other-500 | 29.10 | Brian J. Callaghan -922 | M | train-clean-360 | 25.07 | Steven H. Wilson -923 | F | train-other-500 | 21.33 | Layna -925 | F | train-clean-360 | 25.22 | pattymarie -927 | M | train-other-500 | 26.13 | Nerijus -937 | F | train-other-500 | 30.14 | Susie G. -948 | F | train-clean-360 | 25.13 | Chere Theriot -949 | M | train-clean-360 | 25.08 | ontheroad -951 | F | train-other-500 | 30.04 | thomasina -953 | M | train-clean-360 | 20.76 | Jim Mullins -954 | M | train-clean-360 | 14.44 | Brooks Seveer -956 | F | train-other-500 | 23.96 | krithiga -957 | M | train-clean-360 | 25.06 | iscatel -960 | F | train-other-500 | 27.55 | Marloes Schoonheim -964 | M | train-other-500 | 17.09 | Paul Sze -968 | F | train-clean-360 | 24.49 | Pat Elder -969 | M | train-other-500 | 30.10 | Czechchris -976 | F | train-other-500 | 30.11 | Alison Raouf -978 | M | train-other-500 | 27.56 | Rick Box -979 | F | train-clean-360 | 5.59 | Kelli Robinson -982 | M | train-other-500 | 22.28 | Mike Roop -984 | M | train-clean-360 | 23.39 | J A Carter -985 | M | train-other-500 | 30.05 | George Pilling -986 | M | train-clean-360 | 15.96 | Michael Kirkpatrick -1001 | M | train-clean-360 | 25.25 | Eric -1006 | F | train-other-500 | 30.00 | Marta Kornowska -1012 | F | train-clean-360 | 21.38 | Lizzie Oldfather -1018 | M | train-clean-360 | 25.07 | JimmyLogan -1025 | M | train-clean-360 | 22.99 | rdmagpie -1027 | M | train-clean-360 | 25.09 | Brooks Jensen -1028 | M | train-clean-360 | 25.03 | Tim Lundeen -1031 | F | train-clean-360 | 23.73 | swroot -1034 | M | train-clean-100 | 16.71 | Kevin O'Coin -1040 | M | train-clean-100 | 15.70 | John Garvin -1046 | M | train-clean-360 | 24.65 | durnburr -1049 | M | train-other-500 | 14.93 | Sam Fold -1050 | F | train-clean-360 | 25.04 | entada -1051 | F | train-other-500 | 28.33 | E. Moulton -1052 | F | train-clean-360 | 25.13 | Kathy Jacobs -1053 | F | train-clean-360 | 25.04 | katyleah -1054 | F | train-clean-360 | 24.80 | Igor Teaforay -1058 | M | train-clean-360 | 25.10 | James Tiley -1060 | F | train-clean-360 | 20.07 | Val Grimm -1061 | F | train-clean-360 | 25.14 | Missie -1065 | M | train-other-500 | 30.18 | Justin Brett -1066 | F | train-clean-360 | 25.20 | Laurie Anne Walden -1069 | F | train-clean-100 | 25.15 | Dawn -1079 | F | train-clean-360 | 21.26 | Mary aka Breadchick -1081 | M | train-clean-100 | 25.18 | Fracture -1084 | F | train-other-500 | 29.12 | Nichole Karl -1085 | M | train-other-500 | 30.24 | hefyd -1088 | F | train-clean-100 | 25.18 | Christabel -1089 | M | test-clean | 8.05 | Peter Bobbe -1092 | F | train-other-500 | 30.17 | Maria -1093 | F | train-clean-360 | 25.11 | Kiki Baessell -1094 | M | train-other-500 | 30.03 | tubeyes -1096 | M | train-other-500 | 26.95 | Geoff Dugwyler -1097 | M | train-other-500 | 30.18 | Euthymius -1098 | F | train-clean-100 | 18.31 | Merryb -1100 | F | train-clean-360 | 23.87 | Danielle Flores -1107 | M | train-other-500 | 30.10 | Jason Oakley -1110 | M | train-other-500 | 24.85 | Graeme Jolliffe -1112 | M | train-clean-360 | 25.15 | RedToby -1116 | F | train-clean-100 | 25.12 | Megan Stemm-Wade -1121 | M | train-clean-360 | 25.12 | John Lieder -1124 | F | train-other-500 | 30.03 | Ancilla -1132 | M | train-other-500 | 30.04 | Giles Baker -1152 | F | train-other-500 | 28.04 | Millbeach -1154 | F | train-other-500 | 30.12 | Larysa Jaworski -1160 | M | train-clean-360 | 25.20 | Gary Gilberd -1161 | M | train-other-500 | 21.87 | Dominic Moore -1165 | M | train-clean-360 | 25.13 | Bob Graff -1166 | F | train-other-500 | 21.27 | Debra Lynn -1168 | F | train-other-500 | 21.61 | Ree -1171 | F | train-other-500 | 30.01 | Julia Claussen -1175 | M | train-clean-360 | 25.02 | Brother Patrick -1179 | M | train-other-500 | 28.84 | Alan Chant -1182 | M | train-clean-360 | 25.06 | Brett Condron -1183 | F | train-clean-100 | 9.72 | roolynninms -1184 | M | train-other-500 | 28.84 | Jeremy Pavier -1187 | M | train-other-500 | 30.02 | Paul Hansen -1188 | M | test-clean | 8.20 | Duncan Murrell -1195 | F | train-clean-360 | 25.03 | Jennette Selig -1200 | M | train-other-500 | 30.04 | hosmer_angel -1212 | F | train-clean-360 | 25.07 | Lee Ann Howlett -1221 | F | test-clean | 8.07 | Dianne -1222 | M | train-clean-360 | 25.12 | Joseph Ugoretz -1224 | F | train-clean-360 | 22.11 | Heather Duncan -1225 | M | train-other-500 | 30.08 | Chris Langston -1226 | M | train-clean-360 | 25.11 | Russ Lemker -1230 | M | train-other-500 | 30.03 | Ian Skillen -1235 | M | train-clean-100 | 25.09 | Tim Gregory -1239 | M | train-other-500 | 20.69 | Scott Robbins -1241 | F | train-clean-360 | 25.12 | Catherine Fitz -1246 | F | train-clean-100 | 25.09 | Sandra -1250 | F | train-other-500 | 30.23 | Christina Boyles -1252 | F | train-other-500 | 15.47 | Avery -1255 | M | dev-other | 10.03 | Simon Evers -1258 | M | train-other-500 | 18.03 | Mellors -1259 | F | train-clean-360 | 25.12 | Elizabeth Klett -1260 | M | train-other-500 | 24.01 | Chris Hughes -1261 | M | train-other-500 | 21.04 | Mans Broo -1263 | F | train-clean-100 | 25.16 | Leonie Rose -1264 | M | train-clean-360 | 25.01 | Matthew Hinman -1265 | M | train-clean-360 | 25.18 | Edward Elmer -1266 | F | train-other-500 | 27.94 | Jenilee -1271 | M | train-clean-360 | 25.18 | Christian Pecaut -1272 | M | dev-clean | 8.02 | John Rose -1274 | M | train-other-500 | 15.99 | Larry Gilman -1280 | M | train-other-500 | 23.94 | Tim Makarios -1283 | M | train-clean-360 | 24.22 | Paul Siegel -1284 | F | test-clean | 8.16 | Daniel Anaya -1289 | F | train-clean-360 | 25.00 | Joanne Pauwels -1290 | F | train-clean-360 | 15.49 | librarianite -1291 | F | train-other-500 | 28.53 | Patti Brugman -1296 | F | train-clean-360 | 25.09 | Gigi Minden -1298 | F | train-other-500 | 30.03 | Wina Hathaway -1311 | M | train-clean-360 | 25.04 | Scott D. Farquhar -1313 | M | train-clean-360 | 25.18 | Scott Sherris -1316 | M | train-clean-360 | 25.04 | Estragon -1320 | M | test-clean | 8.02 | number6 -1322 | M | train-clean-360 | 25.17 | chris tierney -1323 | M | train-clean-360 | 25.08 | Leon Mire -1331 | M | train-other-500 | 28.73 | Adrian Praetzellis -1334 | M | train-clean-100 | 23.89 | John Schell -1335 | F | train-clean-360 | 25.08 | Clarica -1336 | M | train-clean-360 | 25.19 | Charlie Blakemore -1337 | M | train-clean-360 | 25.02 | Steven Rushing -1341 | M | train-other-500 | 28.77 | Coastalbloke -1342 | F | train-other-500 | 30.20 | SueAnn Dozier -1343 | F | train-clean-360 | 25.13 | Laura Koskinen -1347 | M | train-other-500 | 21.35 | Ted Nugent -1348 | F | train-clean-360 | 22.68 | Janet Friday -1349 | M | train-clean-360 | 25.14 | John Pruden -1353 | M | train-other-500 | 30.04 | Clarke Bell -1355 | M | train-clean-100 | 22.31 | Chris Gladis -1363 | F | train-clean-100 | 21.87 | Tammy Sanders -1365 | M | train-clean-360 | 25.19 | Joel Poortenga -1367 | M | train-other-500 | 30.12 | Joe Brenneman -1370 | F | train-other-500 | 19.78 | Lee Elliott -1373 | F | train-other-500 | 26.93 | Kira Belkin -1374 | M | train-other-500 | 17.76 | Graham Thomsen -1379 | M | train-clean-360 | 25.09 | Ken Crooker -1382 | F | train-clean-360 | 21.44 | Heather Lawrence -1383 | M | train-clean-360 | 23.92 | David Best -1384 | M | train-other-500 | 24.51 | Stephen Lamb -1387 | M | train-clean-360 | 25.05 | Scott Mather -1390 | F | train-clean-360 | 16.65 | C.L.Coney -1392 | M | train-clean-360 | 25.22 | Chris Masterson -1401 | F | train-clean-360 | 25.19 | Sibella Denton -1403 | M | train-other-500 | 17.40 | tipaew -1413 | M | train-clean-360 | 25.08 | ryanaw -1414 | F | train-other-500 | 7.83 | guava -1417 | F | train-clean-360 | 25.19 | Psuke Bariah -1421 | F | train-other-500 | 28.68 | Madame Tusk -1422 | F | train-clean-360 | 25.19 | Yazpistachio -1425 | F | train-clean-360 | 25.26 | Jeanette Ferguson -1430 | M | train-other-500 | 23.75 | Alok Karulkar -1444 | M | train-other-500 | 11.74 | Ryan Mease -1445 | M | train-clean-360 | 25.15 | Michael Yard -1446 | M | train-clean-360 | 25.01 | Michael Loftus -1447 | F | train-clean-100 | 25.18 | Luigina -1448 | F | train-clean-360 | 25.07 | marevalo -1455 | M | train-clean-100 | 25.13 | webslog -1456 | M | train-clean-360 | 25.12 | Jason Isbell -1460 | F | train-clean-360 | 25.01 | E. Plein -1462 | F | dev-clean | 8.04 | E. Tavano -1463 | F | train-clean-360 | 25.23 | Vivian Bush -1469 | M | train-other-500 | 16.96 | Fr. Richard Zeile of Detroit -1472 | F | train-clean-360 | 25.15 | Sarah Jennings -1473 | M | train-clean-360 | 25.10 | Dan Polanco -1474 | F | train-other-500 | 30.03 | Jc Guan -1482 | M | train-clean-360 | 25.00 | Joshua B. Christensen -1485 | M | train-other-500 | 24.24 | Robert Flach -1487 | M | train-clean-360 | 23.93 | radioreader -1492 | M | train-other-500 | 30.14 | mb -1494 | M | train-other-500 | 6.27 | George Deprez, PhD -1495 | M | train-other-500 | 24.44 | Glendower Jones -1498 | F | train-clean-360 | 18.38 | Lori Hebel -1502 | F | train-clean-100 | 25.05 | Ann Boyer -1505 | M | train-other-500 | 25.98 | Mark Norman -1509 | F | train-clean-360 | 25.04 | Miranda Stinson -1513 | M | train-clean-360 | 25.11 | Simon-Peter Zak -1535 | M | train-clean-360 | 22.74 | Robert Scott -1536 | M | train-clean-360 | 25.23 | Marco -1544 | F | train-other-500 | 30.18 | LilianaVale -1545 | F | train-other-500 | 9.17 | AmyAG -1547 | F | train-clean-360 | 17.45 | Riddleman -1552 | M | train-clean-360 | 15.62 | Roger Turnau -1553 | F | train-clean-100 | 22.49 | Mim Ritty -1556 | M | train-clean-360 | 25.13 | geofred -1559 | M | train-other-500 | 18.95 | Luke Harrison -1563 | F | train-other-500 | 13.26 | Chandra Gioiello -1564 | F | train-other-500 | 22.58 | Hedvig -1566 | F | train-other-500 | 27.46 | Anna Christensen -1569 | F | train-other-500 | 25.00 | Kristine Mackin -1571 | M | train-clean-360 | 25.24 | Bob Tassinari -1572 | M | train-other-500 | 30.14 | Alan Clare -1578 | F | train-clean-100 | 25.01 | Lorelle Anderson -1579 | F | train-other-500 | 30.06 | Philippa Willitts -1580 | F | test-clean | 8.07 | TinyPines -1585 | F | dev-other | 10.03 | Nelly () -1593 | F | train-other-500 | 28.90 | Kristine Bekere -1594 | M | train-clean-100 | 25.10 | Jon Scott Jones -1595 | M | train-other-500 | 30.22 | Riccardo Fasol -1601 | M | train-other-500 | 13.36 | Michael Yourshaw -1603 | M | train-clean-360 | 25.16 | Arouet -1607 | M | train-clean-360 | 24.74 | Claude Banta -1614 | M | train-other-500 | 30.11 | FNH -1618 | M | train-other-500 | 23.98 | Nicholas James Bridgewater -1621 | M | train-other-500 | 28.45 | Caliban -1624 | M | train-clean-100 | 22.03 | Daniel Shorten -1629 | F | train-clean-360 | 25.09 | Gwyneth -1630 | F | dev-other | 10.06 | spiritualbeing -1633 | F | train-other-500 | 30.09 | Beecher -1634 | M | train-clean-360 | 17.65 | daxm -1636 | F | train-other-500 | 28.48 | Sandra Zera -1638 | M | train-clean-360 | 23.25 | Kyle M. -1639 | M | train-clean-360 | 25.07 | Joe Konno -1641 | F | train-clean-360 | 16.60 | Rohanna -1643 | M | train-other-500 | 12.85 | Chris Leslie-Hynan -1645 | M | train-clean-360 | 1.92 | David Shamp -1646 | M | train-other-500 | 30.03 | Ben Cobbett -1647 | M | train-other-500 | 30.07 | Rich Meyers -1648 | F | train-other-500 | 8.01 | Accent -1649 | F | train-clean-360 | 25.04 | Kalynda -1650 | M | dev-other | 10.07 | WangHaojie -1651 | M | dev-other | 4.53 | Brendan Hodge -1653 | F | train-other-500 | 28.72 | Carmina Sansone -1664 | F | train-other-500 | 27.98 | Shauna M -1665 | F | train-other-500 | 30.11 | Jessica AC Snyder -1668 | F | train-clean-360 | 22.96 | stepheather -1673 | F | dev-clean | 8.07 | Tonia -1674 | F | train-other-500 | 30.15 | Jo -1678 | F | train-clean-360 | 25.08 | leonardswench -1679 | F | train-other-500 | 22.59 | Polly -1680 | F | train-other-500 | 18.27 | intothelight -1681 | F | train-other-500 | 28.90 | islajane -1685 | M | train-other-500 | 30.05 | Jonathan Horniblow -1686 | F | dev-other | 10.11 | neelma -1688 | M | test-other | 9.83 | winam -1690 | F | train-other-500 | 23.47 | Anne-Marie -1691 | F | train-other-500 | 25.27 | Classicsfan -1693 | F | train-other-500 | 9.41 | 4Cullen -1695 | F | train-other-500 | 23.70 | Steph -1696 | F | train-other-500 | 24.25 | Darcywil -1699 | M | train-other-500 | 29.66 | Gavin Smith -1701 | M | dev-other | 10.03 | camelot2302 -1704 | F | train-other-500 | 19.92 | JB -1705 | F | train-clean-360 | 23.78 | tittletattle -1708 | M | train-other-500 | 15.80 | Alaaious -1710 | F | train-other-500 | 12.02 | Gilly -1714 | F | train-other-500 | 16.02 | lauralee -1715 | F | train-other-500 | 24.53 | Marianna -1717 | F | train-other-500 | 14.81 | PJ -1721 | F | train-other-500 | 19.66 | Linnea -1723 | M | train-clean-100 | 25.12 | Rob Whelan -1724 | F | train-clean-360 | 25.05 | Anna Simon -1726 | F | train-other-500 | 22.71 | janeite -1731 | F | train-clean-360 | 25.06 | Dani -1733 | F | train-other-500 | 22.94 | Mira Cheskis -1734 | F | train-clean-360 | 15.86 | LuvDemBrooders -1736 | F | train-other-500 | 29.58 | LC -1737 | F | train-clean-100 | 25.04 | Erin Hastings -1740 | F | train-clean-360 | 25.22 | Shubda -1743 | M | train-clean-100 | 21.29 | Bryan Ness -1746 | M | train-other-500 | 21.36 | Theo Bacher -1748 | M | train-clean-360 | 25.16 | Brad Powers -1750 | F | train-other-500 | 30.09 | Lorie Heinrichs -1752 | F | train-clean-360 | 22.90 | Jan MacGillivray -1754 | F | train-clean-360 | 25.08 | Joan Freeman -1756 | F | train-other-500 | 30.02 | Tamara Hamilton -1757 | F | train-other-500 | 30.12 | cricket -1760 | F | train-other-500 | 29.06 | Matthew Howell -1765 | F | train-other-500 | 22.66 | Kelly Elizabeth -1767 | F | train-other-500 | 26.17 | Cori Dean -1769 | M | train-clean-360 | 25.21 | ej -1772 | M | train-other-500 | 30.11 | David A. Stokely -1773 | F | train-other-500 | 30.05 | Eliza Horne -1776 | M | train-clean-360 | 25.17 | Jim Eastman -1777 | M | train-clean-360 | 25.14 | Professor Chronotis -1779 | F | train-clean-360 | 18.05 | Cynthia Zocca -1780 | M | train-other-500 | 18.02 | Micah -1784 | F | train-other-500 | 21.61 | grovejade -1789 | M | train-clean-360 | 25.01 | Vin Reilly -1795 | M | train-other-500 | 17.33 | Muhammad Mussnoon -1800 | F | train-clean-360 | 25.14 | Scarlett! -1801 | M | train-clean-360 | 16.59 | Antonio -1804 | F | train-other-500 | 30.12 | Marie Manis -1806 | M | train-clean-360 | 25.05 | Gary W. Sherwin -1809 | F | train-other-500 | 23.28 | cucciasv -1811 | M | train-clean-360 | 20.41 | Eric Ray -1813 | F | train-other-500 | 16.81 | tesoro007 -1815 | M | train-other-500 | 27.79 | Aringguth -1819 | F | train-other-500 | 28.09 | Shannon -1825 | F | train-clean-360 | 25.00 | srshel -1826 | M | train-clean-360 | 25.18 | Jacob Miller -1827 | M | train-clean-360 | 10.55 | Doug Wetzel -1828 | M | train-other-500 | 28.27 | James Gladwin -1841 | F | train-clean-100 | 25.13 | Laura Caldwell -1844 | M | train-other-500 | 23.49 | noonday -1845 | F | train-clean-360 | 25.15 | Katie Gibboney -1846 | M | train-other-500 | 30.02 | valikojohn -1849 | M | train-clean-360 | 25.05 | Kelly Dougherty -1851 | F | train-clean-360 | 25.03 | Kehinde -1859 | F | train-clean-360 | 25.17 | Jan Baxter -1863 | F | train-other-500 | 21.50 | Ania -1867 | M | train-clean-100 | 25.16 | Rowdy Delaney -1868 | M | train-other-500 | 30.08 | Graham Redman -1870 | M | train-other-500 | 29.41 | Stuart Bell -1874 | M | train-clean-360 | 25.21 | Ernst Schnell -1878 | M | train-other-500 | 27.47 | BLRossow -1885 | F | train-clean-360 | 14.38 | inkwelldragon -1898 | F | train-clean-100 | 25.01 | Jennifer -1901 | F | train-other-500 | 30.01 | Allyson Hester -1903 | M | train-clean-360 | 24.21 | Michael Thomas Robinson -1913 | M | train-clean-360 | 25.03 | Geoff Cowgill -1914 | M | train-clean-360 | 25.04 | Kevin Kivikko -1919 | F | dev-clean | 8.17 | nprigoda -1920 | F | train-other-500 | 30.05 | Annika Feilbach -1923 | F | train-clean-360 | 25.05 | Maire Rhode -1924 | M | train-other-500 | 30.21 | Andrew Drinkwater -1926 | F | train-clean-100 | 25.19 | Nikki Sullivan -1931 | F | train-other-500 | 15.74 | poormedea -1933 | F | train-clean-360 | 14.97 | iremonger -1938 | M | train-other-500 | 22.02 | icyjumbo (1964-2010) -1943 | M | train-clean-360 | 23.10 | Corun -1944 | F | train-clean-360 | 25.03 | Carolyn Frances -1958 | M | train-clean-360 | 25.17 | Furio -1961 | F | train-clean-360 | 25.18 | Qhali -1963 | F | train-clean-100 | 25.19 | Belinda Brown -1968 | F | train-other-500 | 20.25 | lizzyblack -1970 | F | train-clean-100 | 25.13 | Dawn Larsen -1974 | F | train-clean-360 | 25.16 | Katie Baynes -1977 | F | train-other-500 | 27.80 | Jennie Hughes -1985 | M | train-other-500 | 24.71 | Jonny Lee -1987 | M | train-clean-360 | 25.19 | Michael Macedonia -1988 | F | dev-clean | 8.16 | Ransom -1989 | M | train-other-500 | 8.99 | Sergio Baldelli -1992 | F | train-clean-100 | 12.29 | Michelle White -1993 | F | dev-clean | 8.11 | Wendy Belcher -1995 | F | test-clean | 8.06 | AJai Hilton -1998 | F | test-other | 10.02 | Sonja -2001 | M | train-other-500 | 19.90 | Phillip David -2002 | M | train-clean-100 | 24.94 | Larry Maddocks -2003 | M | train-other-500 | 23.18 | The Penang Lawyer -2004 | F | train-clean-360 | 25.26 | Kim S -2007 | F | train-clean-100 | 25.21 | Sheila Morton -2010 | F | train-clean-360 | 21.53 | Julie Bynum -2012 | M | train-clean-360 | 25.20 | jburby -2013 | M | train-other-500 | 30.05 | Mark -2021 | M | train-other-500 | 30.04 | Keri Ford -2026 | F | train-other-500 | 29.39 | Mil Nicholson -2033 | M | test-other | 10.03 | Filippo Gioachin -2035 | F | dev-clean | 8.11 | Sharon Bautista -2039 | M | train-clean-360 | 25.02 | Anton -2042 | F | train-other-500 | 29.25 | Charlene V. Smith -2045 | M | train-clean-360 | 24.96 | David O'Connell -2046 | M | train-other-500 | 19.01 | kyleti -2050 | F | train-other-500 | 28.21 | Xe Sands -2051 | M | train-other-500 | 22.13 | Grant Petersen -2053 | F | train-clean-360 | 25.03 | Vincent Tapia -2056 | F | train-clean-360 | 22.72 | Nancy Roberts -2060 | F | train-clean-360 | 25.02 | Julie Pandya -2061 | F | train-clean-360 | 25.08 | Jodi Krangle -2062 | F | train-other-500 | 30.25 | Mindy H -2063 | M | train-other-500 | 22.02 | hearhis -2067 | M | train-other-500 | 30.15 | Nick Gisburne -2068 | F | train-other-500 | 14.75 | Priya, India -2074 | M | train-clean-360 | 25.06 | Tysto -2078 | M | dev-clean | 8.03 | Kathy Caver -2085 | F | train-clean-360 | 25.09 | Stephanie Dupal-Demartin -2086 | M | dev-clean | 8.04 | Nicodemus -2089 | F | train-other-500 | 30.14 | Martina -2090 | F | train-other-500 | 26.41 | Melissa -2092 | F | train-clean-100 | 25.10 | Elaine Hamby -2093 | M | train-clean-360 | 25.11 | RK Wilcox -2094 | F | test-clean | 8.09 | amycsj -2096 | M | train-other-500 | 15.93 | Nick Marsh -2100 | F | train-other-500 | 26.76 | Katherine Holt -2104 | M | train-other-500 | 29.52 | R. S. Steinberg -2110 | M | train-clean-360 | 25.09 | Aaron Elliott -2113 | M | train-clean-360 | 24.66 | Andrew Vidal -2122 | M | train-other-500 | 10.61 | Kenneth R. Morefield -2127 | M | train-clean-360 | 20.16 | wrongshore -2133 | M | train-other-500 | 28.63 | Mat Messerschmidt -2136 | M | train-clean-100 | 25.18 | Great Plains -2137 | M | train-clean-360 | 25.02 | Jerome Lawsen -2140 | M | train-other-500 | 27.77 | Ralph Snelson -2143 | F | train-other-500 | 15.47 | Cat Schirf -2146 | M | train-clean-360 | 4.89 | Jeff Stuckey -2148 | F | train-other-500 | 30.17 | BethAnne -2149 | M | train-clean-360 | 23.08 | Mark Penfold -2152 | F | train-other-500 | 30.04 | redabrus -2156 | M | train-clean-360 | 25.18 | Roger Melin -2159 | M | train-clean-100 | 25.12 | Matthew Westra -2162 | M | train-clean-360 | 25.10 | Ray Clare -2167 | M | train-clean-360 | 25.00 | spiderman0521 -2182 | F | train-clean-100 | 25.15 | Susan Umpleby -2185 | M | train-other-500 | 24.88 | Jonathan Feldman -2194 | F | train-clean-360 | 25.06 | RobbieRogers -2195 | M | train-other-500 | 29.06 | Joe Earley -2196 | F | train-clean-100 | 25.24 | Andrea Fiore -2198 | M | train-other-500 | 29.82 | Clive Catterall -2201 | M | train-clean-360 | 25.13 | Stephen Escalera -2204 | F | train-clean-360 | 25.04 | Pamnache -2208 | M | train-other-500 | 28.66 | Alan Brown -2229 | M | train-clean-360 | 21.96 | Pete Williams, Pittsburgh, PA -2230 | F | train-clean-360 | 25.03 | Isosceles -2234 | M | train-other-500 | 30.06 | Lars Rolander -2237 | F | train-other-500 | 23.41 | Chloey Winters -2238 | M | train-clean-360 | 25.09 | Will Larson -2240 | M | train-clean-360 | 25.17 | Ralph Volpi -2246 | M | train-other-500 | 30.11 | RaySee -2254 | F | train-clean-360 | 25.07 | Heidi Preuss -2256 | F | train-clean-360 | 25.06 | tamurile -2262 | M | train-other-500 | 25.53 | Andy -2269 | F | train-clean-360 | 25.06 | Rhonda Federman -2270 | F | train-other-500 | 30.08 | Megan Kunkel -2272 | M | train-clean-360 | 25.18 | Alec Daitsman -2273 | M | train-other-500 | 22.65 | Peter Kelleher -2275 | F | train-other-500 | 19.97 | Lori H -2276 | F | train-other-500 | 30.09 | Andrea -2277 | F | dev-clean | 8.01 | zinniz -2279 | M | train-other-500 | 20.83 | Gilles Lehoux -2284 | M | train-other-500 | 30.20 | Zapo -2285 | M | train-clean-360 | 25.16 | Bob Sage -2288 | F | train-other-500 | 30.13 | Ellis Christoff -2289 | M | train-clean-100 | 25.08 | David Kleparek -2292 | M | train-other-500 | 30.17 | Dick Durette -2294 | M | train-clean-360 | 25.24 | James Christopher -2297 | F | train-other-500 | 30.20 | Philippa -2299 | M | train-clean-360 | 25.23 | cpalmer17 -2300 | M | test-clean | 8.19 | Mitchell L Leopard -2301 | F | train-other-500 | 30.09 | Chris Jones -2309 | M | train-other-500 | 30.03 | Wyatt -2312 | F | train-other-500 | 30.22 | Lucy Lo Faro -2319 | M | train-clean-360 | 25.21 | Jack Farrell -2334 | M | train-clean-360 | 25.03 | David Lipa -2339 | F | train-other-500 | 30.09 | skellie -2341 | M | train-other-500 | 30.04 | webround -2346 | F | train-other-500 | 17.91 | FirstKnight -2348 | F | train-clean-360 | 22.53 | KellyLC -2351 | F | train-other-500 | 30.08 | hugoceline -2356 | M | train-other-500 | 30.20 | Paul Curran -2361 | F | train-other-500 | 30.24 | M. J. Boyle -2364 | F | train-clean-360 | 23.86 | Anna-Maria Viola -2368 | M | train-clean-360 | 25.08 | Alex C. Telander -2374 | F | train-other-500 | 21.75 | M.C.Y. -2380 | M | train-other-500 | 17.00 | Jacob Cherry -2384 | M | train-clean-100 | 20.21 | Ger -2388 | M | train-clean-360 | 25.01 | Greg Bell -2391 | F | train-clean-100 | 24.54 | treefingers -2393 | M | train-clean-360 | 22.63 | Michael Bradford -2397 | M | train-clean-360 | 25.14 | texttalker -2401 | F | train-clean-360 | 21.95 | Matt Warzel -2404 | M | train-clean-360 | 25.21 | n8evv -2405 | M | train-other-500 | 30.11 | musil -2407 | M | train-other-500 | 28.95 | ajmacbeth -2411 | F | train-clean-360 | 25.04 | kristiface -2412 | F | dev-clean | 8.06 | calystra -2414 | M | test-other | 10.10 | Ashwin Jain -2416 | F | train-clean-100 | 25.17 | Julia Albath -2427 | M | train-clean-360 | 25.02 | Ed Meade -2428 | M | dev-clean | 8.02 | Stephen Kinford -2436 | M | train-clean-100 | 25.15 | Seth Adam Sher -2437 | M | train-other-500 | 21.23 | Wetcoast -2445 | F | train-other-500 | 13.04 | musici123 -2448 | M | train-other-500 | 23.07 | David Federman -2473 | M | train-clean-360 | 25.16 | Hoosemon -2481 | F | train-clean-360 | 25.07 | Alana Jordan -2485 | F | train-other-500 | 30.03 | Serin -2487 | F | train-other-500 | 28.17 | Rachel Lintern -2488 | F | train-other-500 | 30.16 | Lisa Wilson -2491 | M | train-other-500 | 20.67 | johnb -2494 | M | train-clean-360 | 25.03 | Mark Cawley -2496 | M | train-other-500 | 30.10 | Ben Dutton -2498 | F | train-clean-360 | 25.05 | B. Grebe -2499 | M | train-clean-360 | 25.14 | Paul Henry Tremblay -2504 | F | train-other-500 | 14.22 | Helen Elsbeth -2506 | F | dev-other | 8.52 | Julie VW -2512 | F | train-clean-360 | 24.05 | Marion -2514 | M | train-clean-100 | 25.11 | S. Young -2517 | M | train-clean-360 | 25.25 | Gayland Darnell -2518 | M | train-clean-100 | 25.06 | Rob Powell -2522 | F | train-other-500 | 23.34 | senshisteph -2526 | M | train-other-500 | 30.09 | Bob Gilham -2531 | M | train-clean-360 | 25.12 | Greg Weeks -2532 | F | train-clean-360 | 25.11 | Jennifer Lott -2533 | M | train-clean-360 | 15.81 | Steven Proctor -2541 | M | train-other-500 | 30.04 | Eddie Winter -2544 | F | train-other-500 | 30.02 | Annise -2545 | M | train-other-500 | 15.29 | the quiet fox -2552 | M | train-other-500 | 28.82 | Daniel Cranston -2553 | F | train-other-500 | 30.04 | daisy55 -2562 | M | train-clean-360 | 25.19 | Scott Merrill -2568 | F | train-other-500 | 30.07 | Elena the Quiet -2570 | F | train-clean-360 | 25.05 | kindlibrarian -2573 | F | train-clean-360 | 25.00 | Becca B -2574 | M | train-other-500 | 28.34 | TimSC -2577 | F | train-clean-360 | 25.16 | K Hindall -2581 | F | train-clean-360 | 25.12 | Julie Levi -2582 | F | train-clean-360 | 25.16 | dolce -2587 | F | train-other-500 | 30.13 | Anne Cheng -2588 | M | train-other-500 | 26.44 | Padraig O'hIceadha -2589 | M | train-clean-360 | 25.04 | Jordan -2592 | F | train-clean-360 | 20.82 | Anna Roberts -2598 | F | train-clean-360 | 23.05 | Barbara Bulkeley -2606 | M | train-other-500 | 30.16 | Marc Tanti -2607 | F | train-other-500 | 30.11 | Ruth Golding -2609 | M | test-other | 10.10 | Ian Hatley -2618 | M | train-clean-360 | 24.51 | Phil Surette -2624 | M | train-other-500 | 30.05 | David Nicol -2625 | F | train-other-500 | 20.53 | Auntie Em -2628 | M | train-clean-360 | 25.22 | Zloot -2638 | F | train-clean-360 | 25.02 | Dawn -2652 | F | train-clean-360 | 15.01 | MixieArmadillo -2654 | M | train-clean-360 | 16.45 | Notelrac -2660 | M | train-other-500 | 30.01 | mpetranech -2671 | F | train-other-500 | 21.49 | Foreign Girl -2673 | M | train-clean-360 | 25.06 | jude kaider -2674 | M | train-clean-360 | 24.32 | Jason Procopio -2676 | F | train-other-500 | 27.44 | missizii -2688 | M | train-clean-360 | 25.15 | Christopher Jennings -2691 | F | train-clean-100 | 25.16 | Donna Stewart -2694 | F | train-other-500 | 29.43 | DianaJMB -2696 | M | train-clean-360 | 15.92 | anonymous -2709 | F | train-clean-360 | 17.49 | PopularOutcast -2712 | F | train-other-500 | 27.11 | anoldfashiongirl -2724 | M | train-other-500 | 20.73 | Michael Dalling -2730 | F | train-other-500 | 24.25 | Shirley Anderson -2733 | M | train-other-500 | 15.37 | CalmDragon -2735 | F | train-other-500 | 14.04 | ASchindler -2740 | M | train-other-500 | 22.19 | Tony Ashworth -2741 | F | train-clean-360 | 25.21 | Jan Dawn Doronila -2748 | F | train-other-500 | 24.78 | Annoying Twit -2751 | F | train-clean-360 | 24.39 | Angela Kelley -2754 | F | train-other-500 | 30.12 | peaceuntoyou -2758 | F | train-clean-360 | 25.19 | SopranoHarmony -2762 | F | train-other-500 | 30.01 | Phillipa Chantry -2764 | F | train-clean-100 | 25.19 | Piper Hale -2769 | M | train-clean-360 | 25.25 | Anthony Wilson -2774 | M | train-clean-360 | 25.14 | William Kevin Manire -2775 | F | train-clean-360 | 25.17 | ink tree -2785 | F | train-clean-360 | 25.23 | humeangel -2787 | M | train-clean-360 | 19.66 | Quentin Manuel -2790 | F | train-clean-360 | 25.09 | Victoria Slonosky -2792 | F | train-other-500 | 30.16 | Varra Unreal -2803 | M | dev-clean | 8.20 | aquielisunari -2812 | M | train-clean-360 | 14.63 | Greg Hartley -2815 | M | train-clean-360 | 15.98 | Michael Sample -2816 | M | train-clean-360 | 25.19 | Andrew Symons -2817 | F | train-clean-100 | 25.14 | Catherine Millward -2823 | M | train-clean-360 | 18.78 | ChrisC -2825 | M | train-other-500 | 30.02 | Ernst Pattynama -2827 | M | train-clean-360 | 21.49 | David Leeson -2830 | M | test-clean | 8.04 | Tim Perkins -2834 | F | train-other-500 | 30.02 | Ksushi -2836 | F | train-clean-100 | 25.12 | Linda McDaniel -2843 | M | train-clean-100 | 25.18 | ricell -2853 | F | train-clean-360 | 25.00 | Jane Greensmith -2854 | M | train-other-500 | 30.25 | Andrew Coleman -2882 | F | train-clean-360 | 23.84 | ayngelwing -2893 | M | train-clean-100 | 24.41 | Ryan Sutter -2895 | F | train-other-500 | 24.14 | Jenny Lundak -2902 | M | dev-clean | 8.10 | dexter -2909 | F | train-other-500 | 30.13 | Petra -2910 | F | train-clean-100 | 22.33 | Janna -2911 | M | train-clean-100 | 25.10 | David Lawrence -2919 | F | train-other-500 | 30.17 | Raerity -2920 | F | train-clean-360 | 25.18 | Rechelle -2925 | F | train-other-500 | 26.47 | Darla -2929 | M | train-clean-360 | 25.15 | Topaz -2930 | M | train-other-500 | 20.36 | BUAES -2943 | F | train-other-500 | 30.09 | Sarah Gutierrez -2946 | M | train-other-500 | 19.68 | Markus Wachenheim -2952 | M | train-clean-100 | 25.02 | Scott Carpenter -2960 | M | train-clean-360 | 25.03 | Scotty -2961 | F | test-clean | 8.07 | Leni -2967 | F | train-other-500 | 30.26 | Landii -2971 | M | train-clean-360 | 25.01 | Matthew C. Heckel -2975 | F | train-other-500 | 26.46 | Sarafina Suransky -2979 | F | train-other-500 | 18.85 | Jilliane Brandt -2985 | M | train-other-500 | 21.98 | Cantor -2988 | F | train-other-500 | 30.16 | Larissa Little -2989 | F | train-clean-100 | 25.21 | Jamie Strassenburg, Cypress, California -2990 | M | train-other-500 | 30.07 | Tom Crawford -2992 | M | train-clean-360 | 24.13 | davechase -2997 | F | train-other-500 | 30.26 | Violet -2998 | M | train-other-500 | 30.04 | Kim Jansen -2999 | M | train-clean-360 | 25.16 | Joseph Finkberg -3000 | M | dev-clean | 8.03 | Brian von Dedenroth -3001 | F | train-clean-360 | 21.97 | priscilla hewitt -3003 | F | train-clean-360 | 25.09 | Sue Anderson -3005 | M | test-other | 10.04 | Ken Tischler -3006 | F | train-other-500 | 30.14 | MorganScorpion -3008 | F | train-clean-360 | 25.17 | Gloria Zbilicki -3009 | M | train-clean-360 | 25.00 | Jim Ruddy -3020 | M | train-other-500 | 30.07 | Mike Vendetti -3021 | M | train-other-500 | 29.27 | leetcr -3025 | F | train-clean-360 | 25.07 | MichelleHarris -3032 | M | train-clean-360 | 25.10 | Utek -3033 | F | train-other-500 | 30.09 | valli -3045 | M | train-other-500 | 27.99 | Cameron Conaway -3046 | F | train-clean-360 | 25.21 | Stephanie Land -3053 | F | train-other-500 | 20.98 | Tracy Yonemoto -3054 | M | train-other-500 | 23.13 | GerryR -3060 | M | train-other-500 | 26.15 | Didier -3063 | M | train-other-500 | 25.29 | markman -3070 | M | train-clean-360 | 25.15 | Mike Schwabe -3072 | M | train-clean-360 | 25.05 | Chris Amos -3079 | F | train-other-500 | 7.10 | nivedita -3080 | F | test-other | 10.13 | breathe -3081 | F | dev-clean | 8.00 | Renata -3082 | M | train-clean-360 | 17.05 | Logan McCamon -3083 | F | train-clean-360 | 25.06 | Emily Jarmard -3088 | M | train-other-500 | 14.21 | Sean O'Hara -3090 | F | train-other-500 | 22.39 | kelcymx -3092 | F | train-clean-360 | 25.06 | Maggie Russell -3094 | F | train-clean-360 | 25.10 | moe -3097 | M | train-other-500 | 28.71 | nitram -3098 | M | train-other-500 | 28.85 | woggy298 -3100 | M | train-other-500 | 29.56 | David Higham -3105 | M | train-clean-360 | 25.20 | gfairch511 -3109 | M | train-other-500 | 30.20 | Diogenes Dog -3112 | F | train-clean-100 | 25.08 | Jessica Louise -3114 | M | train-clean-360 | 25.04 | Geoffrey Edwards -3118 | M | train-clean-360 | 25.06 | George Yeager -3119 | F | train-clean-360 | 25.18 | Sharon Riskedahl -3125 | F | train-other-500 | 30.23 | Fran -3132 | M | train-other-500 | 29.97 | Andy Yu -3135 | M | train-other-500 | 20.03 | Steve Foreman -3137 | M | train-other-500 | 20.23 | Parrot -3138 | F | train-other-500 | 3.53 | Labyrinth Composer -3142 | M | train-other-500 | 15.12 | RogerA -3143 | F | train-other-500 | 23.59 | suzanne -3144 | M | train-other-500 | 30.01 | jfmarchini -3148 | M | train-other-500 | 18.41 | artos -3157 | F | train-clean-360 | 25.05 | TriciaG -3168 | M | train-clean-100 | 23.90 | David Anton -3170 | M | dev-clean | 8.10 | VOICEGUY -3171 | M | train-clean-360 | 25.11 | JoeD -3172 | F | train-other-500 | 29.24 | Beatrice -3179 | F | train-other-500 | 26.80 | Robin -3180 | M | train-clean-360 | 25.01 | Mike Conrad -3185 | M | train-clean-360 | 25.02 | JohnNewman -3187 | M | train-clean-360 | 24.32 | Wasichu -3192 | M | train-other-500 | 30.07 | Arfuhrm -3196 | F | train-other-500 | 30.19 | Elizabeth Harker -3214 | M | train-clean-100 | 25.08 | fourteatoo -3215 | F | train-clean-360 | 25.02 | Shirley Ellen -3221 | M | train-clean-360 | 25.12 | David Schoepf -3224 | F | train-clean-360 | 25.19 | Acacia Wood -3227 | F | train-other-500 | 17.26 | Betina -3228 | F | train-clean-360 | 25.01 | Benuathanasia -3230 | M | train-clean-360 | 25.13 | rasputin -3235 | F | train-clean-100 | 24.94 | Karen Commins -3238 | M | train-other-500 | 19.07 | nihilist00 -3240 | M | train-clean-100 | 25.09 | flakker -3242 | M | train-clean-100 | 25.03 | peac -3244 | F | train-other-500 | 30.09 | wilwarin -3245 | F | train-other-500 | 30.10 | wendy -3257 | M | train-other-500 | 30.17 | Jay Vance -3258 | F | train-clean-360 | 23.50 | mwalimu -3259 | F | train-clean-100 | 25.19 | Kate West -3261 | M | train-other-500 | 16.03 | fourgrays -3268 | M | train-other-500 | 30.06 | Patrick McHaffie -3271 | M | train-other-500 | 19.99 | Ancient mariner -3272 | M | train-other-500 | 19.89 | Matthew_J_Almeida -3274 | M | train-clean-360 | 25.26 | Morgan Saletta -3285 | M | train-other-500 | 30.03 | David Collins -3288 | M | train-other-500 | 30.09 | Euan Bayliss -3289 | M | train-clean-360 | 25.06 | lukeprog -3290 | F | train-other-500 | 29.75 | Marian Martin -3294 | F | train-clean-360 | 19.45 | Marcy Fraser -3307 | M | train-clean-360 | 25.06 | Doug Allison -3314 | F | train-other-500 | 30.14 | Carol Stripling -3318 | F | train-other-500 | 30.19 | Magdalena -3319 | F | train-other-500 | 28.56 | mjbrichant -3328 | M | train-clean-360 | 25.16 | Al Dano -3330 | F | train-clean-360 | 25.10 | B. G. Oxford -3331 | F | test-other | 10.08 | Peggy -3334 | F | train-other-500 | 14.57 | joi -3340 | M | train-clean-360 | 25.12 | Preston McConkie -3346 | F | train-other-500 | 30.03 | Hannah Dowell -3347 | F | train-clean-360 | 25.23 | tornadogrrrl -3356 | F | train-other-500 | 20.03 | Diana Solomon -3357 | F | train-clean-360 | 24.37 | swade -3361 | F | train-clean-360 | 25.19 | Linda Lee Paquet -3368 | M | train-clean-360 | 25.19 | Jim Allman -3370 | M | train-clean-360 | 25.16 | Glenn Simonsen -3373 | M | train-other-500 | 18.98 | cvd -3374 | M | train-clean-100 | 25.17 | Craig Campbell -3379 | F | train-clean-360 | 25.09 | Kele -3380 | F | train-clean-360 | 25.06 | DrBeccaAnne -3381 | M | train-other-500 | 2.99 | Cagliostro -3389 | M | train-clean-360 | 25.25 | von -3394 | F | train-other-500 | 30.03 | Jackie Provau -3400 | F | train-other-500 | 17.98 | Laura Davis -3409 | F | train-other-500 | 30.24 | Philippa Brodie -3411 | F | train-other-500 | 28.43 | SuD -3417 | M | train-other-500 | 17.97 | Albatross -3433 | M | train-other-500 | 30.24 | Bob Sherman -3436 | M | train-clean-100 | 25.25 | Anders Lankford -3440 | F | train-clean-100 | 25.18 | Heidi Will -3446 | F | train-clean-360 | 25.24 | kayo -3448 | M | train-clean-360 | 25.24 | Todd Lennon -3465 | F | train-other-500 | 29.59 | ravenotation -3467 | F | train-other-500 | 30.23 | js392 -3470 | M | train-other-500 | 30.11 | Jason Mills -3479 | F | train-other-500 | 30.09 | Karan Yamada -3482 | F | train-clean-360 | 25.22 | Hayden -3483 | M | train-clean-360 | 25.20 | Alan Winterrowd -3486 | M | train-clean-100 | 25.08 | Robin Balmer -3488 | M | train-other-500 | 17.57 | Tom Weiss -3490 | M | train-clean-360 | 25.10 | Gregg Margarite (1957-2012) -3493 | F | train-clean-360 | 21.49 | Gail Mattern -3500 | F | train-other-500 | 28.86 | B. Treadgold -3503 | M | train-other-500 | 28.15 | Christian Al-Kadi -3513 | F | train-clean-360 | 25.01 | Symmie -3521 | M | train-clean-360 | 25.07 | NickNumber -3526 | F | train-clean-100 | 25.18 | Bereni -3528 | F | test-other | 10.26 | minimoose83 -3536 | F | dev-clean | 8.15 | Arielle Lipshaw -3537 | F | train-clean-360 | 25.10 | Tracy Datlen -3538 | F | test-other | 10.03 | Wyndelyn -3540 | M | train-clean-360 | 24.55 | Bill Ruhsam -3541 | M | train-other-500 | 30.14 | Termin Dyan -3546 | F | train-clean-360 | 25.21 | Jeannie -3547 | M | train-other-500 | 30.11 | BenW -3549 | F | train-clean-360 | 25.05 | Katie Riley -3551 | F | train-clean-360 | 25.10 | Annie Kirkpatrick -3553 | M | train-other-500 | 25.03 | Luc Kordas -3554 | F | train-other-500 | 30.06 | LaraC, Louisville, KY -3557 | F | train-other-500 | 30.08 | Rachel Triska -3559 | F | train-other-500 | 30.06 | Kerry Hiles -3564 | F | train-other-500 | 24.04 | Vanessa -3567 | M | train-other-500 | 30.12 | David Lazarus -3570 | F | test-clean | 8.05 | sarac -3571 | M | train-other-500 | 23.68 | HarryInk -3575 | F | test-clean | 8.06 | supergirl -3576 | F | dev-clean | 8.00 | JudyGibson -3584 | F | train-clean-360 | 22.30 | Bridget Gaige -3587 | M | train-other-500 | 25.46 | John Nixon -3588 | F | train-other-500 | 30.06 | Neeru Iyer -3592 | M | train-other-500 | 10.77 | Paul McCartan -3595 | M | train-other-500 | 30.07 | Martin Geeson -3598 | F | train-other-500 | 26.07 | Dawn -3606 | M | train-other-500 | 28.34 | Ashwath Ganesan -3607 | M | train-clean-100 | 22.10 | Richard Wallis -3615 | F | train-clean-360 | 25.05 | Lucy Perry -3618 | M | train-other-500 | 26.32 | Timothy Ferguson -3630 | F | train-clean-360 | 12.45 | Rachel Gatwood -3638 | F | train-clean-360 | 25.16 | AmyG -3641 | F | train-other-500 | 25.50 | Joelle Peebles -3645 | F | train-clean-360 | 25.08 | MaryAnn -3647 | F | train-other-500 | 30.24 | Channe -3650 | M | train-other-500 | 23.18 | Jonathan Ross -3654 | M | train-clean-360 | 25.09 | Mark Wilson -3656 | M | train-other-500 | 30.26 | Kai Lu -3657 | M | train-other-500 | 30.03 | Bellona Times -3660 | M | dev-other | 10.26 | Russ Clough -3663 | F | dev-other | 10.13 | ppezz -3664 | M | train-clean-100 | 25.06 | Barry Eads -3665 | M | train-other-500 | 24.95 | C.J. Casey -3675 | F | train-other-500 | 26.63 | Linda Ferguson -3679 | F | train-other-500 | 20.97 | veronasser -3681 | F | train-other-500 | 30.09 | Ann Boulais -3686 | M | train-clean-360 | 25.07 | Doug Delisle -3691 | M | train-other-500 | 29.41 | Hollis Hanover -3698 | F | train-other-500 | 30.04 | Nadine Eckert-Boulet -3699 | M | train-clean-100 | 25.15 | Bruce Pirie -3703 | F | train-clean-360 | 25.06 | Linda Andrus -3717 | M | train-clean-360 | 25.09 | Elliott Miller -3723 | M | train-clean-100 | 25.07 | Kevin Lavin -3728 | F | train-clean-360 | 25.17 | amycs -3729 | F | test-clean | 8.03 | Heather Hogan -3733 | F | train-clean-360 | 25.01 | Melanie Schleeter McCalmont -3738 | F | train-clean-360 | 25.01 | Collee McKinnon -3744 | M | train-other-500 | 28.62 | Jonathan Burchard -3747 | M | train-other-500 | 15.39 | Keith Henige -3752 | M | dev-clean | 8.06 | Mark Welch -3757 | F | train-other-500 | 18.90 | EmAllise -3764 | F | test-other | 10.12 | Gabrielle Lambrick -3779 | F | train-other-500 | 30.11 | Rachel Steely -3780 | M | train-other-500 | 29.90 | Pete -3781 | F | train-clean-360 | 25.02 | Celena Arter -3783 | M | train-other-500 | 16.30 | TexasSteve -3790 | F | train-clean-360 | 25.10 | hpark -3792 | M | train-clean-360 | 16.38 | Brian Keith Barnes -3793 | M | train-other-500 | 30.18 | Nathan -3796 | M | train-other-500 | 26.72 | Mario Pineda -3798 | F | train-other-500 | 30.22 | Bianca Kramer -3807 | M | train-clean-100 | 22.31 | Jesse Noar -3816 | F | train-clean-360 | 25.05 | Bev J Stevens -3819 | M | train-other-500 | 30.04 | StarrDog -3825 | M | train-clean-360 | 17.60 | Matt Wills -3830 | M | train-clean-100 | 24.01 | rymd80 -3835 | M | train-clean-360 | 18.92 | M.White -3843 | F | train-other-500 | 30.16 | storm -3845 | M | train-other-500 | 30.22 | Ray Smith -3848 | F | train-other-500 | 28.82 | skoval -3851 | F | train-clean-360 | 25.26 | mbousquet -3852 | F | train-clean-360 | 22.37 | selniff -3853 | F | dev-clean | 8.05 | M. Bertke -3857 | M | train-clean-100 | 25.17 | Epistomolus -3864 | M | train-clean-360 | 24.20 | Tom Watts -3866 | M | train-clean-360 | 25.12 | SilverG -3867 | F | train-other-500 | 28.37 | Roberta Carlisle -3869 | M | train-clean-360 | 25.02 | Timothy Pinkham -3871 | M | train-other-500 | 29.98 | Figura -3876 | F | train-clean-360 | 25.03 | Frances Marcinkiewicz -3879 | F | train-clean-100 | 25.10 | Keneva -3885 | F | train-other-500 | 24.69 | Elli -3889 | F | train-clean-360 | 25.07 | Alina -3894 | M | train-other-500 | 18.14 | Indy Gosal -3895 | M | train-other-500 | 13.98 | porlob -3896 | M | train-other-500 | 30.23 | Will Zufall -3905 | F | train-clean-360 | 23.23 | J. Rebecca Franklin -3906 | F | train-other-500 | 30.04 | tabithat -3909 | F | train-other-500 | 30.03 | Evelyn Clarke -3911 | F | train-other-500 | 18.56 | Joseph Couves -3912 | M | train-other-500 | 30.18 | Bob Neufeld -3914 | M | train-clean-360 | 25.22 | Rob James -3915 | F | dev-other | 10.32 | JenniferW -3922 | F | train-clean-360 | 25.20 | Ashley Candland -3923 | M | train-clean-360 | 25.10 | Sean Michael Hogan -3925 | F | train-other-500 | 14.78 | Viglione -3926 | F | train-other-500 | 29.85 | Denise Lacey -3927 | M | train-clean-360 | 25.16 | Bob Stretch -3928 | F | train-other-500 | 30.11 | Marianne Coleman-Hipkins -3934 | F | train-other-500 | 21.35 | Lynne Carroll -3945 | M | train-clean-360 | 22.57 | Floyd Wilde -3947 | F | train-clean-100 | 22.43 | johnell -3955 | M | train-other-500 | 24.95 | Fredrik Karlsson -3959 | M | train-other-500 | 30.24 | rjhargrav -3962 | M | train-other-500 | 25.43 | writerboyontour -3967 | F | train-clean-360 | 21.86 | Christine Dufour -3969 | F | train-other-500 | 30.01 | CM Slosson -3972 | F | train-clean-360 | 25.07 | Joy Easton -3977 | M | train-clean-360 | 25.11 | LivelyHive -3979 | F | train-clean-360 | 25.14 | Dale A. Bade -3982 | F | train-clean-100 | 25.07 | Kate Adams -3983 | F | train-clean-100 | 25.01 | lavocedorata -3989 | M | train-clean-360 | 25.06 | Rayne -3990 | F | train-other-500 | 28.44 | Jessi -3992 | F | train-other-500 | 30.24 | perpetualdreamworld -3994 | F | train-clean-360 | 25.09 | Miriam Esther Goldman -3997 | F | test-other | 10.31 | Sophia Choi -4005 | F | train-other-500 | 30.14 | Jhiu -4009 | F | train-other-500 | 29.26 | Diana Majlinger -4010 | M | train-clean-360 | 25.19 | David Baldwin -4013 | M | train-clean-360 | 25.14 | Kevin Maxson -4014 | M | train-clean-100 | 25.20 | Tom Clifton -4015 | M | train-other-500 | 30.01 | JimOCR -4017 | M | train-other-500 | 28.96 | gsolgaard -4018 | M | train-clean-100 | 25.17 | Nicholas Clifford -4019 | M | train-other-500 | 27.31 | brrrrrr6 -4020 | M | train-other-500 | 17.91 | Linda -4021 | F | train-other-500 | 30.21 | Linda Woods -4034 | F | train-other-500 | 30.24 | Sienna -4039 | M | train-clean-360 | 25.15 | Shawn Craig Smith -4042 | M | train-other-500 | 30.02 | Ryan DeRamos -4044 | F | train-clean-360 | 23.50 | serenitylee -4051 | F | train-clean-100 | 25.14 | Liz Devens -4054 | M | train-clean-360 | 15.16 | Ryan Gubele -4057 | F | train-clean-360 | 25.26 | RoseA -4059 | M | train-other-500 | 29.84 | Troy Bond -4063 | F | train-other-500 | 16.23 | Abigail Bartels -4064 | F | train-clean-360 | 25.12 | Margaret Espaillat -4071 | F | train-clean-360 | 25.04 | Nichelle von Lauder -4077 | M | test-clean | 8.14 | Nathan Markham -4078 | M | train-other-500 | 21.58 | Richard Kilmer -4085 | M | train-other-500 | 18.85 | Paul P Miller -4088 | F | train-clean-100 | 25.15 | Blazin48 -4090 | F | train-other-500 | 25.53 | madmouth -4098 | F | train-clean-360 | 25.04 | Rachell Lovett -4104 | F | train-other-500 | 28.44 | Linda Dodge -4108 | M | train-clean-360 | 25.21 | garymacf -4110 | M | train-clean-360 | 25.18 | Richard Ellwood -4111 | F | train-clean-360 | 25.07 | Rachel P. -4116 | F | train-clean-360 | 25.06 | Amy Benton -4122 | M | train-other-500 | 29.44 | Wendel Topper -4133 | M | train-clean-360 | 24.12 | BigStory -4137 | F | train-clean-100 | 24.92 | Sarah LuAnn -4138 | F | train-clean-360 | 21.69 | daltongirl -4145 | F | train-clean-360 | 25.20 | Patti Cunningham -4148 | M | train-clean-360 | 25.18 | David A. Moore. -4152 | M | train-clean-360 | 25.18 | Ata Khudayberdiev -4153 | F | dev-other | 10.01 | Hilara -4156 | F | train-other-500 | 30.03 | Caroline Shapiro -4160 | F | train-clean-100 | 25.09 | Rosie -4161 | M | train-other-500 | 20.59 | Daniel Paashaus -4172 | M | train-other-500 | 29.53 | Graeme Dunlop -4174 | F | train-other-500 | 30.01 | Availle -4179 | M | train-other-500 | 30.18 | Robert Keiper -4189 | F | train-other-500 | 28.25 | Megan Argo -4191 | M | train-other-500 | 22.03 | Grant Hurlock -4192 | F | train-other-500 | 18.59 | MaryModern -4193 | M | train-other-500 | 30.23 | Ethan Rampton -4195 | F | train-clean-100 | 25.08 | bj -4196 | M | train-other-500 | 30.09 | Jim Clevenger -4198 | M | test-other | 10.14 | Examinfo -4205 | M | train-other-500 | 22.17 | psi_mon -4211 | F | train-other-500 | 27.31 | A. Knight -4214 | F | train-clean-100 | 17.45 | A. Janelle Risa -4216 | F | train-other-500 | 30.02 | Hannah Skoonberg -4217 | M | train-other-500 | 30.06 | Brendan Tannam -4218 | M | train-other-500 | 29.74 | David Cole -4222 | F | train-clean-360 | 25.22 | msjodi777 -4225 | F | train-other-500 | 26.78 | gmiteva -4226 | M | train-clean-360 | 25.12 | Jud Niven -4234 | F | train-other-500 | 30.02 | laineyben -4235 | F | train-other-500 | 28.44 | Haylayer Flaga -4236 | M | train-clean-360 | 16.01 | Nicholas Feulner -4238 | F | train-clean-360 | 24.09 | Chela -4243 | M | train-clean-360 | 25.16 | Ian Grae -4246 | M | train-clean-360 | 15.61 | JLaddJr -4257 | M | train-clean-360 | 22.42 | garbageman99 -4260 | F | train-clean-360 | 23.54 | Clacas -4262 | F | train-other-500 | 23.66 | LoraBeth Davis -4263 | F | train-other-500 | 29.88 | Chelsea Baker -4267 | M | train-clean-100 | 25.14 | Ric F -4273 | F | train-other-500 | 13.25 | as101 -4277 | M | train-other-500 | 19.92 | JohanG -4278 | M | train-clean-360 | 25.07 | smhamon -4280 | F | train-other-500 | 27.64 | BB -4289 | F | train-clean-360 | 22.49 | Veronica Jenkins -4290 | M | train-clean-360 | 25.01 | Joshua Paul Johnson -4294 | F | test-other | 10.17 | Jessamy Gloor -4295 | M | train-other-500 | 30.17 | Slawek -4297 | F | train-clean-100 | 25.04 | Tina Horning -4305 | F | train-other-500 | 18.60 | Aspergine -4310 | F | train-other-500 | 10.29 | grace4him -4313 | F | train-other-500 | 29.54 | May Low -4321 | F | train-other-500 | 30.03 | Xenutia -4323 | F | dev-other | 10.02 | BookAngel7 -4327 | F | train-other-500 | 30.01 | brokenaltar -4331 | F | train-clean-360 | 24.77 | Barbara Clements -4335 | M | train-clean-360 | 21.74 | davidb -4340 | F | train-clean-100 | 21.97 | kiwafruit -4344 | M | train-other-500 | 26.88 | Tadhg -4345 | M | train-other-500 | 23.32 | Richard Schipper -4350 | M | test-other | 10.12 | willem -4352 | F | train-other-500 | 29.82 | Martina Hutchins -4356 | F | train-clean-360 | 25.07 | Patricia Rutledge -4358 | M | train-clean-360 | 25.11 | Kim Stich -4362 | F | train-clean-100 | 25.18 | Michelle Montano -4363 | F | train-clean-360 | 25.04 | Emily Livingston -4379 | M | train-other-500 | 30.01 | Scott Dahlem -4381 | F | train-clean-360 | 6.58 | Denise Resnik -4396 | F | train-other-500 | 30.07 | Michael Wolf -4397 | M | train-clean-100 | 25.06 | John Dennison -4402 | M | train-other-500 | 22.67 | Christopher Sanner -4406 | M | train-clean-100 | 25.12 | Matthew Scott Surprenant -4407 | M | train-other-500 | 21.73 | Ted Drury -4411 | F | train-other-500 | 27.13 | Zarnaz -4415 | F | train-other-500 | 12.54 | Anita Fleming -4420 | M | train-other-500 | 23.18 | Steve Lomas -4422 | F | train-other-500 | 30.05 | Kamna -4423 | M | train-other-500 | 25.86 | David Dwight -4425 | M | train-clean-360 | 17.73 | Gary Coy -4427 | F | train-clean-360 | 25.06 | Lynne Handler -4428 | M | train-other-500 | 20.43 | Blueoyster101 -4433 | M | train-clean-360 | 12.83 | Ken Sterry -4434 | F | train-clean-360 | 25.03 | Sarah Nuxoll -4438 | M | train-clean-360 | 25.00 | Greg W. -4441 | M | train-clean-100 | 25.06 | William Peck -4442 | M | train-other-500 | 27.21 | Pep -4443 | F | train-other-500 | 30.09 | THOVO -4446 | F | test-clean | 8.00 | Jen Maxwell -4447 | M | train-other-500 | 30.14 | Cascades -4455 | F | train-other-500 | 30.00 | Patrick Wells -4463 | F | train-other-500 | 29.36 | Cate Mackenzie -4474 | M | train-other-500 | 28.95 | John L. Clark -4480 | M | train-other-500 | 30.03 | Iskander Shafikov -4481 | F | train-clean-100 | 22.56 | margo zinberg -4484 | M | train-other-500 | 30.23 | Phil Griffiths -4487 | F | train-other-500 | 30.19 | Nienke -4490 | F | train-clean-360 | 25.01 | Rachel Weaver -4492 | F | train-other-500 | 30.11 | P.Hynes -4495 | M | train-clean-360 | 25.09 | Dillon Stiles -4507 | F | test-clean | 8.05 | Rachel Nelson-Smith -4511 | F | train-other-500 | 25.81 | Jeanie -4513 | F | train-other-500 | 7.64 | Gabi -4515 | M | dev-other | 10.00 | Doug -4519 | F | train-clean-360 | 22.04 | Mimi Wang -4520 | F | train-other-500 | 19.56 | Dorlene Kaplan -4535 | M | train-clean-360 | 24.62 | Brett W. Downey -4545 | M | train-other-500 | 30.01 | SunshinePaul -4546 | F | train-other-500 | 30.18 | Estelle Jobson -4549 | F | train-other-500 | 26.71 | Kristen Zaza -4563 | F | train-other-500 | 28.02 | Wiebke -4570 | M | dev-other | 10.10 | Bill Mosley -4572 | M | dev-other | 10.28 | om123 -4576 | F | train-other-500 | 30.22 | Snaefaxi -4583 | M | train-other-500 | 27.07 | Jersey City Frankie -4586 | M | train-clean-360 | 25.05 | Chris Caron -4590 | M | train-clean-360 | 25.22 | Diapadion -4591 | M | train-other-500 | 23.65 | Robert White -4592 | F | train-clean-360 | 25.08 | WestWestest -4594 | M | train-other-500 | 28.76 | mailman61953 -4595 | M | train-clean-360 | 25.13 | Eric Leach -4598 | F | train-clean-360 | 21.75 | cher0520 -4599 | M | train-other-500 | 15.72 | xibu -4629 | M | train-clean-360 | 25.21 | Edward W. LaBonte -4640 | F | train-clean-100 | 25.06 | Karen Mason -4652 | F | train-other-500 | 9.07 | Savanna Herrold -4659 | M | train-other-500 | 30.00 | Stephen Marsh -4660 | F | train-other-500 | 30.12 | SusieSA -4667 | F | train-other-500 | 28.29 | Maria Therese -4680 | F | train-clean-100 | 25.15 | pachayes -4681 | M | train-clean-360 | 19.11 | Frank Adams -4687 | M | train-other-500 | 30.13 | mevans -4693 | M | train-other-500 | 30.25 | Robert Parker -4697 | F | train-other-500 | 28.58 | Jannie Meisberger -4699 | M | train-other-500 | 10.43 | Jason Justice -4701 | M | train-other-500 | 30.11 | CC -4703 | F | train-other-500 | 24.21 | HurstPP -4705 | M | train-other-500 | 30.06 | Algy Pug -4706 | F | train-other-500 | 28.48 | SallyMc -4710 | M | train-other-500 | 30.18 | David Huston -4712 | F | train-other-500 | 26.18 | Alisson Veldhuis -4719 | M | train-clean-360 | 22.99 | M. Craun -4731 | F | train-clean-360 | 25.27 | Becky Cook -4733 | M | train-clean-360 | 19.08 | dwegowy -4734 | M | train-clean-360 | 17.07 | Adib Masumian -4738 | M | train-other-500 | 29.33 | Leonard Wilson -4741 | M | train-other-500 | 22.64 | Nullifidian -4742 | F | train-other-500 | 11.24 | Little Tee -4744 | F | train-clean-360 | 25.15 | Amy Gramour -4748 | M | train-other-500 | 30.15 | Dirk Eichhorn -4750 | M | train-other-500 | 30.12 | Paul Huckerby -4757 | F | train-other-500 | 10.61 | Grace Dobson -4766 | F | train-other-500 | 19.73 | Melanie -4767 | M | train-other-500 | 19.26 | Delysid -4770 | F | train-clean-360 | 20.50 | Jeanne Luft -4771 | M | train-other-500 | 21.91 | scrawl -4773 | F | train-other-500 | 30.04 | Kathryn Lois -4779 | F | train-other-500 | 30.00 | Angel5 -4788 | M | train-clean-100 | 25.04 | Bill Boerst -4791 | F | train-other-500 | 30.10 | MelanieMae -4799 | M | train-other-500 | 29.45 | Matt Judd -4800 | F | train-clean-360 | 25.14 | Mary Herndon Bell -4806 | M | train-clean-360 | 16.25 | Jason Ingolfsland -4807 | F | train-clean-360 | 16.73 | Fuzz -4813 | M | train-clean-100 | 25.12 | Steve Mattern -4821 | M | train-other-500 | 17.35 | Zachary Johnson -4824 | F | train-other-500 | 30.14 | meyerli -4830 | M | train-clean-100 | 24.05 | George Aalto -4831 | F | dev-other | 10.07 | Lisa Meyers -4836 | M | train-other-500 | 23.06 | Preston Scrape -4837 | F | train-clean-360 | 21.92 | Sharon Kilmer -4839 | F | train-clean-360 | 25.06 | Julie K. Rose -4841 | F | train-other-500 | 26.21 | Haley Pereira -4846 | F | train-clean-360 | 19.94 | Kathrin Salazar -4848 | M | train-clean-360 | 25.09 | Dee Wykoff -4852 | M | test-other | 10.20 | Arthur Piantadosi -4853 | F | train-clean-100 | 25.04 | Barbara Derksen -4854 | M | train-clean-360 | 25.20 | Doctor_wu -4856 | M | train-clean-360 | 25.04 | Steven Seitel -4859 | M | train-clean-100 | 20.37 | nathank -4860 | M | train-clean-360 | 20.58 | Jonah Cummings -4863 | M | train-other-500 | 30.16 | I M CLIFFORD -4872 | M | train-other-500 | 30.02 | R E Faust -4894 | M | train-other-500 | 20.97 | Gary Dzierlenga -4898 | M | train-clean-100 | 25.11 | greatbasinrain -4899 | F | train-clean-360 | 25.23 | Theresa L. Downey -4910 | F | train-other-500 | 21.56 | Amanda Martin Sandino -4915 | M | train-other-500 | 26.95 | Andrew Bowles -4926 | F | train-clean-360 | 25.21 | browneyedgirl32382 -4930 | M | train-other-500 | 30.19 | Adrian Levitsky -4931 | M | train-other-500 | 18.71 | KevS -4936 | F | train-other-500 | 28.12 | jedopi -4945 | M | train-clean-360 | 25.07 | Charles RUHE -4948 | M | train-other-500 | 30.11 | Tom Barron -4955 | M | train-other-500 | 24.90 | Elwood Mott -4957 | F | train-clean-360 | 25.06 | P Moscato -4958 | M | train-other-500 | 16.99 | David P. Sroka -4959 | F | train-other-500 | 21.22 | Piper Hayes -4964 | F | train-other-500 | 25.18 | rashada -4965 | F | train-other-500 | 27.43 | Rachel Craig -4967 | F | train-clean-360 | 25.02 | Karen -4969 | M | train-other-500 | 30.07 | Garth Burton -4970 | F | test-clean | 8.15 | airandwaters -4973 | M | train-clean-360 | 25.03 | Michael Lipschultz -4979 | M | train-other-500 | 22.72 | Eric -4991 | F | train-other-500 | 28.58 | Jacqueline (Jacqui) Grady -4992 | F | test-clean | 8.21 | Joyce Martin -4993 | M | train-other-500 | 30.22 | BillMac -5000 | F | train-other-500 | 20.78 | Anna-Lisa Ott -5002 | M | train-clean-360 | 22.52 | Brendan Stallard -5005 | F | train-other-500 | 29.27 | pinhsien -5007 | F | train-clean-360 | 22.98 | Kathleen Nelson -5009 | M | train-other-500 | 30.12 | Michael Reuss -5012 | F | train-clean-360 | 25.06 | Morgan Schlicker -5013 | M | train-other-500 | 25.43 | Joseph Dsouza -5019 | F | train-other-500 | 29.72 | Sandra Estenson -5022 | F | train-clean-100 | 25.12 | Kathleen Costa -5023 | F | train-other-500 | 26.64 | Elizabeth Zaranka -5029 | F | train-clean-360 | 25.02 | Courtney Sandhu -5036 | F | train-other-500 | 27.42 | NicolaRuth -5038 | M | train-other-500 | 30.14 | John Kooz -5039 | F | train-clean-360 | 25.10 | Inga Parsons -5043 | M | train-other-500 | 30.25 | edbucks -5044 | F | train-other-500 | 22.47 | Andrea Keene -5045 | F | train-other-500 | 30.24 | Mounica -5049 | M | train-clean-100 | 25.08 | Bradley Smith -5054 | F | train-clean-360 | 25.13 | Denice Stradling -5060 | F | train-other-500 | 30.03 | Linda Moreau -5062 | F | train-clean-360 | 25.09 | E Ogston -5063 | F | train-clean-360 | 7.96 | susanfrom -5076 | M | train-other-500 | 30.19 | Jules Hawryluk -5077 | F | train-other-500 | 30.05 | Sandra G -5082 | F | train-other-500 | 30.11 | SummerWind -5092 | M | train-clean-360 | 25.24 | Josh Smith -5093 | F | train-clean-360 | 25.23 | Nicole Kay -5101 | F | train-other-500 | 23.83 | E.Lee -5104 | M | train-clean-100 | 25.03 | Chuck Burke -5105 | M | test-clean | 8.12 | elongman -5115 | F | train-clean-360 | 25.01 | Terry Goodyer -5118 | M | train-other-500 | 30.13 | klbonds -5123 | M | train-clean-360 | 25.11 | wvthcomp -5126 | M | train-clean-360 | 25.06 | Tom Lennon -5132 | M | train-other-500 | 25.62 | David Stryker -5133 | F | train-clean-360 | 25.04 | Jo Karabasz -5136 | F | train-other-500 | 30.21 | Felicity C -5139 | F | train-clean-360 | 25.16 | Katine -5141 | M | train-other-500 | 30.17 | David Goldfarb -5142 | F | test-clean | 8.07 | Mary Ballard-Johansson -5147 | M | train-clean-360 | 25.04 | Cody2 -5152 | M | train-other-500 | 30.02 | Liam Neely -5154 | F | train-clean-360 | 22.28 | Danarra -5157 | M | train-clean-360 | 25.25 | drewmac -5163 | F | train-clean-100 | 23.57 | LilyAnne -5164 | F | train-other-500 | 30.09 | Vsilverlining -5172 | M | train-other-500 | 15.94 | Equilibrium33 -5181 | M | train-other-500 | 28.26 | Joel Nisbet -5183 | M | train-other-500 | 30.09 | Kenneth Sergeant Gaghan -5185 | M | train-other-500 | 27.52 | okei -5186 | M | train-clean-360 | 25.00 | Brendan Brown -5189 | M | train-clean-360 | 25.25 | Samanem -5190 | M | train-clean-360 | 25.15 | Rom Maczka -5192 | M | train-clean-100 | 24.14 | Jason Esteves -5198 | M | train-other-500 | 25.89 | Brian -5199 | F | train-other-500 | 21.67 | Diana Fast -5206 | M | train-clean-360 | 25.07 | Simon Dexter -5217 | F | train-other-500 | 4.25 | Anqi Wang -5220 | F | train-other-500 | 30.03 | Mary Schneider -5224 | M | train-other-500 | 29.58 | Matt Soar -5230 | F | train-other-500 | 26.89 | Aubrey Anne -5233 | F | train-other-500 | 17.95 | summerdaze -5239 | M | train-clean-360 | 25.05 | compozr -5242 | M | train-clean-360 | 22.52 | Michael Monhollon -5244 | F | train-other-500 | 29.49 | Carolin Ksr -5245 | M | train-other-500 | 26.36 | Dymmesdale -5246 | M | train-clean-360 | 22.77 | Mike Bloomfield -5248 | M | train-other-500 | 30.23 | Don Stirno -5252 | M | train-other-500 | 30.14 | Michael Deng -5261 | M | train-clean-360 | 25.14 | Ali Kazerani -5266 | F | train-clean-360 | 23.87 | Jill -5269 | F | train-other-500 | 4.84 | Elizabeth Barr -5271 | F | train-other-500 | 24.92 | Amanda -5278 | M | train-other-500 | 29.66 | Mike Harris -5280 | M | train-other-500 | 30.05 | penboy7000 -5285 | F | train-other-500 | 30.07 | Sweetlilbirdy -5287 | F | train-other-500 | 23.96 | adsum iam -5290 | F | train-clean-360 | 25.04 | Natalie -5293 | M | train-clean-360 | 21.97 | Ned Troxel -5296 | F | train-other-500 | 22.97 | Joselyn Hasty -5299 | F | train-other-500 | 28.69 | Becky Doughty -5304 | M | train-clean-360 | 21.08 | Don W. Jenkins -5319 | M | train-clean-360 | 25.13 | Guero -5321 | M | train-other-500 | 29.97 | Adam Whybray -5322 | M | train-clean-100 | 25.03 | Jay Bidal -5325 | M | train-other-500 | 18.83 | Rory Lawton -5328 | M | train-other-500 | 28.14 | Nathan Jordan -5333 | M | train-clean-360 | 25.07 | Robert Fletcher -5337 | F | train-clean-360 | 23.43 | Danielle -5338 | F | dev-clean | 8.07 | S R Colon -5339 | F | train-clean-100 | 25.13 | Lauren McCullough -5340 | F | train-other-500 | 24.25 | Mary-Beth Blackburn -5350 | F | train-other-500 | 29.53 | Cath Garde -5355 | F | train-other-500 | 30.17 | Carrie Heyes -5361 | F | train-other-500 | 28.03 | scarlettraces -5375 | F | train-other-500 | 28.35 | BumbleVee -5379 | M | train-other-500 | 24.72 | lennich -5386 | M | train-clean-360 | 25.16 | Tim Ferreira -5389 | M | train-clean-360 | 25.03 | Joseph Lawler -5390 | M | train-clean-100 | 25.20 | Charles Bice -5393 | F | train-clean-100 | 25.22 | Amy Hengst -5400 | F | train-clean-360 | 25.25 | Natalie Sullivan -5401 | M | train-clean-360 | 25.20 | Andrew Nelson -5405 | F | train-other-500 | 30.08 | Anka -5412 | F | train-other-500 | 12.44 | tommybascue -5424 | F | train-other-500 | 30.04 | Julia Niedermaier -5429 | M | train-other-500 | 25.06 | Dennis Lane Pretoria -5439 | F | train-other-500 | 30.06 | Laine S. -5442 | F | test-other | 10.11 | oneiros81 -5445 | F | train-other-500 | 30.07 | Liz DeLassus -5448 | M | train-clean-360 | 20.40 | Bryan Reid -5456 | M | train-clean-100 | 19.77 | e_scarab -5459 | M | train-other-500 | 16.04 | bryan.peterson -5460 | M | train-other-500 | 28.84 | Max Lindberg -5463 | M | train-clean-100 | 25.00 | GLM -5468 | F | train-other-500 | 30.12 | ashleighjane -5471 | F | train-other-500 | 27.22 | ElleyKat -5480 | F | train-other-500 | 30.01 | ESFJ Girl -5484 | F | test-other | 10.11 | Nastassia -5487 | F | train-other-500 | 28.40 | Michaela O'Connor -5489 | F | train-clean-360 | 22.21 | LizMourant -5506 | M | train-other-500 | 29.80 | Frank Booker -5513 | M | train-clean-360 | 23.93 | David Callahan -5514 | F | train-clean-100 | 17.39 | Ella Jane Quentin -5519 | M | train-clean-360 | 23.06 | scoutman77 -5536 | M | dev-clean | 8.13 | David Mix -5538 | F | train-clean-360 | 25.06 | Linda Velwest -5543 | F | dev-other | 10.07 | Anya -5545 | M | train-other-500 | 30.04 | Gary Olman -5561 | F | train-clean-100 | 23.86 | Ellen Jones -5565 | M | train-other-500 | 17.18 | Ken Padgitt -5567 | M | train-other-500 | 17.50 | BStapley -5569 | F | train-other-500 | 17.39 | Beth Hitesman -5570 | F | train-clean-360 | 25.05 | Corinna Schultz -5583 | F | train-clean-360 | 25.25 | Claudia Wilson -5588 | F | train-clean-360 | 25.09 | Gail Timmerman Vaughan -5604 | F | train-clean-360 | 25.05 | kittyandcheese -5606 | F | train-clean-360 | 25.11 | PrincessG -5618 | F | train-clean-360 | 25.07 | Shirleyroses -5620 | M | train-other-500 | 16.40 | jerryB -5622 | F | train-clean-360 | 25.15 | Roseanne Schmidt -5628 | M | train-other-500 | 30.02 | Adrian Wheal -5635 | M | train-clean-360 | 25.07 | Matthew Reece -5636 | F | train-other-500 | 30.17 | Joyce Couch -5637 | M | train-clean-360 | 17.23 | Anthony -5639 | M | test-clean | 8.28 | Ulf Bjorklund -5641 | M | train-other-500 | 27.47 | Gerald Peter Morgan -5649 | F | train-other-500 | 30.08 | hazelra -5652 | F | train-clean-100 | 25.05 | amicrazy2u -5653 | F | train-other-500 | 30.06 | Kimberly Anderson -5655 | F | train-clean-360 | 25.14 | Christine Rodriguez -5656 | M | train-clean-360 | 25.17 | Joe Mabry -5660 | F | train-clean-360 | 25.17 | hollz -5661 | F | train-other-500 | 30.04 | Dianne Lanning -5665 | F | train-other-500 | 26.45 | Lynda Sizemore -5671 | F | train-other-500 | 30.11 | Trihypoo -5672 | M | train-clean-360 | 25.21 | Jacob Paul Starr -5678 | M | train-clean-100 | 25.10 | jgoffena -5682 | F | train-other-500 | 30.15 | Lmwong -5683 | F | test-clean | 8.01 | Rachael Lapidis -5684 | F | train-clean-360 | 22.39 | Elsa Youngsteadt -5688 | F | train-clean-100 | 25.17 | Jennifer Dionne -5694 | M | dev-clean | 8.01 | Winston Tharp -5700 | M | train-other-500 | 30.13 | Paul Adams -5703 | M | train-clean-100 | 25.10 | Garth Comira -5712 | F | train-clean-360 | 25.06 | Alexandra Huckabay -5717 | M | train-clean-360 | 25.14 | Phil Chenevert -5719 | M | train-other-500 | 27.22 | John Fricker -5720 | F | train-other-500 | 30.12 | Thelma Meyer -5723 | F | train-clean-360 | 25.24 | Linda Hogan -5724 | F | train-clean-360 | 25.01 | paintgirl -5725 | F | train-other-500 | 26.86 | doublemirrors -5727 | M | train-clean-360 | 25.25 | JDavidMoore -5731 | F | train-clean-360 | 25.14 | Andrea Boltz -5733 | F | train-other-500 | 30.22 | Spinhop -5735 | F | train-other-500 | 11.45 | Filipa -5740 | F | train-clean-360 | 25.22 | Alisa -5746 | M | train-clean-360 | 25.08 | DL Pead -5750 | M | train-clean-100 | 25.08 | laurencetrask -5756 | F | train-other-500 | 25.36 | Mich_elle -5764 | M | test-other | 10.06 | Herman Roskams -5765 | M | train-other-500 | 30.20 | A. J. Carroll -5767 | M | train-clean-360 | 17.85 | taijohn -5772 | M | train-other-500 | 30.06 | jessecoy -5776 | M | train-clean-360 | 17.71 | Chris Pauley -5778 | F | train-clean-100 | 21.81 | Laura Victoria -5781 | M | train-other-500 | 30.14 | Parrot17 -5784 | M | train-other-500 | 30.01 | Chris Donnelly -5789 | F | train-clean-100 | 25.16 | Kirsten Wever -5791 | M | train-other-500 | 30.15 | croudy -5796 | F | train-other-500 | 30.15 | Linette Geisel -5802 | M | train-clean-360 | 25.22 | Christopher Maust -5808 | M | train-clean-100 | 25.16 | jeandelfrio -5809 | F | train-clean-360 | 25.25 | kattekliek -5810 | M | train-clean-360 | 25.02 | Patrick Reinhart -5825 | F | train-other-500 | 30.25 | Vira Denton -5826 | M | train-other-500 | 30.12 | Phineas Redux -5831 | F | train-other-500 | 30.20 | Kirsty Leishman -5837 | F | train-other-500 | 24.19 | Debbie Pieterse -5840 | M | train-other-500 | 20.88 | Dick Summerfield -5849 | F | dev-other | 10.00 | ashleyspence -5854 | M | train-other-500 | 21.70 | Gabriel Glenn -5860 | F | train-other-500 | 27.18 | J L Raimundo -5867 | F | train-clean-100 | 23.63 | Sharon Omi -5868 | M | train-clean-360 | 25.06 | alwpoe -5874 | M | train-other-500 | 29.88 | Paul Andrews -5876 | F | train-clean-360 | 25.15 | kelleywyskiel -5883 | M | train-clean-360 | 25.03 | Jerry Romero -5886 | M | train-other-500 | 20.49 | Simon Brown -5890 | F | train-other-500 | 16.91 | GabrielleC -5893 | F | train-other-500 | 30.12 | Elizabeth Fiedler -5894 | M | train-other-500 | 30.01 | Paul Stephens -5895 | F | dev-clean | 8.02 | iamartin -5906 | F | train-other-500 | 29.04 | Lily-LLM -5909 | M | train-clean-360 | 25.14 | Mark Mickelson -5910 | M | train-other-500 | 18.31 | Anthony Lee -5911 | M | train-other-500 | 30.14 | Paul C. Newman -5913 | M | train-other-500 | 30.24 | dmbrought -5914 | M | train-clean-360 | 25.14 | bobbybrill -5918 | M | train-clean-360 | 25.20 | Mike Wajda -5929 | F | train-other-500 | 27.51 | Gryphon Perkins -5933 | M | train-other-500 | 27.99 | Barry O'Neill -5935 | M | train-clean-360 | 25.07 | Mike Okonek -5940 | M | train-clean-360 | 25.06 | Gargoyle -5949 | F | train-other-500 | 28.22 | debolee -5951 | M | train-other-500 | 25.81 | Stevan Simmons -5952 | F | train-other-500 | 29.66 | sherlock85 -5968 | F | train-clean-360 | 25.05 | Cate Barratt -5970 | M | train-other-500 | 27.77 | Larry Degala -5975 | M | train-clean-360 | 25.12 | Tony Maxey -5977 | M | train-other-500 | 30.18 | Ken Felt -5979 | M | train-other-500 | 30.12 | Pentti Hirvonen -5980 | F | train-other-500 | 17.12 | Nichole Thompson -5983 | F | train-other-500 | 30.15 | Katew -5984 | F | train-clean-360 | 25.06 | sbburke -5985 | M | train-clean-360 | 25.01 | James K. White -5993 | M | train-other-500 | 30.18 | garyday -6000 | F | train-clean-100 | 18.04 | MissRose -6003 | M | train-other-500 | 9.91 | sparks0314 -6006 | F | train-clean-360 | 25.16 | Stephanie Lee -6009 | M | train-other-500 | 30.01 | AVG -6010 | M | train-other-500 | 30.17 | Ralph Kerwin -6014 | F | train-clean-360 | 25.09 | Tina Nuzzi -6019 | M | train-clean-100 | 25.17 | DerekP -6025 | F | train-other-500 | 29.77 | Lonelle Yoder -6030 | F | train-other-500 | 30.00 | Shiromi -6032 | F | train-clean-360 | 25.14 | Beverly Scott -6035 | M | train-other-500 | 29.45 | Marty Kris -6037 | M | train-clean-360 | 8.12 | bish -6038 | F | train-clean-360 | 25.17 | Sirmelja -6051 | M | train-other-500 | 24.29 | Ric Cornwall -6054 | F | train-clean-360 | 18.24 | Leslie Stevens Suhy -6060 | M | train-clean-360 | 22.81 | Jonathan Lange -6064 | F | train-clean-100 | 25.04 | Deborah Knight -6065 | M | train-other-500 | 24.49 | David Olson -6070 | F | test-other | 10.01 | Saab -6072 | F | train-other-500 | 24.62 | CrowGirl -6075 | M | train-clean-360 | 25.08 | Rob Smith -6076 | M | train-other-500 | 30.03 | Saethram -6077 | M | train-other-500 | 30.25 | Steve Belleguelle -6078 | F | train-clean-100 | 25.02 | dobsonfly -6080 | M | train-clean-360 | 25.18 | progressingamerica -6081 | M | train-clean-100 | 25.10 | Lazuli -6082 | F | train-clean-360 | 25.06 | EyeBones -6084 | M | train-other-500 | 22.16 | Amallen -6087 | F | train-other-500 | 27.90 | Caroline Driggs -6088 | F | train-other-500 | 30.12 | burk -6097 | M | train-other-500 | 30.12 | Phil Benson -6098 | M | train-clean-360 | 25.07 | Kancamagus -6099 | F | train-clean-360 | 25.17 | Cheri Gardner -6102 | F | train-other-500 | 15.61 | Rachel Bossier -6104 | F | train-clean-360 | 25.15 | Juliana M. -6106 | F | train-other-500 | 23.92 | Ruth Kidson -6111 | F | train-other-500 | 30.14 | Jill Preston -6115 | M | train-clean-360 | 25.10 | MitchHerd -6119 | M | train-clean-360 | 18.01 | Vinnie Tesla -6120 | F | train-clean-360 | 24.31 | Terra Mendoza -6121 | F | train-other-500 | 30.10 | Imagine -6123 | F | dev-other | 10.06 | chocmuse -6126 | M | train-other-500 | 19.22 | David Abbott -6127 | F | train-other-500 | 30.20 | Andee -6128 | F | test-other | 10.13 | Isabelle Brasme -6131 | F | train-other-500 | 21.84 | Malane -6135 | F | train-other-500 | 22.88 | Spike Holcomb -6138 | F | train-other-500 | 30.09 | Deborah Brabyn -6139 | F | train-clean-360 | 25.08 | Lois C. Johnson -6145 | F | train-other-500 | 30.07 | Madeleine Brook -6147 | F | train-clean-100 | 25.05 | Liberty Stump -6153 | F | train-other-500 | 30.16 | anjieliu -6157 | M | train-clean-360 | 22.97 | HotConflict -6159 | M | train-other-500 | 26.45 | Ted Garvin -6160 | F | train-clean-360 | 17.76 | FaithR -6167 | F | train-clean-360 | 25.08 | Janet -6173 | F | train-other-500 | 30.14 | Carol Box -6177 | M | train-other-500 | 30.02 | wminbru -6178 | F | train-other-500 | 21.18 | alegriavida -6181 | M | train-clean-100 | 25.09 | Mike -6184 | M | train-other-500 | 23.82 | Adam Tomkins -6188 | F | train-clean-360 | 22.61 | Roxanna Nazari -6189 | F | train-clean-360 | 23.67 | Shana Cohen -6196 | M | train-other-500 | 11.75 | Martin Gradwell -6199 | M | train-other-500 | 30.08 | bobolink -6206 | F | train-clean-360 | 25.12 | Yvonne Smith -6209 | M | train-clean-100 | 25.04 | deckerteach -6211 | F | train-other-500 | 30.18 | Caeliveres -6215 | F | train-clean-360 | 25.08 | Janet248 -6221 | M | train-other-500 | 22.84 | pwu909 -6224 | M | train-other-500 | 30.16 | dave k -6227 | F | train-other-500 | 30.05 | EliMarieHK -6232 | M | train-other-500 | 18.47 | Paul Denton -6233 | F | train-clean-360 | 25.24 | Gen Jones -6235 | F | train-clean-360 | 21.98 | ReadWriteLib -6236 | M | train-other-500 | 29.03 | jcwyatt -6241 | M | dev-clean | 8.05 | badey -6242 | F | train-other-500 | 26.65 | Lucinda Gainey -6248 | M | train-other-500 | 30.24 | Kevin Green -6249 | M | train-other-500 | 20.45 | Thomas A. Copeland -6251 | F | train-other-500 | 30.03 | Theresa Sheridan -6254 | F | train-other-500 | 19.26 | Chelsea S. -6258 | M | train-clean-360 | 20.49 | haggisreflux -6267 | M | dev-other | 10.06 | Cata -6269 | M | train-clean-360 | 25.13 | Don Halpert -6272 | F | train-clean-100 | 25.14 | jlenardon -6276 | M | train-other-500 | 30.17 | dan_h -6281 | F | train-other-500 | 16.33 | Beth Thomas -6284 | F | train-other-500 | 17.71 | cklee -6286 | F | train-clean-360 | 25.01 | Wendy Almeida -6288 | F | train-clean-360 | 25.07 | Sunni West -6294 | M | train-clean-360 | 24.10 | humanode -6295 | M | dev-clean | 8.04 | Michael Packard -6300 | F | train-clean-360 | 25.07 | Sarah Crampton -6308 | F | train-clean-360 | 23.36 | Easton -6311 | M | train-other-500 | 21.53 | TRUEBRIT -6313 | F | dev-clean | 8.17 | Jennifer Wiginton -6317 | F | train-clean-360 | 25.20 | Sarah K -6319 | F | dev-clean | 8.01 | thestorygirl -6323 | M | train-other-500 | 18.48 | Caluminium -6324 | F | train-other-500 | 7.40 | Barbara E. McCarthy -6330 | M | train-clean-360 | 25.04 | David Cummings -6332 | F | train-other-500 | 18.50 | Kelli England -6333 | M | train-other-500 | 29.43 | Max Korlinge -6339 | F | train-clean-360 | 25.13 | Michelle Remington -6341 | F | train-clean-360 | 23.72 | Tiffany J. Kim -6345 | F | dev-clean | 8.07 | Jean Bascom -6346 | M | train-other-500 | 13.65 | Matthew Pagan -6351 | F | train-other-500 | 24.51 | C. L. W. Rollins -6352 | F | train-clean-360 | 22.96 | stmacduff -6353 | F | train-other-500 | 30.20 | Jennifer Randall -6356 | M | train-other-500 | 30.03 | John O -6358 | F | train-other-500 | 30.24 | selway -6359 | F | train-clean-360 | 18.27 | Susan Hanfield -6364 | M | train-other-500 | 30.02 | Todd Ulbrich -6367 | M | train-clean-100 | 25.04 | Vince Dee -6368 | M | train-other-500 | 18.20 | Marc Pizzuti -6370 | M | train-other-500 | 29.53 | Dan Craig -6371 | F | train-clean-360 | 21.30 | Rebecca King -6373 | F | train-clean-360 | 25.20 | Sandie Guenther -6377 | M | train-other-500 | 30.03 | Maxim Babich -6378 | F | train-clean-360 | 23.17 | Michelle Day -6385 | F | train-clean-100 | 25.09 | Novella Serena -6388 | F | train-clean-360 | 23.04 | Leda -6391 | F | train-other-500 | 15.17 | polkadotish -6395 | M | train-clean-360 | 25.06 | Richard Carpenter -6399 | M | train-other-500 | 29.43 | Edmund Bloxam -6402 | M | train-other-500 | 29.38 | Chiquito Crasto -6406 | F | train-clean-360 | 21.92 | Abigail Rasmussen -6407 | M | train-other-500 | 30.06 | AdamH -6411 | F | train-other-500 | 18.23 | Feyaza -6415 | F | train-clean-100 | 25.18 | Daryl Wor -6418 | M | train-other-500 | 30.02 | Iolo Jones -6426 | F | train-clean-360 | 25.14 | Pat Redstone -6432 | M | test-other | 10.02 | Ditchdog -6436 | M | train-other-500 | 28.84 | Steve Mattingly -6437 | M | train-clean-100 | 25.09 | John Hoerr -6446 | M | train-clean-360 | 25.11 | Bob Gonzalez -6454 | M | train-clean-100 | 25.22 | David Wales -6455 | F | dev-other | 7.14 | Betty Chen -6458 | M | train-clean-360 | 25.05 | Dennis Blake -6459 | M | train-other-500 | 26.29 | Nigel Boydell -6467 | M | dev-other | 10.04 | sid -6476 | F | train-clean-100 | 25.17 | Viridian -6482 | M | train-other-500 | 27.01 | Delmar H Dolbier -6484 | F | train-other-500 | 29.16 | ilianthe -6488 | F | train-other-500 | 19.83 | Kendall Ashyby -6492 | M | train-clean-360 | 22.75 | Hugh Gillis -6494 | M | train-clean-360 | 25.15 | Morey Kunin -6497 | M | train-clean-360 | 25.04 | James E. Carson -6499 | M | train-clean-360 | 25.19 | dave7 -6505 | F | train-clean-360 | 25.00 | Elena -6506 | M | train-other-500 | 23.36 | Tim Quinn -6509 | F | train-clean-360 | 25.22 | Marianna Foos -6510 | M | train-clean-360 | 25.05 | JimD -6512 | M | train-other-500 | 30.26 | mcgovern1934 -6513 | F | train-other-500 | 30.12 | Susan de Raadt -6518 | F | train-clean-360 | 25.05 | Wayfarer -6519 | F | train-clean-360 | 25.23 | Monica Knuppe -6529 | M | train-clean-100 | 25.04 | Fred DeBerardinis -6531 | F | train-clean-100 | 21.46 | janesandberg -6533 | M | train-other-500 | 26.88 | drewmore -6534 | F | train-other-500 | 30.00 | Helen Falconer -6535 | M | train-other-500 | 13.21 | Ron Altman -6538 | M | train-clean-360 | 25.19 | Juan Federico -6539 | M | train-other-500 | 29.19 | David W. Wolfe -6540 | M | train-other-500 | 28.77 | Craig Gulliver -6544 | F | train-clean-360 | 25.22 | Amanda Friday -6548 | F | train-other-500 | 27.26 | Kristin Gjerlw -6549 | F | train-other-500 | 28.81 | Sandra Luna -6550 | M | train-clean-360 | 25.07 | elfpen -6553 | M | train-clean-360 | 25.18 | DublinGothic -6555 | M | train-clean-360 | 25.02 | Alexandre Laplante -6557 | F | train-other-500 | 27.34 | Tika Sabu -6563 | M | train-clean-100 | 21.58 | William Tomcho -6567 | F | train-clean-360 | 25.05 | vikvenom -6568 | F | train-other-500 | 28.93 | Heather Hamtil -6574 | M | train-clean-360 | 25.02 | Caden Vaughn Clegg -6575 | M | train-clean-360 | 24.07 | Patrick Painter -6583 | F | train-other-500 | 30.12 | NastassiaS -6590 | F | train-other-500 | 30.01 | Marea Brook -6594 | F | train-other-500 | 30.08 | Amelia Chantarotwong -6599 | M | dev-other | 3.03 | rohde -6609 | M | train-other-500 | 29.53 | Patrick Wallace -6610 | F | train-other-500 | 30.07 | sylly -6614 | F | train-other-500 | 28.25 | Veronica Schlette -6620 | F | train-clean-360 | 12.88 | Amy Koenig -6625 | M | train-other-500 | 30.10 | hearmeout7 -6627 | F | train-other-500 | 14.57 | Amber Hamilton -6636 | M | train-other-500 | 27.50 | Philip Martin -6637 | F | train-clean-360 | 25.21 | Christine Nendza -6641 | F | train-other-500 | 29.93 | Julienne -6643 | F | train-clean-360 | 25.14 | cbooren -6652 | M | train-other-500 | 25.43 | Brendon Wright -6660 | F | train-other-500 | 30.19 | Nicole Lee -6668 | M | train-other-500 | 30.01 | Ecological Humanist -6670 | M | train-other-500 | 29.92 | Mike Pelton -6673 | F | train-clean-360 | 20.46 | Jenna Lanman -6674 | M | train-other-500 | 28.55 | jimmylee -6676 | F | train-other-500 | 27.67 | Chill28 -6683 | F | train-clean-360 | 25.22 | Julia Kelley -6685 | M | train-other-500 | 23.76 | Jonathan Drury -6686 | M | train-clean-360 | 20.63 | Elin -6687 | M | train-other-500 | 27.69 | KirksVoice -6689 | F | train-other-500 | 28.36 | Tiffany Halla Colonna -6690 | M | train-clean-360 | 23.34 | T Michael Burke -6694 | M | train-clean-360 | 25.02 | Ross Williamson -6695 | F | train-other-500 | 28.66 | Linda Fredericks -6696 | F | train-clean-360 | 25.14 | Katryn Wiese -6701 | M | train-clean-360 | 25.13 | Dayle -6705 | F | train-other-500 | 30.05 | D. A. Frank -6707 | M | train-other-500 | 27.06 | Lewis -6709 | M | train-other-500 | 26.15 | vinphizz -6713 | M | train-other-500 | 12.85 | stephenreader -6724 | F | train-other-500 | 30.05 | Kristin Young -6726 | F | train-other-500 | 30.15 | metgmz -6727 | M | train-clean-360 | 9.40 | Tony Russell -6733 | F | train-other-500 | 27.65 | Snapdragon -6735 | F | train-other-500 | 30.11 | fshort -6741 | F | train-other-500 | 24.76 | Sharon C. -6743 | M | train-other-500 | 9.91 | Rick Rodney -6746 | M | train-other-500 | 25.94 | Robin Skelcey -6747 | M | train-other-500 | 17.49 | Ryan Lothian -6749 | F | train-other-500 | 30.12 | MaryA -6752 | M | train-other-500 | 26.78 | maxvon_d -6753 | M | train-other-500 | 13.29 | T.E. McHenry -6754 | M | train-other-500 | 30.04 | ToddHW -6758 | F | train-other-500 | 12.46 | The Gypsy -6763 | F | train-clean-360 | 21.20 | Manjit Bains -6773 | M | train-other-500 | 17.55 | MostafaRazavi -6777 | M | train-other-500 | 30.23 | Rick Saffery -6782 | F | train-clean-360 | 23.36 | zcameo -6784 | M | train-other-500 | 29.98 | SteveBuys -6788 | F | train-clean-360 | 25.11 | Pamela Krantz -6792 | M | train-other-500 | 30.24 | montmorency -6794 | F | train-other-500 | 21.11 | Rachel Moyar -6798 | M | train-other-500 | 30.04 | Aesthete's Readings -6804 | M | train-other-500 | 30.19 | Nick Duncan -6807 | F | train-other-500 | 30.08 | Lisa Caputo -6818 | F | train-clean-100 | 25.17 | beckyboyd -6821 | F | train-other-500 | 21.87 | Rholdah -6828 | F | train-clean-360 | 25.11 | Lori Fuller Chugiak, AK -6829 | F | test-clean | 8.24 | LadyBug -6836 | M | train-clean-100 | 25.01 | John -6841 | M | dev-other | 10.06 | A. E. Maroney -6846 | M | train-other-500 | 18.48 | John Leonard -6848 | M | train-clean-100 | 25.17 | KarlHenning -6849 | M | train-other-500 | 26.68 | Dan Raynham -6853 | F | train-other-500 | 22.04 | J. McKnight -6865 | F | train-clean-360 | 25.03 | Jing Li -6875 | M | train-other-500 | 21.09 | Bill Miller -6877 | M | train-clean-360 | 25.23 | Bear Schacht -6880 | M | train-clean-100 | 25.10 | Capybara -6882 | M | train-other-500 | 29.24 | David Isenhower -6883 | M | train-other-500 | 30.05 | Adam Doughty -6892 | M | train-other-500 | 30.05 | Piotr Nater -6895 | F | train-clean-360 | 25.23 | Reeses118 -6902 | F | train-other-500 | 23.36 | Barbara Edelman -6904 | F | train-clean-360 | 24.57 | Kirsten Nelson -6906 | F | train-other-500 | 20.67 | Joanna1 -6912 | M | train-other-500 | 30.13 | Richard Beck -6913 | F | train-other-500 | 12.55 | daisyb -6914 | F | train-other-500 | 28.92 | Katalina Watt -6918 | F | train-clean-360 | 25.11 | Marilyn Mack -6923 | M | train-other-500 | 30.15 | Szindbad -6924 | F | train-clean-360 | 25.12 | Rapunzelina -6925 | M | train-clean-100 | 17.07 | Thomas Meaney -6927 | F | train-clean-360 | 25.00 | Sarika Pawar -6930 | M | test-clean | 8.00 | Nolan Fout -6937 | F | train-clean-360 | 23.29 | DVoice -6938 | F | test-other | 2.64 | Simmy -6943 | F | train-other-500 | 30.21 | Chieko Steely -6945 | M | train-other-500 | 30.07 | Daniel George -6947 | F | train-other-500 | 30.22 | Grace -6950 | F | train-other-500 | 27.30 | elmay -6951 | F | train-other-500 | 18.65 | redhed3095 -6954 | M | train-other-500 | 30.08 | Paul Richards -6956 | M | train-clean-360 | 25.10 | DannyHauger -6962 | M | train-other-500 | 10.53 | mattoscarlomas -6963 | M | train-other-500 | 23.89 | Kasper -6965 | M | train-clean-360 | 25.00 | NoelBadrian -6967 | F | train-other-500 | 30.06 | sganatra81 -6974 | M | train-other-500 | 8.01 | Michael Armenta -6978 | F | train-other-500 | 30.04 | Debra -6981 | M | train-clean-360 | 25.09 | nlonghu -6993 | M | train-clean-360 | 25.24 | Seyed -7000 | M | train-clean-360 | 24.75 | Kevin Alix -7001 | F | train-other-500 | 30.09 | Arienne -7008 | M | train-other-500 | 21.23 | John Trevithick -7009 | M | train-other-500 | 24.38 | roeg11 -7011 | M | train-clean-360 | 17.59 | Icprice -7012 | F | train-other-500 | 30.00 | Erin McKelle -7018 | M | test-other | 10.24 | FSharp -7021 | M | test-clean | 8.14 | Nodo420 -7026 | F | train-other-500 | 23.84 | Michele Eaton -7030 | M | train-clean-360 | 20.57 | Conrad T -7046 | M | train-other-500 | 24.11 | Pascal Ramseier -7051 | M | train-clean-360 | 13.88 | Andrew White -7055 | M | train-other-500 | 30.03 | gemtwist -7059 | F | train-clean-100 | 25.02 | Joannemmp -7061 | M | train-clean-360 | 25.26 | AllenJohns -7062 | F | train-other-500 | 28.30 | Rebecca Thomas -7065 | M | train-other-500 | 24.16 | smitaj -7067 | M | train-clean-100 | 25.17 | Matthew Wall -7069 | M | train-clean-360 | 25.08 | John Schuurman -7073 | F | train-other-500 | 24.98 | Jill Janovetz -7078 | F | train-clean-100 | 25.14 | Mary in Arkansas -7079 | F | train-other-500 | 29.43 | Chuck Williamson -7085 | M | train-clean-360 | 25.19 | voicebynatalie -7090 | M | train-clean-360 | 25.05 | Jon Sindell -7092 | F | train-other-500 | 30.15 | Lorraine B -7095 | M | train-clean-360 | 25.15 | Wesseling -7096 | M | train-other-500 | 17.43 | Gary Iredale -7097 | F | train-other-500 | 26.23 | novelreader -7105 | M | test-other | 10.15 | jennycbnyn -7107 | M | train-other-500 | 30.09 | titankin77 -7113 | F | train-clean-100 | 25.20 | Sukaina Jaffer -7117 | F | train-clean-360 | 25.17 | Art Leung -7120 | F | train-clean-360 | 25.10 | L D Hamilton -7121 | M | train-other-500 | 27.88 | 384403 -7125 | F | train-other-500 | 18.82 | Peggy -7126 | M | train-clean-360 | 21.69 | pekein -7127 | M | test-clean | 8.32 | Bill Kneeland -7128 | M | train-clean-360 | 25.01 | morganreads -7131 | F | train-other-500 | 24.22 | Eden Rea-Hedrick -7134 | M | train-clean-360 | 25.10 | Steve Jackson -7135 | F | train-other-500 | 29.21 | Maggie Smallwood -7138 | F | train-other-500 | 30.08 | CaprishaPage -7139 | M | train-clean-360 | 25.11 | gabrielv -7140 | F | train-clean-360 | 23.60 | Deanna Bovee -7143 | F | train-other-500 | 20.54 | Minni Ang -7145 | F | train-clean-360 | 21.84 | Lita Ledesma -7147 | M | train-other-500 | 19.94 | S.Nevets -7148 | F | train-clean-100 | 25.02 | Vickie Ranz -7150 | M | train-other-500 | 30.20 | asterix -7155 | M | train-other-500 | 30.11 | pklipp -7169 | M | train-clean-360 | 16.01 | Ryan Ransom -7170 | M | train-other-500 | 25.81 | alanmapstone -7176 | M | test-clean | 8.06 | KalenXI -7177 | F | train-other-500 | 15.43 | shana -7178 | F | train-clean-100 | 25.11 | J.K. Neely -7188 | M | train-clean-360 | 25.07 | Marty -7189 | M | train-other-500 | 29.34 | doonaboon -7190 | M | train-clean-100 | 25.22 | Tony Posante -7197 | F | train-other-500 | 23.88 | Christine Richardson -7198 | F | train-other-500 | 27.75 | Daniela Austin -7199 | F | train-other-500 | 30.01 | T.K. Kirven -7205 | F | train-other-500 | 30.24 | genierose -7208 | M | train-other-500 | 30.10 | KK -7215 | M | train-other-500 | 28.97 | BensonBrunswin -7218 | F | train-other-500 | 28.76 | MJ Franck -7220 | F | train-other-500 | 28.59 | LynnAlison -7223 | F | train-other-500 | 23.26 | eye hear voices -7226 | M | train-clean-100 | 25.05 | Jonathan Moore -7228 | M | train-other-500 | 29.36 | Peter John Keeble -7229 | F | train-clean-360 | 21.53 | Linda Ciano -7238 | M | train-other-500 | 27.44 | Uday Sagar -7239 | M | train-other-500 | 19.74 | manofwealth -7240 | F | train-clean-360 | 25.11 | Lucretia B. -7241 | M | train-clean-360 | 25.16 | AdrianBisson -7242 | F | train-other-500 | 30.02 | Renate -7245 | F | train-clean-360 | 25.04 | Laura Atkinson -7246 | F | train-other-500 | 27.02 | Lyn Silva -7247 | M | train-clean-360 | 25.10 | Robert Hoffman -7250 | F | train-other-500 | 22.08 | A. J. Elliot -7255 | F | train-other-500 | 18.60 | Jendia -7258 | M | train-clean-360 | 25.08 | acloward -7263 | F | train-other-500 | 14.62 | rachaelg -7264 | M | train-clean-100 | 23.42 | Sean McClain -7265 | F | train-other-500 | 30.21 | Annie -7276 | F | train-clean-360 | 25.00 | ASPotter -7277 | F | train-other-500 | 30.02 | Jenny Bradshaw -7278 | M | train-clean-100 | 25.01 | Jon Smith -7285 | F | train-clean-360 | 25.07 | Christina M. Glavas -7286 | F | train-clean-360 | 23.75 | kindfish -7294 | F | train-clean-360 | 25.01 | Muriel -7297 | F | train-clean-360 | 18.65 | Mudlark -7299 | F | train-other-500 | 21.99 | Barbara Miller -7301 | M | train-other-500 | 5.54 | jonseverity -7302 | F | train-clean-100 | 25.10 | Asta1234 -7307 | M | train-other-500 | 27.58 | Anthony Ogus -7312 | M | train-clean-100 | 5.44 | nkneer -7313 | M | train-clean-360 | 25.24 | Mark DeVol -7314 | M | train-clean-360 | 25.17 | Rick Cahill -7315 | F | train-other-500 | 11.77 | Charlotte Duckett -7316 | F | train-clean-360 | 18.80 | Joy S Grape -7318 | F | train-clean-360 | 25.13 | Anise -7320 | F | train-other-500 | 26.51 | Monika Rolley -7326 | M | train-other-500 | 20.91 | Adam -7327 | M | train-other-500 | 25.46 | Tommy Howell -7331 | F | train-other-500 | 30.15 | AnabelleC -7333 | F | train-other-500 | 30.22 | Lydia Paterson -7335 | F | train-clean-360 | 23.72 | Kathryn Louise -7337 | F | train-other-500 | 24.93 | Adina Owen -7338 | M | train-other-500 | 30.11 | Eberle Thomas -7339 | M | train-clean-360 | 25.10 | wildalaska -7342 | F | train-clean-360 | 25.01 | Carol -7346 | M | train-other-500 | 17.89 | James Bendall -7348 | F | train-other-500 | 30.16 | acousticwave -7354 | M | train-other-500 | 30.01 | TrevorD777 -7357 | M | train-other-500 | 12.31 | rebcult -7360 | F | train-other-500 | 27.64 | Caroline Hemmerly Kunkle -7367 | M | train-clean-100 | 25.13 | NIneFive83 -7376 | F | train-other-500 | 30.12 | Nyssa E. Schmidt -7383 | F | train-clean-360 | 20.20 | Meg Cowan -7384 | F | train-clean-360 | 20.30 | Diana Dolan -7387 | F | train-other-500 | 28.58 | Tara Dow -7389 | M | train-other-500 | 30.17 | Steve C -7391 | M | train-other-500 | 30.15 | Cary Simz -7392 | F | train-other-500 | 30.09 | MicheleW -7395 | F | train-clean-360 | 18.05 | Katherine -7398 | F | train-clean-360 | 25.09 | Marie Daum -7402 | M | train-clean-100 | 25.01 | Canby Ibarra -7408 | M | train-other-500 | 30.14 | David Clarke -7416 | F | train-clean-360 | 22.16 | Jeanni Hall -7423 | M | train-other-500 | 30.09 | Gilles G. Le Blanc -7424 | M | train-other-500 | 30.04 | Christopher Smith -7433 | F | train-other-500 | 30.00 | Gabriela Cowan -7434 | F | train-clean-360 | 23.58 | Emily Feuka -7436 | M | train-other-500 | 24.52 | Gregory Eccles -7437 | M | train-clean-360 | 25.20 | Graham McMillan -7445 | F | train-clean-360 | 25.14 | Emily Anderson -7447 | M | train-clean-100 | 25.24 | dasbury -7448 | M | train-other-500 | 18.19 | Kevin Johnson -7460 | M | train-clean-360 | 25.24 | Larry Beasley -7463 | M | train-other-500 | 30.08 | Pete Milan -7467 | F | train-other-500 | 29.01 | freshface -7475 | M | train-clean-360 | 6.10 | Jared Hess -7478 | M | train-clean-360 | 25.03 | Dan Froese -7480 | F | train-other-500 | 23.93 | Tricia F. -7481 | F | train-clean-360 | 22.09 | Karen Howard -7484 | M | train-clean-360 | 22.63 | Tyran Rexx -7491 | F | train-other-500 | 30.11 | Lilaread -7492 | F | train-other-500 | 30.13 | Scheherazade -7495 | F | train-clean-360 | 25.02 | Arlene Joyce -7498 | F | train-clean-360 | 20.70 | MarianneVictoria -7502 | M | train-other-500 | 17.53 | mikefernlea -7505 | M | train-clean-100 | 25.13 | Ron Lockhart -7507 | F | train-other-500 | 30.22 | UnaVersal -7510 | F | train-other-500 | 28.25 | Kathrine Engan -7511 | F | train-clean-100 | 25.00 | Sherri Vance -7512 | M | train-other-500 | 15.20 | dudeman -7514 | F | train-other-500 | 6.57 | Barbara Baker -7515 | F | train-clean-360 | 25.17 | Cynthia Moyer -7517 | F | train-clean-100 | 24.29 | Raz Mason -7518 | M | train-clean-360 | 25.07 | TJDasch -7520 | M | train-clean-360 | 24.21 | Richard Jackson -7522 | F | train-other-500 | 15.28 | Kelsey P -7525 | F | train-clean-360 | 25.19 | Jeannie Tirado -7538 | M | train-clean-360 | 25.04 | Logan West -7540 | M | train-clean-360 | 25.26 | Christopher Webber -7552 | F | train-other-500 | 22.45 | KateC -7553 | M | train-clean-360 | 25.22 | BDSEmpire -7555 | F | train-clean-360 | 23.23 | Suebee -7556 | M | train-other-500 | 30.14 | Alex Lau -7558 | M | train-clean-360 | 11.00 | J. A. Cook -7559 | M | train-other-500 | 29.99 | gassumpcao -7561 | M | train-other-500 | 9.12 | Shawn Bayern -7565 | M | train-other-500 | 30.07 | Derek -7569 | M | train-clean-360 | 25.17 | Stephen L. Moss -7584 | F | train-other-500 | 29.57 | kandice stehlik -7585 | M | train-other-500 | 30.07 | MaxSitting -7594 | F | train-clean-360 | 25.00 | Kristel Tretter -7597 | F | train-other-500 | 30.21 | Inah Derby -7601 | M | dev-other | 10.18 | Malone -7603 | M | train-other-500 | 20.56 | Wupperhippo -7607 | F | train-other-500 | 7.10 | C F de Rosset -7608 | M | train-other-500 | 9.33 | rookieblue -7609 | F | train-other-500 | 30.14 | detroitreads -7618 | M | train-other-500 | 28.96 | Stipsky -7635 | F | train-clean-100 | 25.06 | Judy Guinan -7640 | M | train-other-500 | 28.97 | Dan Darbandi -7641 | M | dev-other | 10.03 | Moromis -7644 | F | train-other-500 | 15.19 | Raphael Platt -7647 | M | train-clean-360 | 21.83 | Daniel T. Miller -7649 | F | train-other-500 | 30.16 | Lanerd -7654 | M | train-other-500 | 12.73 | Word And Mouth -7657 | F | train-clean-360 | 11.93 | shalclark -7665 | M | train-clean-360 | 23.27 | Christian Mitchell -7672 | M | train-other-500 | 30.10 | Cooper Leith -7679 | F | train-other-500 | 30.14 | Libby Gohn -7683 | F | train-other-500 | 17.41 | Carolyne -7687 | F | train-other-500 | 30.05 | Demosthenes -7688 | M | train-clean-360 | 25.19 | Leslie Walden -7691 | M | train-other-500 | 26.40 | engineerdst -7697 | M | dev-other | 10.07 | JustinJYN -7699 | F | train-other-500 | 30.11 | DylanTG -7700 | M | train-other-500 | 28.24 | Dave Wills -7702 | F | train-other-500 | 16.08 | Linda Jenner -7704 | M | train-clean-360 | 25.16 | Robert Harder -7705 | M | train-clean-360 | 25.01 | Timothy Luke -7708 | F | train-other-500 | 29.71 | Savannah -7713 | M | train-other-500 | 30.11 | Sacha Chander -7717 | F | train-clean-360 | 25.01 | Astrid Fingerhut -7720 | M | train-clean-360 | 25.03 | jeffwiltzius -7729 | M | test-clean | 8.17 | Tim Bower -7730 | F | train-clean-360 | 25.23 | Fiddlesticks -7732 | M | train-clean-360 | 24.92 | Daniel Vimont -7733 | F | train-clean-360 | 19.49 | Jewel Raquel -7737 | F | train-other-500 | 27.17 | Elisabeth Sollog -7739 | F | train-clean-360 | 25.19 | Melissa Burns-Price -7746 | M | train-other-500 | 28.01 | Tom Causby -7749 | M | train-other-500 | 22.83 | Sammy Bean -7752 | F | train-clean-360 | 25.08 | Samantha Miles -7754 | F | train-clean-360 | 25.12 | Iridescat -7756 | F | train-other-500 | 30.12 | Lynne Thompson -7762 | F | train-other-500 | 17.51 | Fannie -7764 | M | train-other-500 | 16.55 | Mike Nelson -7766 | F | train-clean-360 | 25.12 | Maryanka -7769 | M | train-other-500 | 29.01 | David Biro -7777 | M | train-clean-360 | 16.44 | Jacob Paine -7780 | F | train-clean-100 | 23.50 | tazzle -7783 | F | train-clean-360 | 20.00 | Rebecca Owens -7786 | M | train-other-500 | 28.11 | Kevin W. Davidson -7789 | F | train-clean-360 | 25.04 | Lauren Jane -7794 | F | train-clean-100 | 25.23 | mlcui -7795 | M | train-other-500 | 18.46 | Cubrick -7796 | M | train-other-500 | 30.13 | Raybrite -7800 | F | train-clean-100 | 25.21 | Arie -7802 | F | train-clean-360 | 25.12 | Samantha J Gubitz -7809 | M | train-clean-360 | 25.10 | D. T. McGregor -7816 | F | train-clean-360 | 25.04 | Stefanie Heinrichs -7823 | M | train-other-500 | 27.40 | Bart in 't Veld -7825 | M | train-clean-360 | 11.35 | PDyer -7826 | M | train-other-500 | 27.31 | Dave Shaw -7828 | M | train-clean-360 | 25.00 | Dan Mason -7832 | M | train-clean-360 | 25.01 | DJRickyV -7833 | M | train-clean-360 | 25.15 | Jesse Crisp-Sears -7835 | M | train-other-500 | 13.79 | kageokami -7837 | M | train-clean-360 | 22.24 | Alfian -7839 | F | train-other-500 | 30.22 | Loveday -7843 | F | train-other-500 | 19.14 | Annette McGuinness -7848 | M | train-other-500 | 29.06 | bala -7850 | F | dev-clean | 8.06 | Jill Engle -7859 | F | train-clean-100 | 21.58 | xinamarieuhl -7867 | M | train-clean-360 | 25.08 | nomorejeffs -7868 | F | train-clean-360 | 25.03 | Chessie Joy -7871 | M | train-other-500 | 30.15 | Rocit -7874 | M | train-clean-360 | 25.16 | dgulino -7879 | F | train-other-500 | 29.10 | deongines -7881 | M | train-clean-360 | 22.90 | Sam Naishtat -7883 | F | train-other-500 | 30.03 | Annapurna -7886 | F | train-other-500 | 7.80 | Mariah Lyons -7892 | F | train-other-500 | 9.14 | Alexis Castro -7898 | F | train-other-500 | 30.09 | Coreena -7902 | M | test-other | 10.09 | Kyle Van DeGlast -7909 | M | train-clean-360 | 1.92 | MGreenberg -7910 | F | train-clean-360 | 25.24 | southernemma -7912 | M | train-other-500 | 30.19 | Nathan Dickey -7923 | M | train-other-500 | 26.15 | amaskill -7925 | F | train-other-500 | 22.64 | Etel Buss -7926 | M | train-clean-360 | 25.18 | Steven Reynolds -7932 | F | train-clean-360 | 25.25 | Tammy Stalcup -7933 | F | train-clean-360 | 25.09 | Highlandoaks -7938 | M | train-clean-360 | 25.18 | Goss45 -7939 | M | train-clean-360 | 25.19 | DPranitis -7942 | M | train-other-500 | 30.02 | Luke Sartor -7945 | F | train-clean-360 | 18.87 | Lois Browne -7946 | F | train-other-500 | 15.89 | Flash -7949 | M | train-clean-360 | 22.19 | Jon Miller -7956 | M | train-clean-360 | 20.78 | Devon Purtz -7957 | M | train-clean-360 | 21.63 | Wiley Combs -7959 | F | train-clean-360 | 25.03 | Lily Took -7962 | F | train-clean-360 | 25.15 | Jolie O'Dell -7967 | F | train-clean-360 | 22.42 | Lois Hill -7975 | M | test-other | 10.04 | William A Crenshaw -7976 | M | dev-clean | 8.13 | JenniferRutters -7981 | M | train-clean-360 | 25.06 | timothyFR -7982 | F | train-clean-360 | 25.11 | Lori Arsenault -7988 | M | train-other-500 | 27.62 | JaySands -7991 | M | train-clean-360 | 25.01 | Aaron Weber -7994 | F | train-clean-360 | 25.08 | Marian Cervassi -7995 | F | train-clean-360 | 25.20 | Marie Hoffman -7997 | M | train-other-500 | 30.16 | Tom Merritt -8005 | F | train-other-500 | 29.84 | Julia Wells -8006 | M | train-clean-360 | 25.10 | TyroneS -8008 | M | train-clean-360 | 25.18 | Paul Adamson -8009 | F | train-other-500 | 30.10 | Frances Brown -8011 | M | train-clean-360 | 25.09 | Greg Giordano -8012 | F | train-other-500 | 30.04 | WoollyBee -8014 | F | train-clean-100 | 14.42 | constatine -8015 | F | train-other-500 | 28.07 | Underhill -8023 | M | train-other-500 | 24.86 | JamesMcAndrew -8028 | M | train-clean-360 | 25.10 | Tom Geller -8033 | M | train-other-500 | 30.08 | geoffbl -8040 | F | train-other-500 | 27.02 | NatalieOram -8042 | M | train-other-500 | 30.18 | Jack Watson Warr -8044 | F | train-other-500 | 30.21 | Sarah Hannah -8050 | M | train-clean-360 | 22.02 | Jake Woldstad -8051 | F | train-clean-100 | 25.23 | Maria Kasper -8057 | F | train-clean-360 | 16.93 | Linda Dougherty -8058 | M | train-other-500 | 19.53 | RLC -8063 | M | train-clean-100 | 25.08 | Robert Snoza -8066 | M | train-clean-360 | 25.15 | Tim Cote -8071 | F | train-other-500 | 30.22 | Vanessa Garcia -8072 | F | train-other-500 | 8.03 | Kimberly Krause -8075 | F | train-clean-360 | 25.21 | Melora -8080 | F | train-clean-360 | 25.23 | e.a.zokaites -8087 | M | train-other-500 | 30.16 | Arnie Horton -8088 | M | train-clean-100 | 25.06 | Jason Bolestridge -8095 | M | train-clean-100 | 25.03 | Theodulf -8097 | F | train-clean-360 | 25.04 | lewildesen -8098 | M | train-clean-100 | 25.18 | Arnold -8108 | M | train-clean-100 | 25.03 | drakaunus -8112 | F | train-other-500 | 22.66 | Christine Lamberton -8113 | F | train-clean-360 | 25.06 | PennyAnn -8118 | F | train-clean-360 | 25.00 | Katie McClain -8119 | M | train-clean-360 | 25.16 | Malcolm Cameron -8123 | F | train-clean-100 | 25.15 | Sheila Wood -8131 | M | test-other | 10.04 | Christian Alexander -8138 | M | train-clean-360 | 25.20 | Lee Smalley -8142 | M | train-clean-360 | 25.06 | Timothy Lucas -8143 | M | train-other-500 | 30.01 | Nick Whitley -8148 | F | train-other-500 | 28.08 | Xiph -8152 | M | train-clean-360 | 25.20 | Bigcowfeet -8156 | F | train-other-500 | 30.03 | Brooke Cunningham -8163 | F | train-clean-360 | 25.02 | Greengecko -8164 | M | train-other-500 | 23.10 | Rob Board -8168 | F | train-other-500 | 18.41 | Kiera Davidson -8169 | M | train-other-500 | 25.51 | tovarisch -8172 | M | train-other-500 | 16.88 | Alan Weyman -8173 | F | dev-other | 5.23 | emmablob -8176 | M | train-clean-360 | 18.78 | Jon Kerfoot -8180 | F | train-other-500 | 27.70 | Elanor Sakamoto -8183 | F | train-clean-360 | 25.18 | Cheri Jordan -8188 | M | test-other | 10.12 | Matthew Calvin -8190 | F | train-clean-360 | 21.67 | Lisa Phelps Gonzalez -8193 | F | train-clean-360 | 25.23 | helengraves -8194 | F | train-clean-360 | 25.04 | MsMO -8195 | M | train-clean-360 | 25.04 | Mr Krause -8197 | F | train-other-500 | 27.75 | Victoria P -8199 | F | train-other-500 | 26.29 | maryagneskatherine -8200 | M | train-other-500 | 30.02 | Dan S -8208 | M | train-other-500 | 30.08 | zaanta -8215 | M | train-other-500 | 30.23 | readread -8222 | M | train-clean-360 | 25.09 | Greg Golding -8224 | M | test-clean | 8.24 | Leanne Kinkopf -8225 | M | train-clean-360 | 25.09 | Matt Lusher -8226 | M | train-clean-100 | 25.18 | Adam Picot -8228 | F | train-clean-360 | 7.38 | hgal2010 -8230 | M | test-clean | 8.25 | David Jenkins -8238 | F | train-clean-100 | 25.08 | Madam Fickle -8240 | F | train-other-500 | 30.17 | Gertrude Durette -8242 | F | train-other-500 | 30.13 | Anita Slusser -8245 | M | train-other-500 | 24.91 | gscheids -8246 | M | train-other-500 | 18.83 | beeveeo -8250 | M | train-other-500 | 29.44 | Stephen Gibbons -8254 | F | dev-other | 10.05 | Jeana Wei -8259 | F | train-other-500 | 21.68 | Lawrence -8262 | M | train-other-500 | 28.44 | Jack Powell -8266 | M | train-clean-360 | 25.02 | Jeff K. -8272 | F | train-other-500 | 25.07 | Haili -8273 | M | train-other-500 | 30.21 | Lucas Boulding -8280 | F | test-other | 8.15 | AlaynaMay -8288 | M | dev-other | 6.66 | Wayne Donovan -8291 | M | train-other-500 | 30.19 | Elliot Gage -8295 | F | train-other-500 | 30.14 | Susan Morin -8296 | F | train-other-500 | 20.34 | Bria Snow -8297 | M | dev-clean | 8.04 | David Mecionis -8300 | F | train-clean-360 | 24.44 | Judith Parker -8302 | F | train-other-500 | 25.50 | Charlotte Day -8307 | M | train-other-500 | 29.32 | Nick Bulka -8312 | F | train-clean-100 | 25.14 | Jaimie Noy -8316 | M | train-other-500 | 17.30 | Rocket Rodger -8321 | F | train-other-500 | 30.15 | SamR -8322 | M | train-other-500 | 29.61 | yeknod -8324 | F | train-clean-100 | 25.16 | Kathy Wright -8328 | M | train-other-500 | 28.24 | William Gavula -8329 | F | train-clean-360 | 21.14 | Betty Perry -8334 | M | train-other-500 | 26.14 | Doug Reed -8337 | F | train-other-500 | 30.09 | Claudia Salto -8346 | M | train-other-500 | 28.71 | Al Rocca -8347 | M | train-clean-360 | 21.88 | Terry Torres -8356 | M | train-other-500 | 30.16 | Paul Mazumdar -8367 | M | train-other-500 | 24.19 | ophiuroidea -8382 | F | train-other-500 | 26.80 | Claire Schreuder -8388 | F | train-clean-360 | 22.87 | Jacki Horn -8389 | M | train-other-500 | 25.06 | Steven Bateman -8392 | F | train-other-500 | 23.95 | Katharina Huang -8394 | M | train-other-500 | 18.93 | Matthew Walker -8396 | M | train-clean-360 | 25.16 | gloriousjob -8401 | M | train-clean-360 | 24.29 | Alexander Hatton -8404 | F | train-clean-360 | 23.61 | Lynne Ray -8410 | F | train-clean-360 | 25.05 | Shauna Kennett -8413 | M | train-other-500 | 10.28 | PaulMichael1084 -8414 | F | train-other-500 | 12.07 | jtueller -8415 | F | train-other-500 | 23.44 | Rusty Dancer -8419 | M | train-clean-100 | 25.22 | Jon Kissack -8421 | F | train-clean-360 | 20.02 | Jackie Drown -8422 | M | train-other-500 | 30.24 | pjhoury -8424 | F | train-other-500 | 23.87 | Schums -8425 | M | train-clean-100 | 25.16 | Larry Wilson -8430 | F | train-other-500 | 30.02 | shihping -8432 | F | train-other-500 | 10.80 | Emma Joyce -8441 | F | train-other-500 | 23.64 | ryoko -8443 | F | train-other-500 | 22.83 | Marsha Payne -8444 | M | train-other-500 | 29.41 | Anthony Webster -8445 | M | train-other-500 | 30.21 | Brett G. Hirsch -8447 | F | train-other-500 | 17.37 | Anastasiia Solokha -8455 | M | test-clean | 8.03 | thecheops -8459 | M | train-clean-360 | 25.09 | sdaeley17 -8461 | F | test-other | 10.13 | Allie Cingi -8463 | F | test-clean | 8.05 | Michele Fry -8464 | M | train-clean-360 | 18.03 | HappyMiamiDad -8465 | F | train-clean-100 | 24.88 | TinaNygard2 -8466 | M | train-other-500 | 19.38 | Chris Cartwright -8468 | F | train-clean-100 | 25.23 | Jennifer Dorr -8470 | F | train-other-500 | 26.24 | Rebecca Braunert-Plunkett -8474 | M | train-clean-360 | 25.07 | Scott Snowman -8476 | F | train-other-500 | 20.74 | Julie Mansius -8479 | M | train-clean-360 | 14.02 | R.W. Rushing -8490 | M | train-clean-360 | 16.96 | Matt Parker -8494 | M | train-clean-360 | 24.20 | Bill Yallalee -8498 | M | train-clean-360 | 25.10 | Ian Quinlan -8499 | M | train-other-500 | 30.02 | ReadAllDay -8500 | M | train-other-500 | 30.12 | Ravi Shankar -8506 | F | train-clean-360 | 25.03 | Denise Nordell -8527 | M | train-clean-360 | 25.15 | Gary Bohannon -8531 | M | train-other-500 | 19.27 | imenadel -8534 | M | train-clean-360 | 23.94 | Chris Clark -8536 | M | train-other-500 | 29.74 | Jonathan Brubaker -8543 | F | train-other-500 | 25.05 | luckyemma -8544 | F | train-other-500 | 19.21 | Pooja DSr -8545 | F | train-clean-360 | 25.14 | Joanne Rochon -8555 | F | test-clean | 8.03 | Michelle Goode -8565 | M | train-other-500 | 28.92 | Patrick Eaton -8573 | F | train-clean-360 | 25.05 | Paige G -8575 | M | train-clean-360 | 25.04 | Jeremy Robertson -8576 | M | train-other-500 | 18.24 | Phil Schempf -8580 | M | train-clean-100 | 19.82 | Gary Dana -8587 | M | train-other-500 | 25.08 | Drew Johnson -8590 | M | train-other-500 | 27.96 | bobrose -8591 | F | train-clean-360 | 22.02 | Jude Somers -8592 | M | train-clean-360 | 18.66 | Dylan Posa -8605 | F | train-clean-360 | 25.06 | Kate Sterner -8609 | M | train-clean-100 | 25.10 | noblesavage -8619 | M | train-clean-360 | 25.03 | Tad E. -8625 | F | train-other-500 | 30.16 | Ellen Preckel -8629 | M | train-clean-100 | 25.13 | Shivansh Dhar -8630 | M | train-clean-100 | 23.50 | Eduardo -8631 | M | train-other-500 | 30.06 | Edward Kirkby -8632 | M | train-other-500 | 21.05 | Geremia -8635 | M | train-clean-360 | 25.07 | ACBowgus -8643 | M | train-clean-360 | 25.08 | jabc1950 -8644 | F | train-other-500 | 24.78 | Eenae -8664 | F | train-other-500 | 30.20 | Pam Castille -8666 | M | train-other-500 | 25.61 | josembi -8671 | M | train-other-500 | 16.80 | Simon Smoke -8675 | M | train-other-500 | 30.11 | Larry Greene -8677 | F | train-clean-360 | 25.17 | KHand -8678 | F | train-other-500 | 19.40 | Amy -8684 | F | train-clean-360 | 21.46 | Alison Stewart -8687 | M | train-clean-360 | 21.21 | EccentricOwl -8699 | F | train-clean-360 | 22.64 | Jessica Atha -8705 | M | train-clean-360 | 25.00 | dsilber01 -8710 | M | train-other-500 | 28.74 | Ralph Crown -8713 | M | train-clean-360 | 25.23 | Expatriate -8718 | F | train-clean-360 | 25.07 | Deena Rhoads -8722 | F | train-clean-360 | 24.13 | Emily Maynard -8725 | M | train-clean-360 | 25.02 | Gary Ericson -8742 | M | train-clean-360 | 25.03 | Adam Taylor -8747 | M | train-clean-100 | 23.49 | DeanOBuchanan -8753 | M | train-other-500 | 28.87 | Walt Allan -8758 | M | train-clean-360 | 25.05 | Krzysztof Rowinski -8765 | M | train-other-500 | 28.03 | jciesielski -8770 | M | train-clean-100 | 25.13 | Paul Simonin -8771 | F | train-clean-360 | 15.40 | Anna Millard -8772 | M | train-clean-360 | 25.03 | Martin Reyto -8776 | F | train-clean-360 | 21.90 | Taliesin -8778 | F | train-other-500 | 30.25 | Francoise -8786 | M | train-clean-360 | 25.12 | Bruce Kachuk -8791 | M | train-clean-360 | 23.93 | ScottReyonoldsVoice -8797 | M | train-clean-100 | 22.76 | Sean Grabosky -8799 | M | train-other-500 | 29.05 | Peter Tucker -8803 | M | train-other-500 | 23.76 | Ben Lindsey-Clark -8808 | M | train-other-500 | 22.91 | davidpr -8820 | M | train-clean-360 | 25.19 | Ignare -8824 | M | train-clean-360 | 25.21 | Mark Johnston -8825 | F | train-clean-360 | 23.93 | Erin Schellhase -8838 | M | train-clean-100 | 25.06 | Kevin Owens -8842 | F | dev-clean | 8.10 | Mary J -8846 | F | train-other-500 | 30.14 | MariaS -8848 | M | train-clean-360 | 25.12 | Craig Kenneth Bryant -8855 | M | train-clean-360 | 25.01 | Eric Metzler -8867 | F | train-other-500 | 7.58 | sorbet87 -8875 | M | train-clean-360 | 17.77 | David D'Huet -8879 | M | train-clean-360 | 25.07 | Son of the Exiles -8887 | M | train-clean-360 | 21.11 | Andrew Hernandez -8897 | F | train-other-500 | 30.15 | beyondutopia -8975 | F | train-clean-100 | 25.11 | Daisy Flaim -9000 | M | train-other-500 | 27.26 | Ramon Escamilla -9022 | F | train-clean-360 | 25.17 | Claire M -9023 | F | train-clean-360 | 25.19 | P. J. Morgan -9026 | F | train-clean-360 | 21.75 | Tammy Porter diff --git a/speaker/tacotron_mel_e10.pt b/speaker/tacotron_mel_e10.pt deleted file mode 100644 index 0bae17381f301d4f81bae2321e35409fd94d8fbb..0000000000000000000000000000000000000000 --- a/speaker/tacotron_mel_e10.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9799bc6035aa1e555968c1fb2f1ca8b8bb0cdb10f11875cb4cbc1411d811a59b -size 5861083 diff --git a/speaker/train.py b/speaker/train.py deleted file mode 100644 index 89c660f337505d3b84e4973cf472749050bec547..0000000000000000000000000000000000000000 --- a/speaker/train.py +++ /dev/null @@ -1,329 +0,0 @@ -import torch -import torchaudio.datasets as datasets -import torchaudio.transforms as transforms -from speaker.data import SpeakerMelLoader -from speaker.model import SpeakerEncoder -from speaker.utils import get_mapping_array - -from sklearn.manifold import TSNE -from sklearn.decomposition import PCA -from sklearn.metrics import silhouette_score - -from matplotlib import pyplot as plt - -import os -from os import path - -import numpy as np - -diagram_path = 'diagrams' -accuracy_path = 'accuracy' -loss_path = 'loss' -silhouette_path = 'silhouette' -tsne_path = 'tsne' - - -def load_data(directory=".", batch_size=4, format='speaker', utter_per_speaker = 4, mel_type='Tacotron'): - dataset = SpeakerMelLoader(datasets.LIBRISPEECH(directory, download=True), format, utter_per_speaker,mel_type=mel_type) - return torch.utils.data.DataLoader( - dataset, - batch_size, - num_workers=4, - shuffle=True - ) - - -def load_validation(directory=".", batch_size=4, format='speaker', utter_per_speaker = 4, mel_type='Tacotron'): - dataset = SpeakerMelLoader(datasets.LIBRISPEECH(directory, "dev-clean",download=True), format, utter_per_speaker,mel_type=mel_type) - return torch.utils.data.DataLoader( - dataset, - batch_size, - num_workers=4, - shuffle=True - ) - - -def train(speaker_per_batch=4, utter_per_speaker=4, epochs=2, learning_rate=1e-4, mel_type='Tacotron'): - # Init data loader - train_loader = load_data(".", speaker_per_batch, 'speaker', utter_per_speaker,mel_type=mel_type) - valid_loader = load_validation(".", speaker_per_batch, 'speaker', utter_per_speaker,mel_type=mel_type) - - # Device - # Loss calc may run faster on cpu - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - loss_device = torch.device("cpu") - - # Init model - model = SpeakerEncoder(device, loss_device) - optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) - - sil_scores = np.zeros(0) - gender_scores = np.zeros(0) - val_losses = np.zeros(0) - val_accuracy = np.zeros(0) - - gender_mapper = get_mapping_array() - - # Train loop - for e in range(epochs): - print('epoch:', e+1, 'of', epochs) - - model.train() - # train_ids = np.zeros(0) - # train_embeds = np.zeros((0, 256)) - for step, batch in enumerate(train_loader): - #Forward - #inputs: (speaker, utter, mel_len, mel_channel) - speaker_id, inputs = batch - #embed_inputs: (speaker*utter, mel_len, mel_channel) - embed_inputs = inputs.reshape(-1, *(inputs.shape[2:])).to(device) - #embeds: (speaker*utter, embed_dim) - embeds = model(embed_inputs) - #loss_embeds: (speaker, utter, embed_dim) - loss_embeds = embeds.view((speaker_per_batch,utter_per_speaker,-1)).to(loss_device) - loss = model.softmax_loss(loss_embeds) - - if step % 10 == 0: - print('train e{}-s{}:'.format(e + 1, step + 1), 'loss', loss) - - #Backward - model.zero_grad() - loss.backward() - model.gradient_clipping() - optimizer.step() - - # train_ids = np.concatenate((train_ids, np.repeat(speaker_id, inputs.shape[1]))) - # train_embeds = np.concatenate((train_embeds, embeds)) - - model.eval() - loss = 0 - acc = 0 - - valid_ids = np.zeros(0) - valid_embeds = np.zeros((0, 256)) - - for step,batch in enumerate(valid_loader): - with torch.no_grad(): - speaker_id, inputs = batch - embed_inputs = inputs.reshape(-1, *(inputs.shape[2:])).to(device) - embeds = model(embed_inputs) - loss_embeds = embeds.view((speaker_per_batch,utter_per_speaker,-1)).to(loss_device) - loss += model.softmax_loss(loss_embeds) - acc += model.accuracy(loss_embeds) - valid_ids = np.concatenate((valid_ids, np.repeat(speaker_id, inputs.shape[1]))) - valid_embeds = np.concatenate((valid_embeds, embeds.to(loss_device).detach())) - - val_losses = np.concatenate((val_losses, [loss.to(loss_device).detach() / (step + 1)])) - val_accuracy = np.concatenate((val_accuracy, [acc.to(loss_device).detach() / (step + 1)])) - sil_scores = np.concatenate((sil_scores, [silhouette_score(valid_embeds, valid_ids)])) - gender_scores = np.concatenate((gender_scores, [silhouette_score(valid_embeds, gender_mapper[valid_ids.astype('int')])])) - print('valid e{}'.format(e + 1), 'loss', val_losses[-1]) - print('valid e{}'.format(e + 1), 'accuracy', val_accuracy[-1]) - print('silhouette score', sil_scores[-1]) - print('gender silhouette score', gender_scores[-1]) - - plot_speaker_embeddings(valid_embeds, valid_ids, f'tsne_e{e + 1}_speaker.png', f'T-SNE Plot: Epoch {e + 1}') - plot_random_embeddings(valid_embeds, valid_ids, f'tsne_e{e + 1}_random.png', title=f'T-SNE Plot: Epoch {e + 1}') - plot_gender_embeddings(valid_embeds, valid_ids, f'tsne_e{e + 1}_gender.png', f'T-SNE Plot: Epoch {e + 1}') - - save_model(model, path.join('speaker', f'saved_model_e{e + 1}.pt')) - - plt.figure() - plt.title('Silhouette Scores') - plt.xlabel('Epoch') - plt.ylabel('Silhouette Score') - plt.plot(np.arange(e + 1) + 1, sil_scores) - # plt.show() - plt.savefig(path.join(diagram_path, silhouette_path, f'sil_scores_{e + 1}.png')) - plt.close() - - plt.figure() - plt.title('Silhouette Scores over Gender') - plt.xlabel('Epoch') - plt.ylabel('Silhouette Score') - plt.plot(np.arange(e + 1) + 1, gender_scores) - # plt.show() - plt.savefig(path.join(diagram_path, silhouette_path, f'gender_scores_{e + 1}.png')) - plt.close() - - plt.figure() - plt.title('Validation Loss') - plt.xlabel('Epoch') - plt.ylabel('Loss') - plt.plot(np.arange(e + 1) + 1, val_losses) - # plt.show() - plt.savefig(path.join(diagram_path, loss_path, f'val_losses_{e + 1}.png')) - plt.close() - - plt.figure() - plt.title('Validation Accuracy') - plt.xlabel('Epoch') - plt.ylabel('Accuracy') - plt.plot(np.arange(e + 1) + 1, val_accuracy) - # plt.show() - plt.savefig(path.join(diagram_path, accuracy_path, f'val_accuracy_{e + 1}.png')) - plt.close() - - return model - - -def save_model(model, path): - #Save model state to path - torch.save(model.state_dict(),path) - - -def load_model(path, device = None): - #Instantiate Model - if device is None: - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - loss_device = torch.device("cpu") - model = SpeakerEncoder(device, loss_device) - - #Load model state - model.load_state_dict(torch.load(path)) - # Try this if running on multi-gpu setup or running model on cpu - # https://pytorch.org/tutorials/beginner/saving_loading_models.html#saving-loading-model-across-devices - # model.load_state_dict(torch.load(PATH, map_location=device)) - return model - - -def check_model(path): - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - loss_device = torch.device("cpu") - - print('**loading model') - model = load_model(path) - - print('**loading data') - # data = load_data() - data = load_validation() - - print('**running model') - loss_total = 0 - acc_total = 0 - all_ids = np.zeros(0) - all_embeds = np.zeros((0, 256)) - - for step, batch in enumerate(data): - speaker_id, inputs = batch - - print('batch:', step) - embed_inputs = inputs.reshape(-1, *(inputs.shape[2:])).to(device) - embeds = model(embed_inputs) - loss_embeds = embeds.view(*(inputs.shape[:2]),-1).to(loss_device) - loss = model.softmax_loss(loss_embeds) - accuracy = model.accuracy(loss_embeds) - - all_ids = np.concatenate((all_ids, np.repeat(speaker_id, inputs.shape[1]))) - all_embeds = np.concatenate((all_embeds, embeds.to(loss_device).detach())) - - loss_total += loss - acc_total += accuracy - - # print('inputs.shape',inputs.shape) - # print('embed_inputs.embed_inputs',embeds.shape) - # print('embeds.shape',embeds.shape) - # print('loss_embeds.shape',loss_embeds.shape) - # print('loss.shape',loss.shape) - # print('loss',loss) - # print('accuracy',accuracy) - - print('average loss', loss_total / (step+1)) - print('average accuracy', acc_total / (step+1)) - print('silhouette score', silhouette_score(all_embeds, all_ids)) - plot_speaker_embeddings(all_embeds, all_ids, f'tsne_saved_speaker.png', f'T-SNE Plot') - plot_random_embeddings(all_embeds, all_ids, f'tsne_saved_random.png', title=f'T-SNE Plot') - plot_gender_embeddings(all_embeds, all_ids, f'tsne_saved_gender.png', f'T-SNE Plot') - - -def plot_gender_embeddings(embeddings, ids, filename, title='T-SNE Plot'): - # Per https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html - # reducing dimensionality before running TSNE - pca = PCA(50) - reduction = pca.fit_transform(embeddings) - tsne = TSNE(init='pca', learning_rate='auto') - transformed = tsne.fit_transform(reduction) - - gender_mapper = get_mapping_array() - genders = gender_mapper[ids.astype('int')] - females = genders == 1 - males = genders == 2 - - plt.figure() - plt.title(title) - - plt.scatter(transformed[females, 0], transformed[females, 1], label='Female') - plt.scatter(transformed[males, 0], transformed[males, 1], label='Male') - plt.legend() - plt.grid() - # plt.show() - plt.savefig(path.join(diagram_path, tsne_path, filename)) - plt.close() - - -def plot_speaker_embeddings(embeddings, ids, filename, title='T-SNE Plot'): - # Per https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html - # reducing dimensionality before running TSNE - pca = PCA(50) - reduction = pca.fit_transform(embeddings) - tsne = TSNE(init='pca', learning_rate='auto') - transformed = tsne.fit_transform(reduction) - - ids = ids.astype('int') - unique_ids = np.unique(ids) - - plt.figure() - plt.title(f'{title} Speakers') - - for speaker_id in unique_ids: - speaker_idx = ids == speaker_id - plt.scatter(transformed[speaker_idx, 0], transformed[speaker_idx, 1], label=f'Speaker {speaker_id}') - - # plt.legend() - plt.grid() - # plt.show() - plt.savefig(path.join(diagram_path, tsne_path, filename)) - plt.close() - - -def plot_random_embeddings(embeddings, ids, filename, size=15, title='T-SNE Plot Random'): - # Per https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html - # reducing dimensionality before running TSNE - pca = PCA(50) - reduction = pca.fit_transform(embeddings) - tsne = TSNE(init='pca', learning_rate='auto') - transformed = tsne.fit_transform(reduction) - - ids = ids.astype('int') - unique_ids = np.unique(ids) - random_unique_ids = np.random.choice(ids, size=min(size, unique_ids.size), replace=False) - - plt.figure() - - plt.title(f'{title} - {random_unique_ids.size} Speakers') - - for speaker_id in random_unique_ids: - speaker_idx = ids == speaker_id - plt.scatter(transformed[speaker_idx, 0], transformed[speaker_idx, 1], label=f'Speaker {speaker_id}') - - # plt.legend() - plt.grid() - # plt.show() - plt.savefig(path.join(diagram_path, tsne_path, filename)) - plt.close() - - -if __name__ == '__main__': - os.makedirs(diagram_path, exist_ok=True) - os.makedirs(path.join(diagram_path, loss_path), exist_ok=True) - os.makedirs(path.join(diagram_path, accuracy_path), exist_ok=True) - os.makedirs(path.join(diagram_path, tsne_path), exist_ok=True) - os.makedirs(path.join(diagram_path, silhouette_path), exist_ok=True) - # for speaker_id, mel in load_data(): - # print(speaker_id, mel.shape) - - # Might make sense to adjust speaker / utterance per batch, e.g. 64/10 - m = train(epochs=300) - - # save_model(m,'speaker/saved_model.pt') - check_model('speaker/saved_model_e175.pt') diff --git a/speaker/utils.py b/speaker/utils.py deleted file mode 100644 index 0a9624b02c6b3c83bee8f18fc7e6acab28eeeae9..0000000000000000000000000000000000000000 --- a/speaker/utils.py +++ /dev/null @@ -1,28 +0,0 @@ - -import numpy as np - -__mapping_array = None - -with open('speaker/speakers.txt') as speakers: - lines = [] - for line in speakers.readlines(): - if line[0] == ';': - continue - lines.append(line) - - rows = [line.split('|') for line in lines] - - __mapping_list = [(int(row[0].strip()), row[1].strip()) for row in rows] - - max_id = max([speaker_id for (speaker_id, _) in __mapping_list])\ - - __mapping_array = np.zeros(max_id + 1,) - for speaker_id, gender in __mapping_list: - if gender == 'F': - __mapping_array[speaker_id] = 1 - else: - __mapping_array[speaker_id] = 2 - - -def get_mapping_array(): - return np.copy(__mapping_array) diff --git a/speaker_audio/ariana.wav b/speaker_audio/ariana.wav deleted file mode 100644 index 1c2fe7af8cfc4c830b24542c6eaa79645b3766f7..0000000000000000000000000000000000000000 Binary files a/speaker_audio/ariana.wav and /dev/null differ diff --git a/speaker_audio/elon_musk.wav b/speaker_audio/elon_musk.wav deleted file mode 100644 index e306c6aba419042cdf9ab5a580445105d0e888fa..0000000000000000000000000000000000000000 Binary files a/speaker_audio/elon_musk.wav and /dev/null differ diff --git a/speaker_audio/leviOsa.wav b/speaker_audio/leviOsa.wav deleted file mode 100644 index 2f0626815f42ea930dd4cc49cf5e92f1b5c30800..0000000000000000000000000000000000000000 Binary files a/speaker_audio/leviOsa.wav and /dev/null differ diff --git a/speaker_audio/obama.wav b/speaker_audio/obama.wav deleted file mode 100644 index d772b8adabdd3ccdb3e2878b9a81321303e2b655..0000000000000000000000000000000000000000 Binary files a/speaker_audio/obama.wav and /dev/null differ diff --git a/stft.py b/stft.py index 330dac76d3374137e79afad2f65533bf2fd8965e..94709d37d1a81e236bf22e1f51a1efc9e3416ffa 100644 --- a/stft.py +++ b/stft.py @@ -38,9 +38,6 @@ from scipy.signal import get_window from librosa.util import pad_center, tiny from audio_processing import window_sumsquare -use_cuda = torch.cuda.is_available() -device = torch.device('cuda' if use_cuda else 'cpu') - class STFT(torch.nn.Module): """adapted from Prem Seetharaman's https://github.com/pseeth/pytorch-stft""" @@ -67,7 +64,7 @@ class STFT(torch.nn.Module): assert(filter_length >= win_length) # get window and zero center pad it to filter_length fft_window = get_window(window, win_length, fftbins=True) - fft_window = pad_center(fft_window, size=filter_length) + fft_window = pad_center(fft_window, filter_length) fft_window = torch.from_numpy(fft_window).float() # window the bases @@ -127,7 +124,7 @@ class STFT(torch.nn.Module): np.where(window_sum > tiny(window_sum))[0]) window_sum = torch.autograd.Variable( torch.from_numpy(window_sum), requires_grad=False) - window_sum = window_sum.to(device) if magnitude.is_cuda else window_sum + window_sum = window_sum.cuda() if magnitude.is_cuda else window_sum inverse_transform[:, :, approx_nonzero_indices] /= window_sum[approx_nonzero_indices] # scale by hop ratio diff --git a/tacotron_mel_e10.pt b/tacotron_mel_e10.pt deleted file mode 100644 index 0bae17381f301d4f81bae2321e35409fd94d8fbb..0000000000000000000000000000000000000000 --- a/tacotron_mel_e10.pt +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9799bc6035aa1e555968c1fb2f1ca8b8bb0cdb10f11875cb4cbc1411d811a59b -size 5861083 diff --git a/encoder/__init__.py b/text/banana.py similarity index 100% rename from encoder/__init__.py rename to text/banana.py diff --git a/train.py b/train.py index 71412f8316605b9bdd91bff19796c041ae5e01c4..88b09494ce5dfc77e267aacd50c71f22a3ee66f4 100644 --- a/train.py +++ b/train.py @@ -1,12 +1,290 @@ -import torch +import os +import time +import argparse +import math from numpy import finfo +import torch +from distributed import apply_gradient_allreduce +import torch.distributed as dist +from torch.utils.data.distributed import DistributedSampler +from torch.utils.data import DataLoader + from model import Tacotron2 +from data_utils import TextMelLoader, TextMelCollate +from loss_function import Tacotron2Loss +from logger import Tacotron2Logger from hparams import create_hparams + +def reduce_tensor(tensor, n_gpus): + rt = tensor.clone() + dist.all_reduce(rt, op=dist.reduce_op.SUM) + rt /= n_gpus + return rt + + +def init_distributed(hparams, n_gpus, rank, group_name): + assert torch.cuda.is_available(), "Distributed mode requires CUDA." + print("Initializing Distributed") + + # Set cuda device so everything is done on the right GPU. + torch.cuda.set_device(rank % torch.cuda.device_count()) + + # Initialize distributed communication + dist.init_process_group( + backend=hparams.dist_backend, init_method=hparams.dist_url, + world_size=n_gpus, rank=rank, group_name=group_name) + + print("Done initializing distributed") + + +def prepare_dataloaders(hparams): + # Get data, data loaders and collate function ready + trainset = TextMelLoader(hparams.training_files, hparams) + valset = TextMelLoader(hparams.validation_files, hparams) + collate_fn = TextMelCollate(hparams.n_frames_per_step) + + if hparams.distributed_run: + train_sampler = DistributedSampler(trainset) + shuffle = False + else: + train_sampler = None + shuffle = True + + train_loader = DataLoader(trainset, num_workers=1, shuffle=shuffle, + sampler=train_sampler, + batch_size=hparams.batch_size, pin_memory=False, + drop_last=True, collate_fn=collate_fn) + return train_loader, valset, collate_fn + + +def prepare_directories_and_logger(output_directory, log_directory, rank): + if rank == 0: + if not os.path.isdir(output_directory): + os.makedirs(output_directory) + os.chmod(output_directory, 0o775) + logger = Tacotron2Logger(os.path.join(output_directory, log_directory)) + else: + logger = None + return logger + + def load_model(hparams): - model = Tacotron2(hparams) + model = Tacotron2(hparams).cuda() if hparams.fp16_run: model.decoder.attention_layer.score_mask_value = finfo('float16').min + if hparams.distributed_run: + model = apply_gradient_allreduce(model) + + return model + + +def warm_start_model(checkpoint_path, model, ignore_layers): + assert os.path.isfile(checkpoint_path) + print("Warm starting model from checkpoint '{}'".format(checkpoint_path)) + checkpoint_dict = torch.load(checkpoint_path, map_location='cpu') + model_dict = checkpoint_dict['state_dict'] + if len(ignore_layers) > 0: + model_dict = {k: v for k, v in model_dict.items() + if k not in ignore_layers} + dummy_dict = model.state_dict() + dummy_dict.update(model_dict) + model_dict = dummy_dict + model.load_state_dict(model_dict) return model + + +def load_checkpoint(checkpoint_path, model, optimizer): + assert os.path.isfile(checkpoint_path) + print("Loading checkpoint '{}'".format(checkpoint_path)) + checkpoint_dict = torch.load(checkpoint_path, map_location='cpu') + model.load_state_dict(checkpoint_dict['state_dict']) + optimizer.load_state_dict(checkpoint_dict['optimizer']) + learning_rate = checkpoint_dict['learning_rate'] + iteration = checkpoint_dict['iteration'] + print("Loaded checkpoint '{}' from iteration {}" .format( + checkpoint_path, iteration)) + return model, optimizer, learning_rate, iteration + + +def save_checkpoint(model, optimizer, learning_rate, iteration, filepath): + print("Saving model and optimizer state at iteration {} to {}".format( + iteration, filepath)) + torch.save({'iteration': iteration, + 'state_dict': model.state_dict(), + 'optimizer': optimizer.state_dict(), + 'learning_rate': learning_rate}, filepath) + + +def validate(model, criterion, valset, iteration, batch_size, n_gpus, + collate_fn, logger, distributed_run, rank): + """Handles all the validation scoring and printing""" + model.eval() + with torch.no_grad(): + val_sampler = DistributedSampler(valset) if distributed_run else None + val_loader = DataLoader(valset, sampler=val_sampler, num_workers=1, + shuffle=False, batch_size=batch_size, + pin_memory=False, collate_fn=collate_fn) + + val_loss = 0.0 + for i, batch in enumerate(val_loader): + x, y = model.parse_batch(batch) + y_pred = model(x) + loss = criterion(y_pred, y) + if distributed_run: + reduced_val_loss = reduce_tensor(loss.data, n_gpus).item() + else: + reduced_val_loss = loss.item() + val_loss += reduced_val_loss + val_loss = val_loss / (i + 1) + + model.train() + if rank == 0: + print("Validation loss {}: {:9f} ".format(iteration, val_loss)) + logger.log_validation(val_loss, model, y, y_pred, iteration) + + +def train(output_directory, log_directory, checkpoint_path, warm_start, n_gpus, + rank, group_name, hparams): + """Training and validation logging results to tensorboard and stdout + + Params + ------ + output_directory (string): directory to save checkpoints + log_directory (string) directory to save tensorboard logs + checkpoint_path(string): checkpoint path + n_gpus (int): number of gpus + rank (int): rank of current gpu + hparams (object): comma separated list of "name=value" pairs. + """ + if hparams.distributed_run: + init_distributed(hparams, n_gpus, rank, group_name) + + torch.manual_seed(hparams.seed) + torch.cuda.manual_seed(hparams.seed) + + model = load_model(hparams) + learning_rate = hparams.learning_rate + optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, + weight_decay=hparams.weight_decay) + + if hparams.fp16_run: + from apex import amp + model, optimizer = amp.initialize( + model, optimizer, opt_level='O2') + + if hparams.distributed_run: + model = apply_gradient_allreduce(model) + + criterion = Tacotron2Loss() + + logger = prepare_directories_and_logger( + output_directory, log_directory, rank) + + train_loader, valset, collate_fn = prepare_dataloaders(hparams) + + # Load checkpoint if one exists + iteration = 0 + epoch_offset = 0 + if checkpoint_path is not None: + if warm_start: + model = warm_start_model( + checkpoint_path, model, hparams.ignore_layers) + else: + model, optimizer, _learning_rate, iteration = load_checkpoint( + checkpoint_path, model, optimizer) + if hparams.use_saved_learning_rate: + learning_rate = _learning_rate + iteration += 1 # next iteration is iteration + 1 + epoch_offset = max(0, int(iteration / len(train_loader))) + + model.train() + is_overflow = False + # ================ MAIN TRAINNIG LOOP! =================== + for epoch in range(epoch_offset, hparams.epochs): + print("Epoch: {}".format(epoch)) + for i, batch in enumerate(train_loader): + start = time.perf_counter() + for param_group in optimizer.param_groups: + param_group['lr'] = learning_rate + + model.zero_grad() + x, y = model.parse_batch(batch) + y_pred = model(x) + + loss = criterion(y_pred, y) + if hparams.distributed_run: + reduced_loss = reduce_tensor(loss.data, n_gpus).item() + else: + reduced_loss = loss.item() + if hparams.fp16_run: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + if hparams.fp16_run: + grad_norm = torch.nn.utils.clip_grad_norm_( + amp.master_params(optimizer), hparams.grad_clip_thresh) + is_overflow = math.isnan(grad_norm) + else: + grad_norm = torch.nn.utils.clip_grad_norm_( + model.parameters(), hparams.grad_clip_thresh) + + optimizer.step() + + if not is_overflow and rank == 0: + duration = time.perf_counter() - start + print("Train loss {} {:.6f} Grad Norm {:.6f} {:.2f}s/it".format( + iteration, reduced_loss, grad_norm, duration)) + logger.log_training( + reduced_loss, grad_norm, learning_rate, duration, iteration) + + if not is_overflow and (iteration % hparams.iters_per_checkpoint == 0): + validate(model, criterion, valset, iteration, + hparams.batch_size, n_gpus, collate_fn, logger, + hparams.distributed_run, rank) + if rank == 0: + checkpoint_path = os.path.join( + output_directory, "checkpoint_{}".format(iteration)) + save_checkpoint(model, optimizer, learning_rate, iteration, + checkpoint_path) + + iteration += 1 + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-o', '--output_directory', type=str, + help='directory to save checkpoints') + parser.add_argument('-l', '--log_directory', type=str, + help='directory to save tensorboard logs') + parser.add_argument('-c', '--checkpoint_path', type=str, default=None, + required=False, help='checkpoint path') + parser.add_argument('--warm_start', action='store_true', + help='load model weights only, ignore specified layers') + parser.add_argument('--n_gpus', type=int, default=1, + required=False, help='number of gpus') + parser.add_argument('--rank', type=int, default=0, + required=False, help='rank of current gpu') + parser.add_argument('--group_name', type=str, default='group_name', + required=False, help='Distributed group name') + parser.add_argument('--hparams', type=str, + required=False, help='comma separated name=value pairs') + + args = parser.parse_args() + hparams = create_hparams(args.hparams) + + torch.backends.cudnn.enabled = hparams.cudnn_enabled + torch.backends.cudnn.benchmark = hparams.cudnn_benchmark + + print("FP16 Run:", hparams.fp16_run) + print("Dynamic Loss Scaling:", hparams.dynamic_loss_scaling) + print("Distributed Run:", hparams.distributed_run) + print("cuDNN Enabled:", hparams.cudnn_enabled) + print("cuDNN Benchmark:", hparams.cudnn_benchmark) + + train(args.output_directory, args.log_directory, args.checkpoint_path, + args.warm_start, args.n_gpus, args.rank, args.group_name, hparams) diff --git a/utils.py b/utils.py index c8485ba863142f933fccbe708f52fb6a2d76b0b8..43952018447c94684b3821b759aa50e001c0bd1b 100644 --- a/utils.py +++ b/utils.py @@ -2,12 +2,10 @@ import numpy as np from scipy.io.wavfile import read import torch -use_cuda = torch.cuda.is_available() -device = torch.device('cuda' if use_cuda else 'cpu') def get_mask_from_lengths(lengths): max_len = torch.max(lengths).item() - ids = torch.arange(0, max_len, out=torch.cuda.LongTensor(max_len) if use_cuda else torch.LongTensor(max_len)) + ids = torch.arange(0, max_len, out=torch.cuda.LongTensor(max_len)) mask = (ids < lengths.unsqueeze(1)).bool() return mask