Tensorflowtts: Error Preprocessing KeyError: 'eos'

Created on 19 Aug 2020  ·  52Comments  ·  Source: TensorSpeech/TensorFlowTTS

I am getting this error when trying to preprocess:

Traceback (most recent call last):
File "/home/zak/venv/bin/tensorflow-tts-preprocess", line 8, in
sys.exit(preprocess())
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow_tts/bin/preprocess.py", line 442, in preprocess
for result, mel, energy, f0, features in train_map:
File "/usr/lib/python3.8/multiprocessing/pool.py", line 448, in
return (item for chunk in result for item in chunk)
File "/usr/lib/python3.8/multiprocessing/pool.py", line 865, in next
raise value
KeyError: 'eos'

I didn't have this error before the latest updates, after I re installed the TensorflowTTs again and tried to preprocess I got this. any Ideas ?

Thanks

bug 🐛

Most helpful comment

@dathudeptrai normalization worked and training also worked, thanks

Highly appreciated

All 52 comments

@Zak-SA ah sorry :))). I forgot that you need to change the symbols a bit. Eos token should be 'eos' and padding token should be 'pad'.

211

@dathudeptrai ohh. My bad didn't pay attention to this. The processor is one of the few I used from the old training. Thanks. It worked

@dathudeptrai ohh. My bad didn't pay attention to this. The processor is one of the few I used from the old training. Thanks. It worked

let replace ur old processor with the new one. The new processor is more flexible and can be load from file :D.

@dathudeptrai after succesfully preprocessing I am getting this error when trying to train

Traceback (most recent call last):
File "examples/tacotron2/train_tacotron2.py", line 473, in
main()
File "examples/tacotron2/train_tacotron2.py", line 370, in main
train_dataset = CharactorMelDataset(
File "./examples/tacotron2/tacotron_dataset.py", line 93, in __init__
assert len(mel_files) != 0, f"Not found any mels files in ${root_dir}."
AssertionError: Not found any mels files in $./dump/train/.

@Zak-SA maybe folder name is changed :)). is there any folder name ./dump/train ?

@dathudeptrai yes I have the folder/dump/train and it have the preprocessed files when I preprocessed I used the name dump only without the speaker and I also tried adding the speaker name but the same issue

@dathudeptrai yes I have the folder/dump/train and it have the preprocessed files when I preprocessed I used the name dump only without the speaker and I also tried adding the speaker name but the same issue

the bug is clearly, "There is no any mels file in the ./dump/train". Can you check by yourself ? . Did you normalize the mels and did you pass the use-norm 1 as command line ?

@dathudeptrai I just noticed that no files got normalized , the result for normalization came as :+1: 2020-08-18 23:28:12,704 (preprocess:525) INFO: Files to normalize: 0

@dathudeptrai I just noticed that no files got normalized , the result for normalization came as 2020-08-18 23:28:12,704 (preprocess:525) INFO: Files to normalize: 0
[Normalizing]: 0it [00:00, ?it/s]

let copy and pass the command line u use to preprocessing ur data here. (include the tensorflow-tts-preprocess and tensorflow-tts-normalize)

@dathudeptrai

preprocess:
tensorflow-tts-preprocess --rootdir ./dataset --outdir ./dump_ZAKspeech --config preprocess/ZAKspeech_preprocess.yaml --dataset ZAKspeech

Normalize:
tensorflow-tts-normalize --rootdir ./datasets --outdir ./dump_ZAKspeech --config preprocess/ZAKspeech_preprocess.yaml --dataset ZAKspeech

@Zak-SA change to tensorflow-tts-normalize --rootdir ./dump_ZAKspeech .... Just commit https://github.com/TensorSpeech/TensorFlowTTS/commit/5f21de976467a20e6e4d58a18f23f315ce743a1a. Also you should change the dump on tacotron-2 command line to dump_ZAKspeech in ur case.

@dathudeptrai normalization worked and training also worked, thanks

Highly appreciated

@dathudeptrai I had a question, so I installed the 2080 super that have 8gb memory, I am getting about 8 seconds per step when training Tacotron2. Is that normal? And I also get oom sometimes.

@Zak-SA not normal, my training time is around 3.5s/1steps. Can you check ur config file if use_fixed_shapes is true or false. Let try both to see what is the best config for you. Also, the training need around 200 steps to get the fastest training speed. Normally when i train tacotron-2, the training speed is 7s at the begining then drop to 3.5s and stable after 200-300 steps :D.

@dathudeptrai ok, the current value for use_fixed_shapes is false. I will try true and let you know. What's the effect on this parameter on the training?

@dathudeptrai ok, the current value for use_fixed_shapes is false. I will try true and let you know. What's the effect on this parameter on the training?

please read the readme in tacotron example dir. https://github.com/TensorSpeech/TensorFlowTTS/tree/master/examples/tacotron2#some-important-notes.

@dathudeptrai
I am trying use_fixed_shapes=true

Meanwhile i also wanted to ask you about MB Melgan training. I can only use batch size 32 and disable the cash in order to let it get pass step 5k which is when it starts eval. I can't use cash and I can't use batch size 64. Any ideas?

@dathudeptrai
so when I tried use_fixed_shapes=true I got 4 seconds per step after step 300
when I used use_fixed shapes=false I got 9 seconds but the training crashed at step 97 with this OOM:

Traceback (most recent call last):
File "examples/tacotron2/train_tacotron2.py", line 473, in
main()
File "examples/tacotron2/train_tacotron2.py", line 461, in main
trainer.fit(
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow_tts/trainers/base_trainer.py", line 852, in fit
self.run()
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow_tts/trainers/base_trainer.py", line 101, in run
self._train_epoch()
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow_tts/trainers/base_trainer.py", line 123, in _train_epoch
self._train_step(batch)
File "examples/tacotron2/train_tacotron2.py", line 109, in _train_step
self.one_step_forward(batch)
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 780, in __call__
result = self._call(args, *kwds)
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 807, in _call
return self._stateless_fn(args, *kwds) # pylint: disable=not-callable
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 2829, in __call__
return graph_function._filtered_call(args, kwargs) # pylint: disable=protected-access
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 1843, in _filtered_call
return self._call_flat(
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 1923, in _call_flat
return self._build_call_outputs(self._inference_function.call(
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 545, in call
outputs = execute.execute(
File "/home/zak/venv/lib/python3.8/site-packages/tensorflow/python/eager/execute.py", line 59, in quick_execute
tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[32,860,512] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
[[node tacotron2/post_net/tf_tacotron_conv_batch_norm_9/dropout_._4/dropout/random_uniform/RandomUniform (defined at /home/zak/venv/lib/python3.8/site-packages/tensorflow_tts/models/tacotron2.py:99) ]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
[Op:__inference__one_step_forward_248221]

Function call stack:
_one_step_forward

@Zak-SA Have you tried lowering the batch size in Tacotron 2 config?

@ZDisket no I didn't, I used batch size 32 for tacotron 2 . But previously I didn't have issues with tacotron 2 training except the slow training. Today is the first time I am getting errors.
But I lowered the batch size in MB Melgan training to 32 instead of 64 and its working because i never had luck with batch size 64.

@ZDisket should i try batch size 16 for Tacotron 2?

@Zak-SA Try 16, if it works increase it a bit, say 24, and see what your GPU can fit.

@ZDisket with use_fixed_shapes= true or false?

@Zak-SA let lowering batch_size to 24 or 16, that's still fine. or you can change the version of tensorflow. I do not know if 2.3 is better than 2.2 or not :)).

@dathudeptrai are we talking about Tacotron 2 or MB Melgan?
And for Tacoteon 2 if I use_fixed_shapes =true with batch size 32 I get about 4 seconds per step with no OOM. So should I use the fixed shapes true?
And my problem was with MB Melgan which 8 can only use batxh size 32 and not 64

@dathudeptrai are we talking about Tacotron 2 or MB Melgan?
And for Tacoteon 2 if I use_fixed_shapes =true with batch size 32 I get about 4 seconds per step with no OOM. So should I use the fixed shapes true?
And my problem was with MB Melgan which 8 can only use batxh size 32 and not 64

if use_fixed_shapes = True is faster and can use batch_size = 32 so let use it :)). it's weird when some people said that set it to false is better than set it to true :)), but in my case, true is faster :)). MB-melgan batch_size 32 is also ok :)).

@dathudeptrai thanks again. You are great help.

@dathudeptrai I am trying to use realtime E2E-TTS and I am not getting any audio, but no error reported, I am getting alignment diagram and Predicted-Mel-After Spectrogram but no audio, any ideas?

@dathudeptrai with Notebooks I am getting this errorL

[[node encoder/conv_batch_norm/tf_tacotron_conv_batch_norm/conv_._0/conv1d (defined at /home/zak/venv/lib/python3.8/site-packages/tensorflow_tts/models/tacotron2.py:96) ]]
0 successful operations.
0 derived errors ignored. [Op:__inference_inference_9850]

Function call stack:
inference -> inference

@dathudeptrai with Notebooks I am getting this errorL

[[node encoder/conv_batch_norm/tf_tacotron_conv_batch_norm/conv_._0/conv1d (defined at /home/zak/venv/lib/python3.8/site-packages/tensorflow_tts/models/tacotron2.py:96) ]]
0 successful operations.
0 derived errors ignored. [Op:__inference_inference_9850]

Function call stack:
inference -> inference

THe log tell nothing :(

@dathudeptrai I am trying to use realtime E2E-TTS and I am not getting any audio, but no error reported, I am getting alignment diagram and Predicted-Mel-After Spectrogram but no audio, any ideas?

what colab you used ?

I solved the error above for notebooks by setting TF_FORCE_GPU_ALLOW_GROWTH to true, but still not being able to get audio. would appreciate the help.

@dathudeptrai I am trying now with notebooks, downgraded to tensorflow-gpu==2.2 and set the TF_FORCE_GPU_ALLOW_GROWTH to true to solve the bug with tensorflow-gpu 2+ but still not being able to get audio files

@dathudeptrai I couldn't use colab because I am using customized data. all what i need to do is toi generate audio using my trained tacotron2 and trained mb_melgan

@dathudeptrai I couldn't use colab because I am using customized data. all what i need to do is toi generate audio using my trained tacotron2 and trained mb_melgan

can you send me ur code ?, the code to load model and do inference.

@dathudeptrai Do you want me to paste it here?

@dathudeptrai so I tried multiple attempts, I will share them all. appreciate your help

trying mb_melgan:

import yaml
import numpy as np
import matplotlib.pyplot as plt

import tensorflow as tf

from tensorflow_tts.inference import AutoConfig
from tensorflow_tts.inference import TFAutoModel

config = AutoConfig.from_pretrained("./examples/multiband_melgan/conf/multiband_melgan.v1.yaml")
mb_melgan = TFAutoModel.from_pretrained(
config=config,
pretrained_path=None, # "./examples/tacotron2/exp/train.tacotron2.v1/checkpoints/model-16000.h5",
is_build=False, # don't build model if you want to save it to pb. (TF related bug)
name="mb_melgan"
)

fake_mels = tf.random.uniform(shape=[4, 256, 80], dtype=tf.float32)
audios = mb_melgan.inference(fake_mels)

mb_melgan.load_weights("./examples/multiband_melgan/exp/train.multiband_melgan.v1/checkpoints/generator-940000.h5")

tf.saved_model.save(mb_melgan, "./mb_melgan", signatures=mb_melgan.inference)

mb_melgan = tf.saved_model.load("./mb_melgan")

mels = np.load("./dump_ZAKspeech/valid/norm-feats/38-norm-feats.npy")

audios = mb_melgan.inference(mels[None, ...])

plt.plot(audios[0, :, 0])

@dathudeptrai
Tacotron2

import yaml
import numpy as np
import matplotlib.pyplot as plt

import tensorflow as tf

from tensorflow_tts.inference import AutoConfig
from tensorflow_tts.inference import TFAutoModel
from tensorflow_tts.inference import AutoProcessor

import IPython.display as ipd

processor = AutoProcessor.from_pretrained("./dump_ZAKspeech/ZAKspeech_mapper.json")

input_text = "وفي مقدمتها لقاح شلل الأطفال.."
input_ids = processor.text_to_sequence(input_text)

config = AutoConfig.from_pretrained("./examples/tacotron2/conf/tacotron2.v1.yaml")
tacotron2 = TFAutoModel.from_pretrained(
config=config,
pretrained_path=None,
is_build=False, # don't build model if you want to save it to pb. (TF related bug)
name="tacotron2"
)

tacotron2.setup_window(win_front=6, win_back=6)
tacotron2.setup_maximum_iterations(3000)

decoder_output, mel_outputs, stop_token_prediction, alignment_history = tacotron2.inference(
input_ids=tf.expand_dims(tf.convert_to_tensor(input_ids, dtype=tf.int32), 0),
input_lengths=tf.convert_to_tensor([len(input_ids)], tf.int32),
speaker_ids=tf.convert_to_tensor([0], dtype=tf.int32),
)

tacotron2.load_weights("./examples/tacotron2/exp/train.tacotron2.v1/checkpoints/model-14000.h5")

save model into pb and do inference. Note that signatures should be a tf.function with input_signatures.

tf.saved_model.save(tacotron2, "./test_saved", signatures=tacotron2.inference)

tacotron2 = tf.saved_model.load("./test_saved")

input_text = "مواقعهم الجبلية شمال ."
input_ids = processor.text_to_sequence(input_text)

decoder_output, mel_outputs, stop_token_prediction, alignment_history = tacotron2.inference(
tf.expand_dims(tf.convert_to_tensor(input_ids, dtype=tf.int32), 0),
tf.convert_to_tensor([len(input_ids)], tf.int32),
tf.convert_to_tensor([0], dtype=tf.int32)
)

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111)
ax.set_title(f'Alignment steps')
im = ax.imshow(
alignment_history[0].numpy(),
aspect='auto',
origin='lower',
interpolation='none')
fig.colorbar(im, ax=ax)
xlabel = 'Decoder timestep'
plt.xlabel(xlabel)
plt.ylabel('Encoder timestep')
plt.tight_layout()
plt.show()
plt.close()

mel_outputs = tf.reshape(mel_outputs, [-1, 80]).numpy()
fig = plt.figure(figsize=(10, 8))
ax1 = fig.add_subplot(311)
ax1.set_title(f'Predicted Mel-after-Spectrogram')
im = ax1.imshow(np.rot90(mel_outputs), aspect='auto', interpolation='none')
fig.colorbar(mappable=im, shrink=0.65, orientation='horizontal', ax=ax1)
plt.show()
plt.close()

input_text = "ورأوا أضواء في السماء بالتزامن مع إعلان وزارة الدفاع التركية انطلاق عملية مخلب النسر "
input_ids = processor.text_to_sequence(input_text)

decoder_output, mel_outputs, stop_token_prediction, alignment_history = tacotron2.inference(
tf.expand_dims(tf.convert_to_tensor(input_ids, dtype=tf.int32), 0),
tf.convert_to_tensor([len(input_ids)], tf.int32),
tf.convert_to_tensor([0], dtype=tf.int32),
)

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111)
ax.set_title(f'Alignment steps')
im = ax.imshow(
alignment_history[0].numpy(),
aspect='auto',
origin='lower',
interpolation='none')
fig.colorbar(im, ax=ax)
xlabel = 'Decoder timestep'
plt.xlabel(xlabel)
plt.ylabel('Encoder timestep')
plt.tight_layout()
plt.show()
plt.close()

mel_outputs = tf.reshape(mel_outputs, [-1, 80]).numpy()
fig = plt.figure(figsize=(10, 8))
ax1 = fig.add_subplot(311)
ax1.set_title(f'Predicted Mel-after-Spectrogram')
im = ax1.imshow(np.rot90(mel_outputs), aspect='auto', interpolation='none')
fig.colorbar(mappable=im, shrink=0.65, orientation='horizontal', ax=ax1)
plt.show()
plt.close()

@dathudeptrai loading tacotron2 and mb_melgan

import tensorflow as tf

import yaml
import numpy as np
import matplotlib.pyplot as plt

import IPython.display as ipd

from tensorflow_tts.inference import TFAutoModel
from tensorflow_tts.inference import AutoConfig
from tensorflow_tts.inference import AutoProcessor

tacotron2_config = AutoConfig.from_pretrained('./examples/tacotron2/conf/tacotron2.v1.yaml')
tacotron2 = TFAutoModel.from_pretrained(
config=tacotron2_config,
pretrained_path="./examples/tacotron2/exp/train.tacotron2.v1/checkpoints/model-14000.h5",
training=False,
name="tacotron2"
)

mb_melgan_config = AutoConfig.from_pretrained('./examples/multiband_melgan/conf/multiband_melgan.v1.yaml')
mb_melgan = TFAutoModel.from_pretrained(
config=mb_melgan_config,
pretrained_path="./examples/multiband_melgan/exp/train.multiband_melgan.v1/checkpoints/generator-940000.h5",
name="mb_melgan"
)

processor = AutoProcessor.from_pretrained(pretrained_path="./dump_ZAKspeech/ZAKspeech_mapper.json")

def do_synthesis(input_text, text2mel_model, vocoder_model, text2mel_name, vocoder_name):
input_ids = processor.text_to_sequence(input_text)

# text2mel part
if text2mel_name == "TACOTRON":
_, mel_outputs, stop_token_prediction, alignment_history = text2mel_model.inference(
tf.expand_dims(tf.convert_to_tensor(input_ids, dtype=tf.int32), 0),
tf.convert_to_tensor([len(input_ids)], tf.int32),
tf.convert_to_tensor([0], dtype=tf.int32)
)
elif text2mel_name == "FASTSPEECH":
mel_before, mel_outputs, duration_outputs = text2mel_model.inference(
input_ids=tf.expand_dims(tf.convert_to_tensor(input_ids, dtype=tf.int32), 0),
speaker_ids=tf.convert_to_tensor([0], dtype=tf.int32),
speed_ratios=tf.convert_to_tensor([1.0], dtype=tf.float32),
)
elif text2mel_name == "FASTSPEECH2":
mel_before, mel_outputs, duration_outputs, _, _ = text2mel_model.inference(
tf.expand_dims(tf.convert_to_tensor(input_ids, dtype=tf.int32), 0),
speaker_ids=tf.convert_to_tensor([0], dtype=tf.int32),
speed_ratios=tf.convert_to_tensor([1.0], dtype=tf.float32),
f0_ratios=tf.convert_to_tensor([1.0], dtype=tf.float32),
energy_ratios=tf.convert_to_tensor([1.0], dtype=tf.float32),
)
else:
raise ValueError("Only TACOTRON, FASTSPEECH, FASTSPEECH2 are supported on text2mel_name")

# vocoder part
if vocoder_name == "MELGAN" or vocoder_name == "MELGAN-STFT":
audio = vocoder_model(mel_outputs)[0, :, 0]
elif vocoder_name == "MB-MELGAN":
audio = vocoder_model(mel_outputs)[0, :, 0]
else:
raise ValueError("Only MELGAN, MELGAN-STFT and MB_MELGAN are supported on vocoder_name")

if text2mel_name == "TACOTRON":
return mel_outputs.numpy(), alignment_history.numpy(), audio.numpy()
else:
return mel_outputs.numpy(), audio.numpy()

def visualize_attention(alignment_history):
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111)
ax.set_title(f'Alignment steps')
im = ax.imshow(
alignment_history,
aspect='auto',
origin='lower',
interpolation='none')
fig.colorbar(im, ax=ax)
xlabel = 'Decoder timestep'
plt.xlabel(xlabel)
plt.ylabel('Encoder timestep')
plt.tight_layout()
plt.show()
plt.close()

def visualize_mel_spectrogram(mels):
mels = tf.reshape(mels, [-1, 80]).numpy()
fig = plt.figure(figsize=(10, 8))
ax1 = fig.add_subplot(311)
ax1.set_title(f'Predicted Mel-after-Spectrogram')
im = ax1.imshow(np.rot90(mels), aspect='auto', interpolation='none')
fig.colorbar(mappable=im, shrink=0.65, orientation='horizontal', ax=ax1)
plt.show()
plt.close()

input_text = "أصوات انفجارات"

# setup window for tacotron2 if you want to try
tacotron2.setup_window(win_front=10, win_back=10)

mels, alignment_history, audios = do_synthesis(input_text, tacotron2, mb_melgan, "TACOTRON", "MB-MELGAN")
visualize_attention(alignment_history[0])
visualize_mel_spectrogram(mels[0])
ipd.Audio(audios, rate=22050)

@Zak-SA not yet see the bug. Can you tell me where the code show the bug ?

@dathudeptrai now I don't have a bug, but no audio generated or saved. after running the tacotron2 code I get "test_saved" folder with:
|- test_saved/
| |- saved_model.pb
| |-assets/ (empty)
| |-variables/
| |- variables.data-00000-of-00002
| |-variables.data-00001-of-00002
| |-variables.index

and for mb_melgan:
|- tmb_melgan/
| |- saved_model.pb
| |-assets/ (empty)
| |-variables/
| |- variables.data-00000-of-00002
| |-variables.data-00001-of-00002
| |-variables.index

but no audio

@Zak-SA the code didn't save an audios to file. you can see this line of code ipd.Audio(audios, rate=22050), it play audio directly in the notebook, if you want to save it into file, let try this line after:

import soundfile as sf

sf.write("./audio_test.wav", audios, 22050, "PCM_16") 

@dathudeptrai it worked , Great!
but I noticed that the generated audio is 46 second, the text is only 5 seconds but it keeps mumbling for about 40 second. will this improve when I get more training steps or I need to change something?

Thank you so much

@dathudeptrai it worked , Great!
but I noticed that the generated audio is 46 second, the text is only 5 seconds but it keeps mumbling for about 40 second. will this improve when I get more training steps or I need to change something?

Thank you so much

ur tacotron is 14k Steps, you need to train around 80k steps if you want to use it for real inference.

@dathudeptrai that what I though too, but in the previous tacotron2 recipes I didn't have this issue, I will re install tensorflow-gpu==2.3 and resume training, thanks again for you help

@dathudeptrai I noticed when training mb_melgan that there is silence space in the waveform. please see attached, is this normal?
3

@dathudeptrai I noticed when training mb_melgan that there is silence space in the waveform. please see attached, is this normal?
3

that is a padding part, normal :)). it won't happend in real inference.

@dathudeptrai can you help me by pointing to the tutorial to convert tacotron2 and mb-melgan to tflite and use the android example?

By the way the results of tacotron2 training is improving. Highly appreciate your help.

@dathudeptrai can you help me by pointing to the tutorial to convert tacotron2 and mb-melgan to tflite and use the android example?

By the way the results of tacotron2 training is improving. Highly appreciate your help.

the notebook to covert fastspeech and tacotron2 is here (https://github.com/TensorSpeech/TensorFlowTTS/tree/master/notebooks). For mb-megan you can do the same. About android example, please read code here (https://github.com/TensorSpeech/TensorFlowTTS/tree/master/examples/android). Tacotron-2 android example is not supported yet, you can write it by urself :)). I'm not a person maintain android code for some reason, if you have any question about it, you can create new issue then other people can help :D.

@dathudeptrai thank you so much

@dathudeptrai
i took quick look at the code to convert Tacotron2 to tflite, should I do the same for mb-melgan by modifing the code and replacing tacotron2 with mb-melgan in the convert step?

Was this page helpful?
0 / 5 - 0 ratings

Related issues

learnerkun picture learnerkun  ·  5Comments

ZDisket picture ZDisket  ·  10Comments

ming024 picture ming024  ·  6Comments

DanBigioi picture DanBigioi  ·  5Comments

DanBigioi picture DanBigioi  ·  4Comments